/ Hex Artifact Content
Login

Artifact 48356cb434928994ce3c0aac2a6d95e80722c7b3:


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 32  : pager.c,v 1.12
0350: 39 20 32 30 30 34 2f 30 36 2f 31 36 20 30 37 3a  9 2004/06/16 07:
0360: 34 35 3a 32 34 20 64 61 6e 69 65 6c 6b 31 39 37  45:24 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 3b 0a 20 20 69 6e 74 20 6e 61 6d 65 4c 65 6e  e;.  int nameLen
a020: 3b 0a 20 20 4f 73 46 69 6c 65 20 66 64 3b 0a 20  ;.  OsFile fd;. 
a030: 20 69 6e 74 20 72 63 2c 20 69 3b 0a 20 20 69 6e   int rc, i;.  in
a040: 74 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 6e  t tempFile;.  in
a050: 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69  t memDb = 0;.  i
a060: 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b  nt readOnly = 0;
a070: 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51  .  char zTemp[SQ
a080: 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49  LITE_TEMPNAME_SI
a090: 5a 45 5d 3b 0a 0a 20 20 2a 70 70 50 61 67 65 72  ZE];..  *ppPager
a0a0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69   = 0;.  if( sqli
a0b0: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
a0c0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
a0d0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
a0e0: 7d 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  }.  if( zFilenam
a0f0: 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
a100: 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ] ){.    if( str
a110: 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a  cmp(zFilename,":
a120: 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a  memory:")==0 ){.
a130: 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b        memDb = 1;
a140: 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68  .      zFullPath
a150: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c  name = sqliteMal
a160: 6c 6f 63 28 34 29 3b 0a 20 20 20 20 20 20 69 66  loc(4);.      if
a170: 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  ( zFullPathname 
a180: 29 20 73 74 72 63 70 79 28 7a 46 75 6c 6c 50 61  ) strcpy(zFullPa
a190: 74 68 6e 61 6d 65 2c 20 22 22 29 3b 0a 20 20 20  thname, "");.   
a1a0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
a1b0: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
a1c0: 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d      zFullPathnam
a1d0: 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c  e = sqlite3OsFul
a1e0: 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e  lPathname(zFilen
a1f0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ame);.      rc =
a200: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
a210: 61 64 57 72 69 74 65 28 7a 46 75 6c 6c 50 61 74  adWrite(zFullPat
a220: 68 6e 61 6d 65 2c 20 26 66 64 2c 20 26 72 65 61  hname, &fd, &rea
a230: 64 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 74 65  dOnly);.      te
a240: 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20  mpFile = 0;.    
a250: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
a260: 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
a270: 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c  _opentemp(zTemp,
a280: 20 26 66 64 29 3b 0a 20 20 20 20 7a 46 69 6c 65   &fd);.    zFile
a290: 6e 61 6d 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20  name = zTemp;.  
a2a0: 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20    zFullPathname 
a2b0: 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
a2c0: 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d  athname(zFilenam
a2d0: 65 29 3b 0a 20 20 20 20 74 65 6d 70 46 69 6c 65  e);.    tempFile
a2e0: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 1;.  }.  if( 
a2f0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
a300: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
a310: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
a320: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
a330: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a340: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c   sqliteFree(zFul
a350: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
a360: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
a370: 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 6e 61  NTOPEN;.  }.  na
a380: 6d 65 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a  meLen = strlen(z
a390: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
a3a0: 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65   pPager = sqlite
a3b0: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  Malloc( sizeof(*
a3c0: 70 50 61 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65  pPager) + nameLe
a3d0: 6e 2a 33 20 2b 20 33 30 20 29 3b 0a 20 20 69 66  n*3 + 30 );.  if
a3e0: 28 20 70 50 61 67 65 72 3d 3d 30 20 29 7b 0a 20  ( pPager==0 ){. 
a3f0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
a400: 65 28 26 66 64 29 3b 0a 20 20 20 20 73 71 6c 69  e(&fd);.    sqli
a410: 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  teFree(zFullPath
a420: 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  name);.    retur
a430: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
a440: 20 20 7d 0a 20 20 53 45 54 5f 50 41 47 45 52 28    }.  SET_PAGER(
a450: 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
a460: 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28  r->zFilename = (
a470: 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b 31 5d  char*)&pPager[1]
a480: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  ;.  pPager->zDir
a490: 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65 72  ectory = &pPager
a4a0: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65  ->zFilename[name
a4b0: 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72  Len+1];.  pPager
a4c0: 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50  ->zJournal = &pP
a4d0: 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
a4e0: 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73  [nameLen+1];.  s
a4f0: 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46  trcpy(pPager->zF
a500: 69 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61  ilename, zFullPa
a510: 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70  thname);.  strcp
a520: 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  y(pPager->zDirec
a530: 74 6f 72 79 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  tory, zFullPathn
a540: 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 61  ame);.  for(i=na
a550: 6d 65 4c 65 6e 3b 20 69 3e 30 20 26 26 20 70 50  meLen; i>0 && pP
a560: 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
a570: 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29  [i-1]!='/'; i--)
a580: 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20 29 20 70  {}.  if( i>0 ) p
a590: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
a5a0: 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20 20 73 74  y[i-1] = 0;.  st
a5b0: 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  rcpy(pPager->zJo
a5c0: 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61 74 68  urnal, zFullPath
a5d0: 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46  name);.  sqliteF
a5e0: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
a5f0: 65 29 3b 0a 20 20 73 74 72 63 70 79 28 26 70 50  e);.  strcpy(&pP
a600: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e  ager->zJournal[n
a610: 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e  ameLen], "-journ
a620: 61 6c 22 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  al");.  pPager->
a630: 66 64 20 3d 20 66 64 3b 0a 20 20 70 50 61 67 65  fd = fd;.  pPage
a640: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
a650: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 75 73   0;.  pPager->us
a660: 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f  eJournal = useJo
a670: 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b  urnal && !memDb;
a680: 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  .  pPager->stmtO
a690: 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  pen = 0;.  pPage
a6a0: 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
a6b0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  ;.  pPager->nRef
a6c0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
a6d0: 64 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31  dbSize = memDb-1
a6e0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ;.  pPager->page
a6f0: 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 50 41  Size = SQLITE_PA
a700: 47 45 5f 53 49 5a 45 3b 0a 20 20 70 50 61 67 65  GE_SIZE;.  pPage
a710: 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b  r->stmtSize = 0;
a720: 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  .  pPager->stmtJ
a730: 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Size = 0;.  pPag
a740: 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20  er->nPage = 0;. 
a750: 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
a760: 3d 20 6d 78 50 61 67 65 3e 35 20 3f 20 6d 78 50  = mxPage>5 ? mxP
a770: 61 67 65 20 3a 20 31 30 3b 0a 20 20 70 50 61 67  age : 10;.  pPag
a780: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
a790: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67  R_UNLOCK;.  pPag
a7a0: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b  er->errMask = 0;
a7b0: 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  .  pPager->tempF
a7c0: 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a  ile = tempFile;.
a7d0: 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20    pPager->memDb 
a7e0: 3d 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65  = memDb;.  pPage
a7f0: 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65  r->readOnly = re
a800: 61 64 4f 6e 6c 79 3b 0a 20 20 70 50 61 67 65 72  adOnly;.  pPager
a810: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
a820: 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
a830: 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
a840: 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e  ile || !useJourn
a850: 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46  al;.  pPager->pF
a860: 69 72 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  irst = 0;.  pPag
a870: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
a880: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
a890: 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 50 61  pLast = 0;.  pPa
a8a0: 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 6e 45  ger->nExtra = nE
a8b0: 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e  xtra;.  pPager->
a8c0: 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 28  pBusyHandler = (
a8d0: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 29 70 42  BusyHandler *)pB
a8e0: 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 6d 65  usyHandler;.  me
a8f0: 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61  mset(pPager->aHa
a900: 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50  sh, 0, sizeof(pP
a910: 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20  ager->aHash));. 
a920: 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67   *ppPager = pPag
a930: 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  er;.  return SQL
a940: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
a950: 20 53 65 74 20 74 68 65 20 64 65 73 74 72 75 63   Set the destruc
a960: 74 6f 72 20 66 6f 72 20 74 68 69 73 20 70 61 67  tor for this pag
a970: 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c  er.  If not NULL
a980: 2c 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  , the destructor
a990: 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68   is called.** wh
a9a0: 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  en the reference
a9b0: 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68 20 70   count on each p
a9c0: 61 67 65 20 72 65 61 63 68 65 73 20 7a 65 72 6f  age reaches zero
a9d0: 2e 20 20 54 68 65 20 64 65 73 74 72 75 63 74 6f  .  The destructo
a9e0: 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64  r can.** be used
a9f0: 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 69 6e 66   to clean up inf
aa00: 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
aa10: 65 78 74 72 61 20 73 65 67 6d 65 6e 74 20 61 70  extra segment ap
aa20: 70 65 6e 64 65 64 20 74 6f 20 65 61 63 68 20 70  pended to each p
aa30: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  age..**.** The d
aa40: 65 73 74 72 75 63 74 6f 72 20 69 73 20 6e 6f 74  estructor is not
aa50: 20 63 61 6c 6c 65 64 20 61 73 20 61 20 72 65 73   called as a res
aa60: 75 6c 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  ult sqlite3pager
aa70: 5f 63 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44  _close().  .** D
aa80: 65 73 74 72 75 63 74 6f 72 73 20 61 72 65 20 6f  estructors are o
aa90: 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71  nly called by sq
aaa0: 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
aab0: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
aac0: 74 65 33 70 61 67 65 72 5f 73 65 74 5f 64 65 73  te3pager_set_des
aad0: 74 72 75 63 74 6f 72 28 50 61 67 65 72 20 2a 70  tructor(Pager *p
aae0: 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 44  Pager, void (*xD
aaf0: 65 73 63 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29  esc)(void*,int))
ab00: 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73  {.  pPager->xDes
ab10: 74 72 75 63 74 6f 72 20 3d 20 78 44 65 73 63 3b  tructor = xDesc;
ab20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
ab30: 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 20  e reinitializer 
ab40: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
ab50: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   If not NULL, th
ab60: 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a  e reinitializer.
ab70: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ** is called whe
ab80: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
ab90: 20 61 20 70 61 67 65 20 69 6e 20 63 61 63 68 65   a page in cache
aba0: 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20   is restored to 
abb0: 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  its original.** 
abc0: 76 61 6c 75 65 20 61 73 20 61 20 72 65 73 75 6c  value as a resul
abd0: 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  t of a rollback.
abe0: 20 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 67    The callback g
abf0: 69 76 65 73 20 68 69 67 68 65 72 2d 6c 65 76 65  ives higher-leve
ac00: 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70  l code.** an opp
ac10: 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65 73 74  ortunity to rest
ac20: 6f 72 65 20 74 68 65 20 45 58 54 52 41 20 73 65  ore the EXTRA se
ac30: 63 74 69 6f 6e 20 74 6f 20 61 67 72 65 65 20 77  ction to agree w
ac40: 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64  ith the restored
ac50: 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  .** page data..*
ac60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
ac70: 67 65 72 5f 73 65 74 5f 72 65 69 6e 69 74 65 72  ger_set_reiniter
ac80: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
ac90: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28  void (*xReinit)(
aca0: 76 6f 69 64 2a 2c 69 6e 74 29 29 7b 0a 20 20 70  void*,int)){.  p
acb0: 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
acc0: 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f   = xReinit;.}../
acd0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
ace0: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
acf0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 69 73  pages in the dis
ad00: 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65  k file associate
ad10: 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72  d with.** pPager
ad20: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ad30: 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
ad40: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
ad50: 20 20 6f 66 66 5f 74 20 6e 3b 0a 20 20 61 73 73    off_t n;.  ass
ad60: 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
ad70: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
ad80: 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20  dbSize>=0 ){.   
ad90: 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
ada0: 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66  dbSize;.  }.  if
adb0: 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  ( sqlite3OsFileS
adc0: 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ize(&pPager->fd,
add0: 20 26 6e 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   &n)!=SQLITE_OK 
ade0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
adf0: 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f  rrMask |= PAGER_
ae00: 45 52 52 5f 44 49 53 4b 3b 0a 20 20 20 20 72 65  ERR_DISK;.    re
ae10: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 20  turn 0;.  }.  n 
ae20: 2f 3d 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  /= SQLITE_PAGE_S
ae30: 49 5a 45 3b 0a 20 20 69 66 28 20 21 70 50 61 67  IZE;.  if( !pPag
ae40: 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20 6e 3d 3d  er->memDb && n==
ae50: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 53 51 4c  PENDING_BYTE/SQL
ae60: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b  ITE_PAGE_SIZE ){
ae70: 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20  .    n++;.  }.  
ae80: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
ae90: 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
aea0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
aeb0: 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 7d 0a 20  bSize = n;.  }. 
aec0: 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
aed0: 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  .** Forward decl
aee0: 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  aration.*/.stati
aef0: 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61  c int syncJourna
af00: 6c 28 50 61 67 65 72 2a 2c 20 63 6f 6e 73 74 20  l(Pager*, const 
af10: 63 68 61 72 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20  char*);.../*.** 
af20: 55 6e 6c 69 6e 6b 20 61 20 70 61 67 65 20 66 72  Unlink a page fr
af30: 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  om the free list
af40: 20 28 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c   (the list of al
af50: 6c 20 70 61 67 65 73 20 77 68 65 72 65 20 6e 52  l pages where nR
af60: 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20 66 72  ef==0).** and fr
af70: 6f 6d 20 69 74 73 20 68 61 73 68 20 63 6f 6c 6c  om its hash coll
af80: 69 73 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a  ision chain..*/.
af90: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69  static void unli
afa0: 6e 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  nkPage(PgHdr *pP
afb0: 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
afc0: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
afd0: 72 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 74 68  r;..  /* Keep th
afe0: 65 20 70 46 69 72 73 74 53 79 6e 63 65 64 20 70  e pFirstSynced p
aff0: 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67 20  ointer pointing 
b000: 61 74 20 74 68 65 20 66 69 72 73 74 20 73 79 6e  at the first syn
b010: 63 68 72 6f 6e 69 7a 65 64 20 70 61 67 65 20 2a  chronized page *
b020: 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 70 50 61  /.  if( pPg==pPa
b030: 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
b040: 64 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  d ){.    PgHdr *
b050: 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  p = pPg->pNextFr
b060: 65 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  ee;.    while( p
b070: 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20   && p->needSync 
b080: 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46  ){ p = p->pNextF
b090: 72 65 65 3b 20 7d 0a 20 20 20 20 70 50 61 67 65  ree; }.    pPage
b0a0: 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
b0b0: 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  = p;.  }..  /* U
b0c0: 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20 66  nlink from the f
b0d0: 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69 66 28  reelist */.  if(
b0e0: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
b0f0: 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65  ){.    pPg->pPre
b100: 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65  vFree->pNextFree
b110: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
b120: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
b130: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
b140: 70 46 69 72 73 74 3d 3d 70 50 67 20 29 3b 0a 20  pFirst==pPg );. 
b150: 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
b160: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  t = pPg->pNextFr
b170: 65 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  ee;.  }.  if( pP
b180: 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a  g->pNextFree ){.
b190: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72      pPg->pNextFr
b1a0: 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  ee->pPrevFree = 
b1b0: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a  pPg->pPrevFree;.
b1c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
b1d0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 4c 61  ert( pPager->pLa
b1e0: 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  st==pPg );.    p
b1f0: 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70  Pager->pLast = p
b200: 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20  Pg->pPrevFree;. 
b210: 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 46   }.  pPg->pNextF
b220: 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ree = pPg->pPrev
b230: 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  Free = 0;..  /* 
b240: 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20  Unlink from the 
b250: 70 67 6e 6f 20 68 61 73 68 20 74 61 62 6c 65 20  pgno hash table 
b260: 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e  */.  if( pPg->pN
b270: 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 70  extHash ){.    p
b280: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
b290: 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e  PrevHash = pPg->
b2a0: 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20  pPrevHash;.  }. 
b2b0: 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48   if( pPg->pPrevH
b2c0: 61 73 68 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  ash ){.    pPg->
b2d0: 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78 74  pPrevHash->pNext
b2e0: 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Hash = pPg->pNex
b2f0: 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tHash;.  }else{.
b300: 20 20 20 20 69 6e 74 20 68 20 3d 20 70 61 67 65      int h = page
b310: 72 5f 68 61 73 68 28 70 50 67 2d 3e 70 67 6e 6f  r_hash(pPg->pgno
b320: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
b330: 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3d  Pager->aHash[h]=
b340: 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67  =pPg );.    pPag
b350: 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70  er->aHash[h] = p
b360: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20  Pg->pNextHash;. 
b370: 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48   }.  pPg->pNextH
b380: 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ash = pPg->pPrev
b390: 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Hash = 0;.}../*.
b3a0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
b3b0: 69 73 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63  is used to trunc
b3c0: 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ate an in-memory
b3d0: 20 64 61 74 61 62 61 73 65 2e 20 20 44 65 6c 65   database.  Dele
b3e0: 74 65 0a 2a 2a 20 61 6c 6c 20 70 61 67 65 73 20  te.** all pages 
b3f0: 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 20 6c 61  whose pgno is la
b400: 72 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72  rger than pPager
b410: 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20  ->dbSize and is 
b420: 75 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a  unreferenced..**
b430: 20 52 65 66 65 72 65 6e 63 65 64 20 70 61 67 65   Referenced page
b440: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50  s larger than pP
b450: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65  ager->dbSize are
b460: 20 7a 65 72 6f 65 64 2e 0a 2a 2f 0a 73 74 61 74   zeroed..*/.stat
b470: 69 63 20 76 6f 69 64 20 6d 65 6d 6f 72 79 54 72  ic void memoryTr
b480: 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
b490: 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
b4a0: 70 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70  pPg;.  PgHdr **p
b4b0: 70 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a  pPg;.  int dbSiz
b4c0: 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
b4d0: 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26 70  ze;..  ppPg = &p
b4e0: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77  Pager->pAll;.  w
b4f0: 68 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70 70  hile( (pPg = *pp
b500: 50 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  Pg)!=0 ){.    if
b510: 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53  ( pPg->pgno<=dbS
b520: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70 50  ize ){.      ppP
b530: 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41  g = &pPg->pNextA
b540: 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ll;.    }else if
b550: 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b  ( pPg->nRef>0 ){
b560: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
b570: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
b580: 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
b590: 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 70  eSize);.      pp
b5a0: 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74  Pg = &pPg->pNext
b5b0: 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  All;.    }else{.
b5c0: 20 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70 50        *ppPg = pP
b5d0: 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
b5e0: 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50     unlinkPage(pP
b5f0: 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
b600: 46 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Free(pPg);.     
b610: 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d   pPager->nPage--
b620: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
b630: 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68  *.** Truncate th
b640: 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20 6e 75  e file to the nu
b650: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 70  mber of pages sp
b660: 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20  ecified..*/.int 
b670: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72 75  sqlite3pager_tru
b680: 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
b690: 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
b6a0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
b6b0: 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
b6c0: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
b6d0: 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  3pager_pagecount
b6e0: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
b6f0: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
b700: 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63  ask!=0 ){.    rc
b710: 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65   = pager_errcode
b720: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
b730: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
b740: 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67  f( nPage>=(unsig
b750: 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69  ned)pPager->dbSi
b760: 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
b770: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
b780: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65    if( pPager->me
b790: 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65  mDb ){.    pPage
b7a0: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
b7b0: 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72 75  e;.    memoryTru
b7c0: 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20  ncate(pPager);. 
b7d0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b7e0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  _OK;.  }.  rc = 
b7f0: 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
b800: 65 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  er, 0);.  if( rc
b810: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
b820: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
b830: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
b840: 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50 61 67  OsTruncate(&pPag
b850: 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 50  er->fd, SQLITE_P
b860: 41 47 45 5f 53 49 5a 45 2a 28 6f 66 66 5f 74 29  AGE_SIZE*(off_t)
b870: 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  nPage);.  if( rc
b880: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
b890: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
b8a0: 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 7d 0a 20  e = nPage;.  }. 
b8b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b8c0: 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
b8d0: 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46  e page cache.  F
b8e0: 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
b8f0: 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  nd close all fil
b900: 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  es..**.** If a t
b910: 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69  ransaction was i
b920: 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20  n progress when 
b930: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
b940: 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20  called, that.** 
b950: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
b960: 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c  olled back.  All
b970: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
b980: 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
b990: 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20  ed.** and their 
b9a0: 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e  memory is freed.
b9b0: 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
b9c0: 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f   use a page asso
b9d0: 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
b9e0: 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61  his page cache a
b9f0: 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
ba00: 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20  on returns will 
ba10: 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74  likely.** result
ba20: 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
ba30: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
ba40: 67 65 72 5f 63 6c 6f 73 65 28 50 61 67 65 72 20  ger_close(Pager 
ba50: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
ba60: 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a  r *pPg, *pNext;.
ba70: 20 20 73 77 69 74 63 68 28 20 70 50 61 67 65 72    switch( pPager
ba80: 2d 3e 73 74 61 74 65 20 29 7b 0a 20 20 20 20 63  ->state ){.    c
ba90: 61 73 65 20 50 41 47 45 52 5f 52 45 53 45 52 56  ase PAGER_RESERV
baa0: 45 44 3a 0a 20 20 20 20 63 61 73 65 20 50 41 47  ED:.    case PAG
bab0: 45 52 5f 53 59 4e 43 45 44 3a 20 0a 20 20 20 20  ER_SYNCED: .    
bac0: 63 61 73 65 20 50 41 47 45 52 5f 45 58 43 4c 55  case PAGER_EXCLU
bad0: 53 49 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  SIVE: {.      sq
bae0: 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
baf0: 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
bb00: 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
bb10: 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 20  memDb ){.       
bb20: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
bb30: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f  (&pPager->fd, NO
bb40: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
bb50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
bb60: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
bb70: 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  n==0 );.      br
bb80: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
bb90: 61 73 65 20 50 41 47 45 52 5f 53 48 41 52 45 44  ase PAGER_SHARED
bba0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70  : {.      if( !p
bbb0: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
bbc0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
bbd0: 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d  sUnlock(&pPager-
bbe0: 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  >fd, NO_LOCK);. 
bbf0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
bc00: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
bc10: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f  fault: {.      /
bc20: 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a  * Do nothing */.
bc30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bc40: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 50 67   }.  }.  for(pPg
bc50: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
bc60: 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a  Pg; pPg=pNext){.
bc70: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
bc80: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d     if( pPager->m
bc90: 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 50 67  emDb ){.      Pg
bca0: 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
bcb0: 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
bcc0: 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
bcd0: 20 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d     assert( !pPg-
bce0: 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
bcf0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
bd00: 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29   !pHist->pOrig )
bd10: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
bd20: 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b  !pHist->pStmt );
bd30: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
bd40: 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70    pNext = pPg->p
bd50: 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c  NextAll;.    sql
bd60: 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20  iteFree(pPg);.  
bd70: 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  }.  if( !pPager-
bd80: 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73 71  >memDb ){.    sq
bd90: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50  lite3OsClose(&pP
bda0: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20  ager->fd);.  }. 
bdb0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
bdc0: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
bdd0: 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c  );.  /* Temp fil
bde0: 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63  es are automatic
bdf0: 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20  ally deleted by 
be00: 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20  the OS.  ** if( 
be10: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
be20: 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74   ){.  **   sqlit
be30: 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
be40: 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  r->zFilename);. 
be50: 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 20 20 43 4c 52   ** }.  */.  CLR
be60: 5f 50 41 47 45 52 28 70 50 61 67 65 72 29 3b 0a  _PAGER(pPager);.
be70: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 7a 46    if( pPager->zF
be80: 69 6c 65 6e 61 6d 65 21 3d 28 63 68 61 72 2a 29  ilename!=(char*)
be90: 26 70 50 61 67 65 72 5b 31 5d 20 29 7b 0a 20 20  &pPager[1] ){.  
bea0: 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 20 20    assert( 0 );  
beb0: 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 70 70 65 6e  /* Cannot happen
bec0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 46 72   */.    sqliteFr
bed0: 65 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  ee(pPager->zFile
bee0: 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  name);.    sqlit
bef0: 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 7a 4a  eFree(pPager->zJ
bf00: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71 6c  ournal);.    sql
bf10: 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
bf20: 7a 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 7d  zDirectory);.  }
bf30: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50  .  sqliteFree(pP
bf40: 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
bf50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
bf60: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
bf70: 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
bf80: 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64 61  he given page da
bf90: 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69  ta..*/.Pgno sqli
bfa0: 74 65 33 70 61 67 65 72 5f 70 61 67 65 6e 75 6d  te3pager_pagenum
bfb0: 62 65 72 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ber(void *pData)
bfc0: 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20 44  {.  PgHdr *p = D
bfd0: 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
bfe0: 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  ta);.  return p-
bff0: 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >pgno;.}../*.** 
c000: 54 68 65 20 70 61 67 65 5f 72 65 66 28 29 20 66  The page_ref() f
c010: 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65 6e  unction incremen
c020: 74 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  ts the reference
c030: 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67   count for a pag
c040: 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  e..** If the pag
c050: 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f  e is currently o
c060: 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 28  n the freelist (
c070: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
c080: 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74 68 65  unt is zero) the
c090: 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20 66  n.** remove it f
c0a0: 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74  rom the freelist
c0b0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d  ..**.** For non-
c0c0: 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61  test systems, pa
c0d0: 67 65 5f 72 65 66 28 29 20 69 73 20 61 20 6d 61  ge_ref() is a ma
c0e0: 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73 20 5f  cro that calls _
c0f0: 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e  page_ref().** on
c100: 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65 66 65  line of the refe
c110: 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a  rence count is z
c120: 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74 20 73  ero.  For test s
c130: 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66  ystems, page_ref
c140: 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61 6c 20  ().** is a real 
c150: 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68 61 74  function so that
c160: 20 77 65 20 63 61 6e 20 73 65 74 20 62 72 65 61   we can set brea
c170: 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72 61 63  kpoints and trac
c180: 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e it..*/.static 
c190: 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66 28 50  void _page_ref(P
c1a0: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
c1b0: 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
c1c0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  {.    /* The pag
c1d0: 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f  e is currently o
c1e0: 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
c1f0: 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20   Remove it. */. 
c200: 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50 67 2d     if( pPg==pPg-
c210: 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53  >pPager->pFirstS
c220: 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 20 20 50  ynced ){.      P
c230: 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70  gHdr *p = pPg->p
c240: 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20 20  NextFree;.      
c250: 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e  while( p && p->n
c260: 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70  eedSync ){ p = p
c270: 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20  ->pNextFree; }. 
c280: 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72       pPg->pPager
c290: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
c2a0: 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   p;.    }.    if
c2b0: 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  ( pPg->pPrevFree
c2c0: 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
c2d0: 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46  PrevFree->pNextF
c2e0: 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ree = pPg->pNext
c2f0: 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Free;.    }else{
c300: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
c310: 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67  er->pFirst = pPg
c320: 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
c330: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
c340: 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20  pNextFree ){.   
c350: 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65     pPg->pNextFre
c360: 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70  e->pPrevFree = p
c370: 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20  Pg->pPrevFree;. 
c380: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c390: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 4c 61  pPg->pPager->pLa
c3a0: 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  st = pPg->pPrevF
c3b0: 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ree;.    }.    p
c3c0: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66  Pg->pPager->nRef
c3d0: 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e  ++;.  }.  pPg->n
c3e0: 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e 46 4f  Ref++;.  REFINFO
c3f0: 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64 65 66 20  (pPg);.}.#ifdef 
c400: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 74  SQLITE_TEST.  st
c410: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72  atic void page_r
c420: 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ef(PgHdr *pPg){.
c430: 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65      if( pPg->nRe
c440: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 5f 70  f==0 ){.      _p
c450: 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
c460: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
c470: 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  Pg->nRef++;.    
c480: 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
c490: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a      }.  }.#else.
c4a0: 23 20 64 65 66 69 6e 65 20 70 61 67 65 5f 72 65  # define page_re
c4b0: 66 28 50 29 20 20 20 28 28 50 29 2d 3e 6e 52 65  f(P)   ((P)->nRe
c4c0: 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66 28 50  f==0?_page_ref(P
c4d0: 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e 52 65  ):(void)(P)->nRe
c4e0: 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  f++).#endif../*.
c4f0: 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  ** Increment the
c500: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
c510: 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54 68   for a page.  Th
c520: 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72 20  e input pointer 
c530: 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63  is.** a referenc
c540: 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 61  e to the page da
c550: 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ta..*/.int sqlit
c560: 65 33 70 61 67 65 72 5f 72 65 66 28 76 6f 69 64  e3pager_ref(void
c570: 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
c580: 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  r *pPg = DATA_TO
c590: 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
c5a0: 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
c5b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c5c0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  OK;.}../*.** Syn
c5d0: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  c the journal.  
c5e0: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
c5f0: 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68  make sure all th
c600: 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  e pages that hav
c610: 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65  e.** been writte
c620: 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
c630: 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72   have actually r
c640: 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61  eached the surfa
c650: 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73  ce of the.** dis
c660: 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73 61  k.  It is not sa
c670: 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  fe to modify the
c680: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
c690: 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61 66  se file until af
c6a0: 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ter.** the journ
c6b0: 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63  al has been sync
c6c0: 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69 67  ed.  If the orig
c6d0: 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69 73  inal database is
c6e0: 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72 65   modified before
c6f0: 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
c700: 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61 20  is synced and a 
c710: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
c720: 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e 63  curs, the unsync
c730: 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61  ed journal.** da
c740: 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74  ta would be lost
c750: 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62 65   and we would be
c760: 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c   unable to compl
c770: 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74  etely rollback t
c780: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
c790: 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61 73  hanges.  Databas
c7a0: 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75  e corruption wou
c7b0: 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a  ld occur..** .**
c7c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
c7d0: 73 6f 20 75 70 64 61 74 65 73 20 74 68 65 20 6e  so updates the n
c7e0: 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65  Rec field in the
c7f0: 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a   header of the j
c800: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20  ournal..** (See 
c810: 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20  comments on the 
c820: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
c830: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64   routine for add
c840: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
c850: 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20  ion.).** If the 
c860: 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55 4c  sync mode is FUL
c870: 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69 6c  L, two syncs wil
c880: 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74 20  l occur.  First 
c890: 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61  the whole journa
c8a0: 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c 20  l.** is synced, 
c8b0: 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  then the nRec fi
c8c0: 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c 20  eld is updated, 
c8d0: 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73 79  then a second sy
c8e0: 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  nc occurs..**.**
c8f0: 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64   For temporary d
c900: 61 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f 20  atabases, we do 
c910: 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65 20 61  not care if we a
c920: 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62  re able to rollb
c930: 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20 70  ack.** after a p
c940: 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73 6f  ower failure, so
c950: 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a   sync occurs..**
c960: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
c970: 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65 65 64   clears the need
c980: 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20 65 76  Sync field of ev
c990: 65 72 79 20 70 61 67 65 20 63 75 72 72 65 6e 74  ery page current
c9a0: 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f   held in.** memo
c9b0: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
c9c0: 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61  t syncJournal(Pa
c9d0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
c9e0: 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
c9f0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
ca00: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
ca10: 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e  TE_OK;..  /* Syn
ca20: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65  c the journal be
ca30: 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74  fore modifying t
ca40: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
ca50: 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20  .  ** (assuming 
ca60: 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e  there is a journ
ca70: 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20  al and it needs 
ca80: 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20  to be synced.). 
ca90: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
caa0: 2d 3e 6e 65 65 64 53 79 6e 63 20 7c 7c 20 7a 4d  ->needSync || zM
cab0: 61 73 74 65 72 20 29 7b 0a 20 20 20 20 69 66 28  aster ){.    if(
cac0: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
cad0: 6c 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  le ){.      asse
cae0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
caf0: 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20  nalOpen );.     
cb00: 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50 61   /* assert( !pPa
cb10: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20 2f  ger->noSync ); /
cb20: 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20 62  / noSync might b
cb30: 65 20 73 65 74 20 69 66 20 73 79 6e 63 68 72 6f  e set if synchro
cb40: 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 77 61  nous.      ** wa
cb50: 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61 66 74  s turned off aft
cb60: 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  er the transacti
cb70: 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2e 20  on was started. 
cb80: 20 54 69 63 6b 65 74 20 23 36 31 35 20 2a 2f 0a   Ticket #615 */.
cb90: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
cba0: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f       {.        /
cbb0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
cbc0: 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f 75  pPager->nRec cou
cbd0: 6e 74 65 72 20 77 65 20 61 72 65 20 6b 65 65 70  nter we are keep
cbe0: 69 6e 67 20 61 67 72 65 65 73 0a 20 20 20 20 20  ing agrees.     
cbf0: 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 6e     ** with the n
cc00: 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f  Rec computed fro
cc10: 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  m the size of th
cc20: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
cc30: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
cc40: 20 20 20 6f 66 66 5f 74 20 68 64 72 53 7a 2c 20     off_t hdrSz, 
cc50: 70 67 53 7a 2c 20 6a 53 7a 3b 0a 20 20 20 20 20  pgSz, jSz;.     
cc60: 20 20 20 68 64 72 53 7a 20 3d 20 4a 4f 55 52 4e     hdrSz = JOURN
cc70: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
cc80: 29 3b 0a 20 20 20 20 20 20 20 20 70 67 53 7a 20  );.        pgSz 
cc90: 3d 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  = JOURNAL_PG_SZ(
cca0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
ccb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
ccc0: 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d  ileSize(&pPager-
ccd0: 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a 20 20 20  >jfd, &jSz);.   
cce0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
ccf0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
cd00: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
cd10: 65 72 2d 3e 6e 52 65 63 2a 70 67 53 7a 2b 68 64  er->nRec*pgSz+hd
cd20: 72 53 7a 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20  rSz==jSz );.    
cd30: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
cd40: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72   {.        /* Wr
cd50: 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  ite the nRec val
cd60: 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ue into the jour
cd70: 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 20  nal file header 
cd80: 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74  */.        off_t
cd90: 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 69 66   szJ;.        if
cda0: 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
cdb0: 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
cdc0: 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75  TRACE2("SYNC jou
cdd0: 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 70  rnal of %d\n", p
cde0: 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20  Pager->fd.h);.  
cdf0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
ce00: 69 74 65 33 4f 73 53 79 6e 63 28 26 70 50 61 67  ite3OsSync(&pPag
ce10: 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
ce20: 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20      if( rc!=0 ) 
ce30: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
ce40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
ce50: 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67  ite3OsSeek(&pPag
ce60: 65 72 2d 3e 6a 66 64 2c 20 73 69 7a 65 6f 66 28  er->jfd, sizeof(
ce70: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
ce80: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
ce90: 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65  ite32bits(&pPage
cea0: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
ceb0: 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69  nRec);.        i
cec0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
ced0: 63 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57  c;..        /* W
cee0: 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  rite the name of
cef0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
cf00: 6e 61 6c 20 66 69 6c 65 20 69 66 20 6f 6e 65 20  nal file if one 
cf10: 69 73 20 73 70 65 63 69 66 69 65 64 20 2a 2f 0a  is specified */.
cf20: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4d 61 73          if( zMas
cf30: 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ter ){.         
cf40: 20 61 73 73 65 72 74 28 20 73 74 72 6c 65 6e 28   assert( strlen(
cf50: 7a 4d 61 73 74 65 72 29 3c 70 50 61 67 65 72 2d  zMaster)<pPager-
cf60: 3e 6e 4d 61 73 74 65 72 20 29 3b 0a 20 20 20 20  >nMaster );.    
cf70: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
cf80: 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
cf90: 2d 3e 6a 66 64 2c 20 32 30 29 3b 0a 20 20 20 20  ->jfd, 20);.    
cfa0: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
cfb0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
cfc0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
cfd0: 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d  OsWrite(&pPager-
cfe0: 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 73  >jfd, zMaster, s
cff0: 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29 2b 31  trlen(zMaster)+1
d000: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
d010: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
d020: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
d030: 20 20 20 20 73 7a 4a 20 3d 20 4a 4f 55 52 4e 41      szJ = JOURNA
d040: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
d050: 20 2b 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63   +  pPager->nRec
d060: 2a 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70  *JOURNAL_PG_SZ(p
d070: 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
d080: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
d090: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 73 7a 4a 29  Pager->jfd, szJ)
d0a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d0b0: 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75  TRACE2("SYNC jou
d0c0: 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 70  rnal of %d\n", p
d0d0: 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20  Pager->fd.h);.  
d0e0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d0f0: 4f 73 53 79 6e 63 28 26 70 50 61 67 65 72 2d 3e  OsSync(&pPager->
d100: 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  jfd);.      if( 
d110: 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
d120: 63 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  c;.      pPager-
d130: 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
d140: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 1;.    }.    p
d150: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
d160: 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61  = 0;..    /* Era
d170: 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20  se the needSync 
d180: 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79 20  flag from every 
d190: 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
d1a0: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
d1b0: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
d1c0: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
d1d0: 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
d1e0: 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ync = 0;.    }. 
d1f0: 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
d200: 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72  tSynced = pPager
d210: 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 23  ->pFirst;.  }..#
d220: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
d230: 2f 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e  /* If the Pager.
d240: 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73  needSync flag is
d250: 20 63 6c 65 61 72 20 74 68 65 6e 20 74 68 65 20   clear then the 
d260: 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20  PgHdr.needSync. 
d270: 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20 61 6c   ** flag must al
d280: 73 6f 20 62 65 20 63 6c 65 61 72 20 66 6f 72 20  so be clear for 
d290: 61 6c 6c 20 70 61 67 65 73 2e 20 20 56 65 72 69  all pages.  Veri
d2a0: 66 79 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a  fy that this.  *
d2b0: 2a 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 74  * invariant is t
d2c0: 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  rue..  */.  else
d2d0: 7b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  {.    for(pPg=pP
d2e0: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
d2f0: 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
d300: 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ll){.      asser
d310: 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  t( pPg->needSync
d320: 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ==0 );.    }.   
d330: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
d340: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 70  >pFirstSynced==p
d350: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 29 3b  Pager->pFirst );
d360: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
d370: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
d380: 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20  ** Given a list 
d390: 6f 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63  of pages (connec
d3a0: 74 65 64 20 62 79 20 74 68 65 20 50 67 48 64 72  ted by the PgHdr
d3b0: 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29  .pDirty pointer)
d3c0: 20 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20   write.** every 
d3d0: 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67  one of those pag
d3e0: 65 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  es out to the da
d3f0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
d400: 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a  mark them all.**
d410: 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74   as clean..*/.st
d420: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
d430: 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67  rite_pagelist(Pg
d440: 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50  Hdr *pList){.  P
d450: 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20  ager *pPager;.  
d460: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 75  int rc;.  int bu
d470: 73 79 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 70  sy = 1;..  if( p
d480: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
d490: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50   SQLITE_OK;.  pP
d4a0: 61 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50  ager = pList->pP
d4b0: 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74  ager;..  /* At t
d4c0: 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20  his point there 
d4d0: 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61 20  may be either a 
d4e0: 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
d4f0: 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
d500: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
d510: 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  file. If there i
d520: 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43  s already an EXC
d530: 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65  LUSIVE lock, the
d540: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20   following.  ** 
d550: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
d560: 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d  OsLock() are no-
d570: 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d  ops..  **.  ** M
d580: 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66  oving the lock f
d590: 72 6f 6d 20 52 45 53 45 52 56 45 44 20 74 6f 20  rom RESERVED to 
d5a0: 45 58 43 4c 55 53 49 56 45 20 61 63 74 75 61 6c  EXCLUSIVE actual
d5b0: 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e  ly involves goin
d5c0: 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61  g.  ** through a
d5d0: 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  n intermediate s
d5e0: 74 61 74 65 20 50 45 4e 44 49 4e 47 2e 20 20 20  tate PENDING.   
d5f0: 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70  A PENDING lock p
d600: 72 65 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a  revents new.  **
d610: 20 72 65 61 64 65 72 73 20 66 72 6f 6d 20 61 74   readers from at
d620: 74 61 63 68 69 6e 67 20 74 6f 20 74 68 65 20 64  taching to the d
d630: 61 74 61 62 61 73 65 20 62 75 74 20 69 73 20 75  atabase but is u
d640: 6e 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20  nsufficient for 
d650: 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65  us to.  ** write
d660: 2e 20 20 54 68 65 20 69 64 65 61 20 6f 66 20 61  .  The idea of a
d670: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
d680: 20 74 6f 20 70 72 65 76 65 6e 74 20 6e 65 77 20   to prevent new 
d690: 72 65 61 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a  readers from.  *
d6a0: 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c  * coming in whil
d6b0: 65 20 77 65 20 77 61 69 74 20 66 6f 72 20 65 78  e we wait for ex
d6c0: 69 73 74 69 6e 67 20 72 65 61 64 65 72 73 20 74  isting readers t
d6d0: 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20  o clear..  **.  
d6e0: 2a 2a 20 57 68 69 6c 65 20 74 68 65 20 70 61 67  ** While the pag
d6f0: 65 72 20 69 73 20 69 6e 20 74 68 65 20 52 45 53  er is in the RES
d700: 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65  ERVED state, the
d710: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
d720: 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20  se file.  ** is 
d730: 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 77 65  unchanged and we
d740: 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69   can rollback wi
d750: 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
d760: 70 6c 61 79 62 61 63 6b 20 74 68 65 0a 20 20 2a  playback the.  *
d770: 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74  * journal into t
d780: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
d790: 62 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65  base file.  Once
d7a0: 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74   we transition t
d7b0: 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45  o.  ** EXCLUSIVE
d7c0: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 64  , it means the d
d7d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
d7e0: 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20 61 6e   been changed an
d7f0: 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20  d any rollback. 
d800: 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69 72 65   ** will require
d810: 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62   a journal playb
d820: 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b  ack..  */.  do {
d830: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
d840: 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d  3OsLock(&pPager-
d850: 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  >fd, EXCLUSIVE_L
d860: 4f 43 4b 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  OCK);.  }while( 
d870: 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
d880: 26 26 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  && .      pPager
d890: 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 26  ->pBusyHandler &
d8a0: 26 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  & .      pPager-
d8b0: 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78  >pBusyHandler->x
d8c0: 46 75 6e 63 20 26 26 20 0a 20 20 20 20 20 20 70  Func && .      p
d8d0: 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
d8e0: 6c 65 72 2d 3e 78 46 75 6e 63 28 70 50 61 67 65  ler->xFunc(pPage
d8f0: 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d  r->pBusyHandler-
d900: 3e 70 41 72 67 2c 20 62 75 73 79 2b 2b 29 0a 20  >pArg, busy++). 
d910: 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   );.  if( rc!=SQ
d920: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
d930: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
d940: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
d950: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
d960: 0a 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74  ..  while( pList
d970: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d980: 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 29 3b 0a  pList->dirty );.
d990: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65      sqlite3OsSee
d9a0: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  k(&pPager->fd, (
d9b0: 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28  pList->pgno-1)*(
d9c0: 6f 66 66 5f 74 29 53 51 4c 49 54 45 5f 50 41 47  off_t)SQLITE_PAG
d9d0: 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 43 4f 44  E_SIZE);.    COD
d9e0: 45 43 28 70 50 61 67 65 72 2c 20 50 47 48 44 52  EC(pPager, PGHDR
d9f0: 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c  _TO_DATA(pList),
da00: 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29   pList->pgno, 6)
da10: 3b 0a 20 20 20 20 54 52 41 43 45 32 28 22 53 54  ;.    TRACE2("ST
da20: 4f 52 45 20 70 61 67 65 20 25 64 5c 6e 22 2c 20  ORE page %d\n", 
da30: 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pList->pgno);.  
da40: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
da50: 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 66  Write(&pPager->f
da60: 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  d, PGHDR_TO_DATA
da70: 28 70 4c 69 73 74 29 2c 20 53 51 4c 49 54 45 5f  (pList), SQLITE_
da80: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
da90: 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 50 47  CODEC(pPager, PG
daa0: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73  HDR_TO_DATA(pLis
dab0: 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c  t), pList->pgno,
dac0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
dad0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
dae0: 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 3d 20   pList->dirty = 
daf0: 30 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  0;.    pList = p
db00: 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
db10: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
db20: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
db30: 6f 6c 6c 65 63 74 20 65 76 65 72 79 20 64 69 72  ollect every dir
db40: 74 79 20 70 61 67 65 20 69 6e 74 6f 20 61 20 64  ty page into a d
db50: 69 72 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a  irty list and.**
db60: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
db70: 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66  r to the head of
db80: 20 74 68 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c   that list.  All
db90: 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f   pages are.** co
dba0: 6c 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66 20  llected even if 
dbb0: 74 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20 69  they are still i
dbc0: 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  n use..*/.static
dbd0: 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 67 65   PgHdr *pager_ge
dbe0: 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
dbf0: 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
dc00: 7b 0a 20 20 50 67 48 64 72 20 2a 70 2c 20 2a 70  {.  PgHdr *p, *p
dc10: 4c 69 73 74 3b 0a 20 20 70 4c 69 73 74 20 3d 20  List;.  pList = 
dc20: 30 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65  0;.  for(p=pPage
dc30: 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d  r->pAll; p; p=p-
dc40: 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
dc50: 69 66 28 20 70 2d 3e 64 69 72 74 79 20 29 7b 0a  if( p->dirty ){.
dc60: 20 20 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20        p->pDirty 
dc70: 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 70  = pList;.      p
dc80: 4c 69 73 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a  List = p;.    }.
dc90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69    }.  return pLi
dca0: 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  st;.}../*.** Acq
dcb0: 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  uire a page..**.
dcc0: 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f  ** A read lock o
dcd0: 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  n the disk file 
dce0: 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65 6e  is obtained when
dcf0: 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
dd00: 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a  is acquired. .**
dd10: 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b 20   This read lock 
dd20: 69 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e 20  is dropped when 
dd30: 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 73  the last page is
dd40: 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a   released..**.**
dd50: 20 41 20 5f 67 65 74 20 77 6f 72 6b 73 20 66 6f   A _get works fo
dd60: 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62 65  r any page numbe
dd70: 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30  r greater than 0
dd80: 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
dd90: 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d  se.** file is sm
dda0: 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72  aller than the r
ddb0: 65 71 75 65 73 74 65 64 20 70 61 67 65 2c 20 74  equested page, t
ddc0: 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64 69  hen no actual di
ddd0: 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75 72  sk.** read occur
dde0: 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79  s and the memory
ddf0: 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70 61   image of the pa
de00: 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ge is initialize
de10: 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f  d to.** all zero
de20: 73 2e 20 20 54 68 65 20 65 78 74 72 61 20 64 61  s.  The extra da
de30: 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61  ta appended to a
de40: 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20   page is always 
de50: 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74  initialized.** t
de60: 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72 73  o zeros the firs
de70: 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  t time a page is
de80: 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d   loaded into mem
de90: 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ory..**.** The a
dea0: 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74  cquisition might
deb0: 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61   fail for severa
dec0: 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61  l reasons.  In a
ded0: 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20  ll cases,.** an 
dee0: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
def0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
df00: 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69  ed and *ppPage i
df10: 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  s set to NULL..*
df20: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
df30: 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75  lite3pager_looku
df40: 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20  p().  Both this 
df50: 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f 6f  routine and _loo
df60: 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a  kup() attempt.**
df70: 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
df80: 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
df90: 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49   cache first.  I
dfa0: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
dfb0: 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20  t already.** in 
dfc0: 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75  memory, this rou
dfd0: 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73  tine goes to dis
dfe0: 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20  k to read it in 
dff0: 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70 28  whereas _lookup(
e000: 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e  ).** just return
e010: 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69  s 0.  This routi
e020: 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65  ne acquires a re
e030: 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73  ad-lock the firs
e040: 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73  t time it.** has
e050: 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20   to go to disk, 
e060: 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70  and could also p
e070: 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a  layback an old j
e080: 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
e090: 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f 6c  ary..** Since _l
e0a0: 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f  ookup() never go
e0b0: 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e  es to disk, it n
e0c0: 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c  ever has to deal
e0d0: 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f   with locks.** o
e0e0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  r journal files.
e0f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
e100: 61 67 65 72 5f 67 65 74 28 50 61 67 65 72 20 2a  ager_get(Pager *
e110: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
e120: 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50 61 67 65  o, void **ppPage
e130: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
e140: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
e150: 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61   Make sure we ha
e160: 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63  ve not hit any c
e170: 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a  ritical errors..
e180: 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20    */ .  assert( 
e190: 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
e1a0: 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
e1b0: 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b  ;.  *ppPage = 0;
e1c0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
e1d0: 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45 52  rrMask & ~(PAGER
e1e0: 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20  _ERR_FULL) ){.  
e1f0: 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
e200: 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a  rrcode(pPager);.
e210: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
e220: 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 70  s is the first p
e230: 61 67 65 20 61 63 63 65 73 73 65 64 2c 20 74 68  age accessed, th
e240: 65 6e 20 67 65 74 20 61 20 53 48 41 52 45 44 20  en get a SHARED 
e250: 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  lock.  ** on the
e260: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
e270: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
e280: 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21 70  r->nRef==0 && !p
e290: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
e2a0: 20 20 20 20 69 6e 74 20 62 75 73 79 20 3d 20 31      int busy = 1
e2b0: 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  ;.    do {.     
e2c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
e2d0: 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
e2e0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
e2f0: 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53     }while( rc==S
e300: 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 0a 20  QLITE_BUSY && . 
e310: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
e320: 42 75 73 79 48 61 6e 64 6c 65 72 20 26 26 20 0a  BusyHandler && .
e330: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
e340: 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46  pBusyHandler->xF
e350: 75 6e 63 20 26 26 20 0a 20 20 20 20 20 20 20 20  unc && .        
e360: 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
e370: 64 6c 65 72 2d 3e 78 46 75 6e 63 28 70 50 61 67  dler->xFunc(pPag
e380: 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
e390: 2d 3e 70 41 72 67 2c 20 62 75 73 79 2b 2b 29 0a  ->pArg, busy++).
e3a0: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72      );.    if( r
e3b0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
e3c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
e3d0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
e3e0: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
e3f0: 5f 53 48 41 52 45 44 3b 0a 0a 20 20 20 20 2f 2a  _SHARED;..    /*
e400: 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   If a journal fi
e410: 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74  le exists, and t
e420: 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52  here is no RESER
e430: 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  VED lock on the.
e440: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
e450: 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69  file, then it ei
e460: 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ther needs to be
e470: 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20   played back or 
e480: 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
e490: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
e4a0: 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 0a 20  useJournal && . 
e4b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
e4c0: 46 69 6c 65 45 78 69 73 74 73 28 70 50 61 67 65  FileExists(pPage
e4d0: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20 26 26 0a  r->zJournal) &&.
e4e0: 20 20 20 20 20 20 20 20 21 73 71 6c 69 74 65 33          !sqlite3
e4f0: 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
e500: 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29  ock(&pPager->fd)
e510: 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20   .    ){.       
e520: 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 20 20 20  int rc;..       
e530: 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
e540: 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
e550: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
e560: 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  /.       rc = sq
e570: 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61  lite3OsLock(&pPa
e580: 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49  ger->fd, EXCLUSI
e590: 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
e5a0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e5b0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 73  OK ){.         s
e5c0: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26  qlite3OsUnlock(&
e5d0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c  pPager->fd, NO_L
e5e0: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 70  OCK);.         p
e5f0: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
e600: 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  AGER_UNLOCK;.   
e610: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
e620: 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  .       }.      
e630: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
e640: 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
e650: 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  ;..       /* Ope
e660: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  n the journal fo
e670: 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79 2e 20  r reading only. 
e680: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   Return SQLITE_B
e690: 55 53 59 20 69 66 0a 20 20 20 20 20 20 20 2a 2a  USY if.       **
e6a0: 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74   we are unable t
e6b0: 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  o open the journ
e6c0: 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20  al file. .      
e6d0: 20 2a 2a 0a 20 20 20 20 20 20 20 2a 2a 20 54 68   **.       ** Th
e6e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
e6f0: 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
e700: 62 65 20 6c 6f 63 6b 65 64 20 69 74 73 65 6c 66  be locked itself
e710: 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 2a 2a  .  The.       **
e720: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
e730: 20 6e 65 76 65 72 20 6f 70 65 6e 20 75 6e 6c 65   never open unle
e740: 73 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ss the main data
e750: 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 73 0a  base file holds.
e760: 20 20 20 20 20 20 20 2a 2a 20 61 20 77 72 69 74         ** a writ
e770: 65 20 6c 6f 63 6b 2c 20 73 6f 20 74 68 65 72 65  e lock, so there
e780: 20 69 73 20 6e 65 76 65 72 20 61 6e 79 20 63 68   is never any ch
e790: 61 6e 63 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d  ance of two or m
e7a0: 6f 72 65 0a 20 20 20 20 20 20 20 2a 2a 20 70 72  ore.       ** pr
e7b0: 6f 63 65 73 73 65 73 20 6f 70 65 6e 69 6e 67 20  ocesses opening 
e7c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74  the journal at t
e7d0: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20  he same time..  
e7e0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72       */.       r
e7f0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
e800: 6e 52 65 61 64 4f 6e 6c 79 28 70 50 61 67 65 72  nReadOnly(pPager
e810: 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61  ->zJournal, &pPa
e820: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
e830: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e840: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
e850: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
e860: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f  &pPager->fd, NO_
e870: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  LOCK);.         
e880: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
e890: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  PAGER_UNLOCK;.  
e8a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
e8b0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
e8c0: 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67 65    }.       pPage
e8d0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
e8e0: 20 31 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65   1;.       pPage
e8f0: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
e900: 64 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 2f  d = 0;..       /
e910: 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64  * Playback and d
e920: 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
e930: 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74  l.  Drop the dat
e940: 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20  abase write.    
e950: 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72     ** lock and r
e960: 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61  eacquire the rea
e970: 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 2a  d lock..       *
e980: 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  /.       rc = pa
e990: 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
e9a0: 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ger, 0);.       
e9b0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
e9c0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 72 65  K ){.         re
e9d0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
e9e0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20  }.    }.    pPg 
e9f0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
ea00: 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
ea10: 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 2a 2f  page in cache */
ea20: 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72  .    pPg = pager
ea30: 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
ea40: 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 70  pgno);.    if( p
ea50: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20  Pager->memDb && 
ea60: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
ea70: 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  AGER_UNLOCK ){. 
ea80: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
ea90: 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
eaa0: 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  D;.    }.  }.  i
eab0: 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
eac0: 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
ead0: 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  d page is not in
eae0: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
eaf0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20   */.    int h;. 
eb00: 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73     pPager->nMiss
eb10: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ++;.    if( pPag
eb20: 65 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65 72  er->nPage<pPager
eb30: 2d 3e 6d 78 50 61 67 65 20 7c 7c 20 70 50 61 67  ->mxPage || pPag
eb40: 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20 7c 7c  er->pFirst==0 ||
eb50: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29   pPager->memDb )
eb60: 7b 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74  {.      /* Creat
eb70: 65 20 61 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a  e a new page */.
eb80: 20 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69        pPg = sqli
eb90: 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a  teMallocRaw( siz
eba0: 65 6f 66 28 2a 70 50 67 29 20 2b 20 53 51 4c 49  eof(*pPg) + SQLI
ebb0: 54 45 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20  TE_PAGE_SIZE .  
ebc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebd0: 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69              + si
ebe0: 7a 65 6f 66 28 75 33 32 29 20 2b 20 70 50 61 67  zeof(u32) + pPag
ebf0: 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20 20  er->nExtra.     
ec00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec10: 20 20 20 20 20 20 20 20 20 2b 20 70 50 61 67 65           + pPage
ec20: 72 2d 3e 6d 65 6d 44 62 2a 73 69 7a 65 6f 66 28  r->memDb*sizeof(
ec30: 50 67 48 69 73 74 6f 72 79 29 20 29 3b 0a 20 20  PgHistory) );.  
ec40: 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29      if( pPg==0 )
ec50: 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
ec60: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
ec70: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  er);.        pPa
ec80: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
ec90: 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 3b 0a 20  PAGER_ERR_MEM;. 
eca0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
ecb0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
ecc0: 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74    }.      memset
ecd0: 28 70 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (pPg, 0, sizeof(
ece0: 2a 70 50 67 29 29 3b 0a 20 20 20 20 20 20 69 66  *pPg));.      if
ecf0: 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20  ( pPager->memDb 
ed00: 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  ){.        memse
ed10: 74 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  t(PGHDR_TO_HIST(
ed20: 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c  pPg, pPager), 0,
ed30: 20 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72   sizeof(PgHistor
ed40: 79 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  y));.      }.   
ed50: 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d     pPg->pPager =
ed60: 20 70 50 61 67 65 72 3b 0a 20 20 20 20 20 20 70   pPager;.      p
ed70: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70  Pg->pNextAll = p
ed80: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20  Pager->pAll;.   
ed90: 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20     pPager->pAll 
eda0: 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 70 50 61  = pPg;.      pPa
edb0: 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20  ger->nPage++;.  
edc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
edd0: 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 74 6f  * Find a page to
ede0: 20 72 65 63 79 63 6c 65 2e 20 20 54 72 79 20 74   recycle.  Try t
edf0: 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20  o locate a page 
ee00: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20  that does not.  
ee10: 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75      ** require u
ee20: 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63  s to do an fsync
ee30: 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  () on the journa
ee40: 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
ee50: 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e    pPg = pPager->
ee60: 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20  pFirstSynced;.. 
ee70: 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 6f       /* If we co
ee80: 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70  uld not find a p
ee90: 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  age that does no
eea0: 74 20 72 65 71 75 69 72 65 20 61 6e 20 66 73 79  t require an fsy
eeb0: 6e 63 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  nc().      ** on
eec0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
eed0: 65 20 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65  e then fsync the
eee0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
eef0: 54 68 69 73 20 69 73 20 61 0a 20 20 20 20 20 20  This is a.      
ef00: 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65  ** very slow ope
ef10: 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f  ration, so we wo
ef20: 72 6b 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64  rk hard to avoid
ef30: 20 69 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69   it.  But someti
ef40: 6d 65 73 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  mes.      ** it 
ef50: 63 61 6e 27 74 20 62 65 20 68 65 6c 70 65 64 2e  can't be helped.
ef60: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
ef70: 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
ef80: 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73        int rc = s
ef90: 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
efa0: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  r, 0);.        i
efb0: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
efc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67        sqlite3pag
efd0: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
efe0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  er);.          r
eff0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
f000: 52 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  RR;.        }.  
f010: 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 61 67        pPg = pPag
f020: 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 20 20  er->pFirst;.    
f030: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
f040: 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
f050: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ;..      /* Writ
f060: 65 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68  e the page to th
f070: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
f080: 69 66 20 69 74 20 69 73 20 64 69 72 74 79 2e 0a  if it is dirty..
f090: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
f0a0: 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b  f( pPg->dirty ){
f0b0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
f0c0: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d   pPg->needSync==
f0d0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 67  0 );.        pPg
f0e0: 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
f0f0: 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
f100: 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
f110: 20 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20   pPg );.        
f120: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f130: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
f140: 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
f150: 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
f160: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
f170: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
f180: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
f190: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
f1a0: 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20  ->dirty==0 );.. 
f1b0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70       /* If the p
f1c0: 61 67 65 20 77 65 20 61 72 65 20 72 65 63 79 63  age we are recyc
f1d0: 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65 64 20 61  ling is marked a
f1e0: 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  s alwaysRollback
f1f0: 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
f200: 73 65 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 61  set the global a
f210: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c  lwaysRollback fl
f220: 61 67 2c 20 74 68 75 73 20 64 69 73 61 62 6c 69  ag, thus disabli
f230: 6e 67 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ng the.      ** 
f240: 73 71 6c 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c  sqlite_dont_roll
f250: 62 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74  back() optimizat
f260: 69 6f 6e 20 66 6f 72 20 74 68 65 20 72 65 73 74  ion for the rest
f270: 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   of this transac
f280: 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 49  tion..      ** I
f290: 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
f2a0: 6f 20 64 6f 20 74 68 69 73 20 62 65 63 61 75 73  o do this becaus
f2b0: 65 20 74 68 65 20 70 61 67 65 20 6d 61 72 6b 65  e the page marke
f2c0: 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  d alwaysRollback
f2d0: 0a 20 20 20 20 20 20 2a 2a 20 6d 69 67 68 74 20  .      ** might 
f2e0: 62 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20 61  be reloaded at a
f2f0: 20 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74 20   later time but 
f300: 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65  at that point we
f310: 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a   won't remember.
f320: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73        ** that is
f330: 20 77 61 73 20 6d 61 72 6b 65 64 20 61 6c 77 61   was marked alwa
f340: 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69  ysRollback.  Thi
f350: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6c 6c  s means that all
f360: 20 70 61 67 65 73 20 6d 75 73 74 0a 20 20 20 20   pages must.    
f370: 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61    ** be marked a
f380: 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  s alwaysRollback
f390: 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75   from here on ou
f3a0: 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
f3b0: 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79    if( pPg->alway
f3c0: 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  sRollback ){.   
f3d0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 6c 77       pPager->alw
f3e0: 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b  aysRollback = 1;
f3f0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
f400: 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c  /* Unlink the ol
f410: 64 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  d page from the 
f420: 66 72 65 65 20 6c 69 73 74 20 61 6e 64 20 74 68  free list and th
f430: 65 20 68 61 73 68 20 74 61 62 6c 65 0a 20 20 20  e hash table.   
f440: 20 20 20 2a 2f 0a 20 20 20 20 20 20 75 6e 6c 69     */.      unli
f450: 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  nkPage(pPg);.   
f460: 20 20 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c     pPager->nOvfl
f470: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  ++;.    }.    pP
f480: 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  g->pgno = pgno;.
f490: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
f4a0: 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69  aInJournal && (i
f4b0: 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  nt)pgno<=pPager-
f4c0: 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
f4d0: 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 65 63       sqlite3Chec
f4e0: 6b 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e  kMemory(pPager->
f4f0: 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f  aInJournal, pgno
f500: 2f 38 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  /8);.      asser
f510: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
f520: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20  alOpen );.      
f530: 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
f540: 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75   (pPager->aInJou
f550: 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28  rnal[pgno/8] & (
f560: 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30  1<<(pgno&7)))!=0
f570: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
f580: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d  dSync = 0;.    }
f590: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
f5a0: 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  >inJournal = 0;.
f5b0: 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
f5c0: 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ync = 0;.    }. 
f5d0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61     if( pPager->a
f5e0: 49 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70  InStmt && (int)p
f5f0: 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d  gno<=pPager->stm
f600: 74 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20  tSize.          
f610: 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 61     && (pPager->a
f620: 49 6e 53 74 6d 74 5b 70 67 6e 6f 2f 38 5d 20 26  InStmt[pgno/8] &
f630: 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21   (1<<(pgno&7)))!
f640: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  =0 ){.      page
f650: 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
f660: 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73  t(pPg);.    }els
f670: 65 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 72 65  e{.      page_re
f680: 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c  move_from_stmt_l
f690: 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ist(pPg);.    }.
f6a0: 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
f6b0: 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65   0;.    pPg->nRe
f6c0: 66 20 3d 20 31 3b 0a 20 20 20 20 52 45 46 49 4e  f = 1;.    REFIN
f6d0: 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 70 50 61  FO(pPg);.    pPa
f6e0: 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  ger->nRef++;.   
f6f0: 20 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28   h = pager_hash(
f700: 70 67 6e 6f 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pgno);.    pPg->
f710: 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61 67  pNextHash = pPag
f720: 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20  er->aHash[h];.  
f730: 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b    pPager->aHash[
f740: 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66  h] = pPg;.    if
f750: 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  ( pPg->pNextHash
f760: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
f770: 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  ( pPg->pNextHash
f780: 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29  ->pPrevHash==0 )
f790: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65  ;.      pPg->pNe
f7a0: 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73  xtHash->pPrevHas
f7b0: 68 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20  h = pPg;.    }. 
f7c0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
f7d0: 45 78 74 72 61 3e 30 20 29 7b 0a 20 20 20 20 20  Extra>0 ){.     
f7e0: 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
f7f0: 5f 45 58 54 52 41 28 70 50 67 29 2c 20 30 2c 20  _EXTRA(pPg), 0, 
f800: 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
f810: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
f820: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20  Pager->dbSize<0 
f830: 29 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70  ) sqlite3pager_p
f840: 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
f850: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
f860: 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a  ->errMask!=0 ){.
f870: 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67        sqlite3pag
f880: 65 72 5f 75 6e 72 65 66 28 50 47 48 44 52 5f 54  er_unref(PGHDR_T
f890: 4f 5f 44 41 54 41 28 70 50 67 29 29 3b 0a 20 20  O_DATA(pPg));.  
f8a0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
f8b0: 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a  rrcode(pPager);.
f8c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
f8d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
f8e0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69  Pager->dbSize<(i
f8f0: 6e 74 29 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20  nt)pgno ){.     
f900: 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
f910: 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 53  _DATA(pPg), 0, S
f920: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
f930: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
f940: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
f950: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
f960: 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20  >memDb==0 );.   
f970: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b     sqlite3OsSeek
f980: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70  (&pPager->fd, (p
f990: 67 6e 6f 2d 31 29 2a 28 6f 66 66 5f 74 29 53 51  gno-1)*(off_t)SQ
f9a0: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
f9b0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
f9c0: 74 65 33 4f 73 52 65 61 64 28 26 70 50 61 67 65  te3OsRead(&pPage
f9d0: 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f  r->fd, PGHDR_TO_
f9e0: 44 41 54 41 28 70 50 67 29 2c 20 53 51 4c 49 54  DATA(pPg), SQLIT
f9f0: 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  E_PAGE_SIZE);.  
fa00: 20 20 20 20 54 52 41 43 45 32 28 22 46 45 54 43      TRACE2("FETC
fa10: 48 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50  H page %d\n", pP
fa20: 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
fa30: 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 50 47  CODEC(pPager, PG
fa40: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
fa50: 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b  , pPg->pgno, 3);
fa60: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
fa70: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fa80: 20 20 20 20 6f 66 66 5f 74 20 66 69 6c 65 53 69      off_t fileSi
fa90: 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
faa0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
fab0: 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 26 66  e(&pPager->fd,&f
fac0: 69 6c 65 53 69 7a 65 29 21 3d 53 51 4c 49 54 45  ileSize)!=SQLITE
fad0: 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20  _OK.            
fae0: 20 20 20 7c 7c 20 66 69 6c 65 53 69 7a 65 3e 3d     || fileSize>=
faf0: 70 67 6e 6f 2a 53 51 4c 49 54 45 5f 50 41 47 45  pgno*SQLITE_PAGE
fb00: 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  _SIZE ){.       
fb10: 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
fb20: 75 6e 72 65 66 28 50 47 48 44 52 5f 54 4f 5f 44  unref(PGHDR_TO_D
fb30: 41 54 41 28 70 50 67 29 29 3b 0a 20 20 20 20 20  ATA(pPg));.     
fb40: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
fb50: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
fb60: 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28           memset(
fb70: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
fb80: 67 29 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50 41  g), 0, SQLITE_PA
fb90: 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  GE_SIZE);.      
fba0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
fbb0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
fbc0: 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
fbd0: 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 70  page is in the p
fbe0: 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  age cache. */.  
fbf0: 20 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 2b 2b    pPager->nHit++
fc00: 3b 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28 70  ;.    page_ref(p
fc10: 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61  Pg);.  }.  *ppPa
fc20: 67 65 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41  ge = PGHDR_TO_DA
fc30: 54 41 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72  TA(pPg);.  retur
fc40: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
fc50: 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
fc60: 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c  page if it is al
fc70: 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d  ready in the in-
fc80: 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44  memory cache.  D
fc90: 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68  o.** not read th
fca0: 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b  e page from disk
fcb0: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
fcc0: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c  ter to the page,
fcd0: 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20  .** or 0 if the 
fce0: 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
fcf0: 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  ache..**.** See 
fd00: 61 6c 73 6f 20 73 71 6c 69 74 65 33 70 61 67 65  also sqlite3page
fd10: 72 5f 67 65 74 28 29 2e 20 20 54 68 65 20 64 69  r_get().  The di
fd20: 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
fd30: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
fd40: 20 61 6e 64 20 73 71 6c 69 74 65 33 70 61 67 65   and sqlite3page
fd50: 72 5f 67 65 74 28 29 20 69 73 20 74 68 61 74 20  r_get() is that 
fd60: 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74  _get() will go t
fd70: 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72  o the disk and r
fd80: 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61  ead.** in the pa
fd90: 67 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ge if the page i
fda0: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e  s not already in
fdb0: 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f   cache.  This ro
fdc0: 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73  utine.** returns
fdd0: 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67   NULL if the pag
fde0: 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
fdf0: 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49  e or if a disk I
fe00: 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73  /O error .** has
fe10: 20 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a   ever happened..
fe20: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
fe30: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67  pager_lookup(Pag
fe40: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
fe50: 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
fe60: 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pPg;..  assert(
fe70: 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
fe80: 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
fe90: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
fea0: 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47  >errMask & ~(PAG
feb0: 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a  ER_ERR_FULL) ){.
fec0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
fed0: 7d 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  }.  pPg = pager_
fee0: 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
fef0: 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d  gno);.  if( pPg=
ff00: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
ff10: 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
ff20: 20 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54    return PGHDR_T
ff30: 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a  O_DATA(pPg);.}..
ff40: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
ff50: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  page..**.** If t
ff60: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
ff70: 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
ff80: 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f  age drop to zero
ff90: 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61  , then the.** pa
ffa0: 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ge is added to t
ffb0: 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68  he LRU list.  Wh
ffc0: 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  en all reference
ffd0: 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a  s to all pages.*
ffe0: 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20  * are released, 
fff0: 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
10000 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  s and the lock o
10010 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
10020 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f  s.** removed..*/
10030 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
10040 72 5f 75 6e 72 65 66 28 76 6f 69 64 20 2a 70 44  r_unref(void *pD
10050 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
10060 50 67 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d  Pg;..  /* Decrem
10070 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
10080 65 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73  e count for this
10090 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 70 50 67   page.  */.  pPg
100a0 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
100b0 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72  (pData);.  asser
100c0 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
100d0 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pPg->nRef--;
100e0 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b  .  REFINFO(pPg);
100f0 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20  ..  /* When the 
10100 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
10110 6e 63 65 73 20 74 6f 20 61 20 70 61 67 65 20 72  nces to a page r
10120 65 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65  each 0, call the
10130 0a 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72  .  ** destructor
10140 20 61 6e 64 20 61 64 64 20 74 68 65 20 70 61 67   and add the pag
10150 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  e to the freelis
10160 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  t..  */.  if( pP
10170 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
10180 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
10190 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 70 50  .    pPager = pP
101a0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70  g->pPager;.    p
101b0 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  Pg->pNextFree = 
101c0 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65  0;.    pPg->pPre
101d0 76 46 72 65 65 20 3d 20 70 50 61 67 65 72 2d 3e  vFree = pPager->
101e0 70 4c 61 73 74 3b 0a 20 20 20 20 70 50 61 67 65  pLast;.    pPage
101f0 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a  r->pLast = pPg;.
10200 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72      if( pPg->pPr
10210 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  evFree ){.      
10220 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e  pPg->pPrevFree->
10230 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 3b  pNextFree = pPg;
10240 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10250 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
10260 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
10270 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53    if( pPg->needS
10280 79 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72  ync==0 && pPager
10290 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d  ->pFirstSynced==
102a0 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  0 ){.      pPage
102b0 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
102c0 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
102d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65   if( pPager->xDe
102e0 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20  structor ){.    
102f0 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72    pPager->xDestr
10300 75 63 74 6f 72 28 70 44 61 74 61 2c 20 70 50 61  uctor(pData, pPa
10310 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
10320 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
10330 57 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 72  When all pages r
10340 65 61 63 68 20 74 68 65 20 66 72 65 65 6c 69 73  each the freelis
10350 74 2c 20 64 72 6f 70 20 74 68 65 20 72 65 61 64  t, drop the read
10360 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a   lock from.    *
10370 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
10380 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
10390 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a  pPager->nRef--;.
103a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
103b0 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20  er->nRef>=0 );. 
103c0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
103d0 52 65 66 3d 3d 30 20 26 26 20 21 70 50 61 67 65  Ref==0 && !pPage
103e0 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
103f0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
10400 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
10410 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10420 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
10430 65 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66  eate a journal f
10440 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20  ile for pPager. 
10450 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c   There should al
10460 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52  ready be a RESER
10470 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53  VED.** or EXCLUS
10480 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
10490 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
104a0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
104b0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
104c0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
104d0 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e  K if everything.
104e0 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f    Return an erro
104f0 72 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61  r code and relea
10500 73 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20  se the.** write 
10510 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67  lock if anything
10520 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a   goes wrong..*/.
10530 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
10540 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61  _open_journal(Pa
10550 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
10560 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
10570 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  ( !pPager->memDb
10580 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
10590 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
105a0 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
105b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
105c0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
105d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
105e0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
105f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  );.  sqlite3page
10600 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67  r_pagecount(pPag
10610 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  er);.  pPager->a
10620 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  InJournal = sqli
10630 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72  teMalloc( pPager
10640 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29  ->dbSize/8 + 1 )
10650 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
10660 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b  aInJournal==0 ){
10670 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e  .    sqlite3OsUn
10680 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  lock(&pPager->fd
10690 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
106a0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
106b0 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
106c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
106d0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
106e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
106f0 70 65 6e 45 78 63 6c 75 73 69 76 65 28 70 50 61  penExclusive(pPa
10700 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26  ger->zJournal, &
10710 70 50 61 67 65 72 2d 3e 6a 66 64 2c 70 50 61 67  pPager->jfd,pPag
10720 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20  er->tempFile);. 
10730 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10740 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
10750 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e  Free(pPager->aIn
10760 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50  Journal);.    pP
10770 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
10780 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
10790 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  3OsUnlock(&pPage
107a0 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
107b0 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  CK);.    pPager-
107c0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
107d0 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72  HARED;.    retur
107e0 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
107f0 4e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  N;.  }.  sqlite3
10800 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  OsOpenDirectory(
10810 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
10820 72 79 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  ry, &pPager->jfd
10830 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  );.  pPager->jou
10840 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  rnalOpen = 1;.  
10850 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
10860 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 70 50  tarted = 0;.  pP
10870 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
10880 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c   0;.  pPager->al
10890 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30  waysRollback = 0
108a0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  ;.  pPager->nRec
108b0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
108c0 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29  er->errMask!=0 )
108d0 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
108e0 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29  _errcode(pPager)
108f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
10900 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f  .  }.  pPager->o
10910 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67  rigDbSize = pPag
10920 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 2f  er->dbSize;..  /
10930 2a 20 43 72 65 61 74 65 20 74 68 65 20 68 65 61  * Create the hea
10940 64 65 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  der for the jour
10950 6e 61 6c 3a 0a 20 20 2a 2a 20 2d 20 38 20 62 79  nal:.  ** - 8 by
10960 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74  tes: Magic ident
10970 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  ifying journal f
10980 6f 72 6d 61 74 2e 0a 20 20 2a 2a 20 2d 20 34 20  ormat..  ** - 4 
10990 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66  bytes: Number of
109a0 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72   records in jour
109b0 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79  nal, or -1 no-sy
109c0 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 20  nc mode is on.. 
109d0 20 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4d   ** - 4 bytes: M
109e0 61 67 69 63 20 75 73 65 64 20 66 6f 72 20 70 61  agic used for pa
109f0 67 65 20 63 68 65 63 6b 73 75 6d 73 2e 0a 20 20  ge checksums..  
10a00 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e  ** - 4 bytes: In
10a10 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70  itial database p
10a20 61 67 65 20 63 6f 75 6e 74 2e 0a 20 20 2a 2a 20  age count..  ** 
10a30 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65  - 4 bytes: Numbe
10a40 72 20 6f 66 20 62 79 74 65 73 20 72 65 73 65 72  r of bytes reser
10a50 76 65 64 20 66 6f 72 20 6d 61 73 74 65 72 20 6a  ved for master j
10a60 6f 75 72 6e 61 6c 20 70 74 72 20 28 6e 4d 61 73  ournal ptr (nMas
10a70 74 65 72 29 0a 20 20 2a 2a 20 2d 20 6e 4d 61 73  ter).  ** - nMas
10a80 74 65 72 20 62 79 74 65 73 3a 20 53 70 61 63 65  ter bytes: Space
10a90 20 66 6f 72 20 61 20 6d 61 73 74 65 72 20 6a 6f   for a master jo
10aa0 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2e 0a 20  urnal pointer.. 
10ab0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
10ac0 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67 65  e3OsWrite(&pPage
10ad0 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c  r->jfd, aJournal
10ae0 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
10af0 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
10b00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10b10 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77  OK ){.    rc = w
10b20 72 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67  rite32bits(&pPag
10b30 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
10b40 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66 66 66  >noSync ? 0xffff
10b50 66 66 66 66 20 3a 20 30 29 3b 0a 20 20 7d 0a 20  ffff : 0);.  }. 
10b60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10b70 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
10b80 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  3Randomness(size
10b90 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  of(pPager->cksum
10ba0 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e  Init), &pPager->
10bb0 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 20 20  cksumInit);.    
10bc0 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
10bd0 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  (&pPager->jfd, p
10be0 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
10bf0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
10c00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10c10 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
10c20 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
10c30 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
10c40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
10c50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10c60 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
10c70 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
10c80 70 50 61 67 65 72 2d 3e 6e 4d 61 73 74 65 72 29  pPager->nMaster)
10c90 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
10ca0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10cb0 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
10cc0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 32 34 20  pPager->jfd, 24 
10cd0 2b 20 70 50 61 67 65 72 2d 3e 6e 4d 61 73 74 65  + pPager->nMaste
10ce0 72 20 2d 20 31 29 3b 0a 20 20 20 20 72 63 20 3d  r - 1);.    rc =
10cf0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
10d00 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22 5c  &pPager->jfd, "\
10d10 30 30 30 22 2c 20 31 29 3b 0a 20 20 7d 0a 20 20  000", 1);.  }.  
10d20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
10d30 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d  Autoopen && rc==
10d40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10d50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
10d60 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28 70 50  er_stmt_begin(pP
10d70 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
10d80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10d90 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
10da0 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
10db0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
10dc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
10dd0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
10de0 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d  _FULL;.    }.  }
10df0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a  .  return rc;  .
10e00 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
10e10 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
10e20 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
10e30 54 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f  The lock is remo
10e40 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ved when.** the 
10e50 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
10e60 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a  wing happen:.**.
10e70 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70  **   *  sqlite3p
10e80 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20 69 73  ager_commit() is
10e90 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
10ea0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
10eb0 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c  llback() is call
10ec0 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
10ed0 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29  te3pager_close()
10ee0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
10ef0 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72   *  sqlite3pager
10f00 5f 75 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c  _unref() is call
10f10 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f  ed to on every o
10f20 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e  utstanding page.
10f30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
10f40 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
10f50 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
10f60 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f  pointer to any o
10f70 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a  pen page of the.
10f80 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
10f90 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67  .  Nothing chang
10fa0 65 73 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  es about the pag
10fb0 65 20 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d  e - it is used m
10fc0 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75  erely to.** acqu
10fd0 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ire a pointer to
10fe0 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
10ff0 74 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f  ture and as proo
11000 66 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a  f that there is.
11010 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  ** already a rea
11020 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d-lock on the da
11030 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
11040 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
11050 65 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77  er indicates how
11060 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20 62   much space in b
11070 79 74 65 73 20 74 6f 20 72 65 73 65 72 76 65 20  ytes to reserve 
11080 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20  for a.** master 
11090 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d  journal file-nam
110a0 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
110b0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68  f the journal wh
110c0 65 6e 20 69 74 20 69 73 20 63 72 65 61 74 65 64  en it is created
110d0 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61  ..**.** A journa
110e0 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
110f0 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   if this is not 
11100 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
11110 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  .  For temporary
11120 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f  .** files, the o
11130 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f  pening of the jo
11140 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65  urnal file is de
11150 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65  ferred until the
11160 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75  re is an.** actu
11170 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65  al need to write
11180 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
11190 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
111a0 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64  tabase is alread
111b0 79 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77  y reserved for w
111c0 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75  riting, this rou
111d0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
111e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
111f0 61 67 65 72 5f 62 65 67 69 6e 28 76 6f 69 64 20  ager_begin(void 
11200 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 4d 61 73  *pData, int nMas
11210 74 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ter){.  PgHdr *p
11220 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
11230 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67  DR(pData);.  Pag
11240 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
11250 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
11260 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11270 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
11280 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  Ref>0 );.  asser
11290 74 28 20 6e 4d 61 73 74 65 72 3e 3d 30 20 29 3b  t( nMaster>=0 );
112a0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
112b0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
112c0 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  UNLOCK );.  if( 
112d0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
112e0 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20  AGER_SHARED ){. 
112f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
11300 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
11310 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
11320 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
11330 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
11340 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
11350 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  VE;.      pPager
11360 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70  ->origDbSize = p
11370 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
11380 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11390 69 6e 74 20 62 75 73 79 20 3d 20 31 3b 0a 20 20  int busy = 1;.  
113a0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20      do {.       
113b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
113c0 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
113d0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b   RESERVED_LOCK);
113e0 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 72  .      }while( r
113f0 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
11400 26 20 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  & .          pPa
11410 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
11420 72 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  r && .          
11430 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
11440 64 6c 65 72 2d 3e 78 46 75 6e 63 20 26 26 20 0a  dler->xFunc && .
11450 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
11460 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e  ->pBusyHandler->
11470 78 46 75 6e 63 28 70 50 61 67 65 72 2d 3e 70 42  xFunc(pPager->pB
11480 75 73 79 48 61 6e 64 6c 65 72 2d 3e 70 41 72 67  usyHandler->pArg
11490 2c 20 62 75 73 79 2b 2b 29 0a 20 20 20 20 20 20  , busy++).      
114a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
114b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
114c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
114d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
114e0 50 61 67 65 72 2d 3e 6e 4d 61 73 74 65 72 20 3d  Pager->nMaster =
114f0 20 6e 4d 61 73 74 65 72 3b 0a 20 20 20 20 20 20   nMaster;.      
11500 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
11510 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a  PAGER_RESERVED;.
11520 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69        pPager->di
11530 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20  rtyCache = 0;.  
11540 20 20 20 20 54 52 41 43 45 33 28 22 54 52 41 4e      TRACE3("TRAN
11550 53 41 43 54 49 4f 4e 20 25 64 20 6e 4d 61 73 74  SACTION %d nMast
11560 65 72 3d 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  er=%d\n", pPager
11570 2d 3e 66 64 2e 68 2c 20 6e 4d 61 73 74 65 72 29  ->fd.h, nMaster)
11580 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
11590 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26  er->useJournal &
115a0 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
115b0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ile ){.        r
115c0 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  c = pager_open_j
115d0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
115e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
115f0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
11600 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64  ../*.** Mark a d
11610 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74  ata page as writ
11620 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65  eable.  The page
11630 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
11640 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a   the journal .**
11650 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
11660 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68  ere already.  Th
11670 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  is routine must 
11680 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  be called before
11690 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67   making.** chang
116a0 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a  es to a page..**
116b0 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69  .** The first ti
116c0 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  me this routine 
116d0 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
116e0 61 67 65 72 20 63 72 65 61 74 65 73 20 61 20 6e  ager creates a n
116f0 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  ew.** journal an
11700 64 20 61 63 71 75 69 72 65 73 20 61 20 52 45 53  d acquires a RES
11710 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
11720 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 20  e database.  If 
11730 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a 20  the RESERVED.** 
11740 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62  lock could not b
11750 65 20 61 63 71 75 69 72 65 64 2c 20 74 68 69 73  e acquired, this
11760 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
11770 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54   SQLITE_BUSY.  T
11780 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f  he.** calling ro
11790 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b  utine must check
117a0 20 66 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e   for that return
117b0 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61   value and be ca
117c0 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20  reful not to.** 
117d0 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20  change any page 
117e0 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20  data until this 
117f0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
11800 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
11810 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
11820 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62  file could not b
11830 65 20 77 72 69 74 74 65 6e 20 62 65 63 61 75 73  e written becaus
11840 65 20 74 68 65 20 64 69 73 6b 20 69 73 20 66 75  e the disk is fu
11850 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73  ll,.** then this
11860 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
11870 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64   SQLITE_FULL and
11880 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61   does an immedia
11890 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20  te rollback..** 
118a0 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77  All subsequent w
118b0 72 69 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c  rite attempts al
118c0 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  so return SQLITE
118d0 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72  _FULL until ther
118e0 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74  e.** is a call t
118f0 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63  o sqlite3pager_c
11900 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74  ommit() or sqlit
11910 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
11920 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a  () to.** reset..
11930 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
11940 67 65 72 5f 77 72 69 74 65 28 76 6f 69 64 20 2a  ger_write(void *
11950 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
11960 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50  *pPg = DATA_TO_P
11970 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50  GHDR(pData);.  P
11980 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
11990 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
119a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
119b0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  ;..  /* Check fo
119c0 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20  r errors.  */.  
119d0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
119e0 61 73 6b 20 29 7b 20 0a 20 20 20 20 72 65 74 75  ask ){ .    retu
119f0 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65  rn pager_errcode
11a00 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
11a10 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64  if( pPager->read
11a20 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75  Only ){.    retu
11a30 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
11a40 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74    }..  /* Mark t
11a50 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
11a60 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68  .  If the page h
11a70 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
11a80 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20  written.  ** to 
11a90 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e  the journal then
11aa0 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72   we can return r
11ab0 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a  ight away..  */.
11ac0 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31    pPg->dirty = 1
11ad0 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a  ;.  if( pPg->inJ
11ae0 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 67 2d 3e  ournal && (pPg->
11af0 69 6e 53 74 6d 74 20 7c 7c 20 70 50 61 67 65 72  inStmt || pPager
11b00 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20  ->stmtInUse==0) 
11b10 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
11b20 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20  irtyCache = 1;. 
11b30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11b40 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  _OK;.  }..  /* I
11b50 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61  f we get this fa
11b60 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  r, it means that
11b70 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20   the page needs 
11b80 74 6f 20 62 65 0a 20 20 2a 2a 20 77 72 69 74 74  to be.  ** writt
11b90 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61  en to the transa
11ba0 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72  ction journal or
11bb0 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20   the ckeckpoint 
11bc0 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 6f 72 20  journal.  ** or 
11bd0 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  both..  **.  ** 
11be0 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73  First check to s
11bf0 65 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e  ee that the tran
11c00 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
11c10 65 78 69 73 74 73 20 61 6e 64 0a 20 20 2a 2a 20  exists and.  ** 
11c20 63 72 65 61 74 65 20 69 74 20 69 66 20 69 74 20  create it if it 
11c30 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20  does not..  */. 
11c40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11c50 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
11c60 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20 73  LOCK );.  rc = s
11c70 71 6c 69 74 65 33 70 61 67 65 72 5f 62 65 67 69  qlite3pager_begi
11c80 6e 28 70 44 61 74 61 2c 20 30 29 3b 0a 20 20 69  n(pData, 0);.  i
11c90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11ca0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
11cb0 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
11cc0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
11cd0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
11ce0 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
11cf0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20  >journalOpen && 
11d00 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
11d10 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  al ){.    rc = p
11d20 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
11d30 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  l(pPager);.    i
11d40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11d50 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
11d60 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
11d70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
11d80 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a  || !pPager->useJ
11d90 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 70 50 61 67  ournal );.  pPag
11da0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
11db0 20 31 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74 72   1;..  /* The tr
11dc0 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
11dd0 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64  l now exists and
11de0 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52   we have a RESER
11df0 56 45 44 20 6f 72 20 61 6e 0a 20 20 2a 2a 20 45  VED or an.  ** E
11e00 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
11e10 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
11e20 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20  se file.  Write 
11e30 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
11e40 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 74 72 61   to.  ** the tra
11e50 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
11e60 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
11e70 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 2a  ere already..  *
11e80 2f 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e  /.  if( !pPg->in
11e90 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61 67  Journal && (pPag
11ea0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 7c  er->useJournal |
11eb0 7c 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 29  | pPager->memDb)
11ec0 20 29 7b 0a 20 20 20 20 69 66 28 20 28 69 6e 74   ){.    if( (int
11ed0 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50  )pPg->pgno <= pP
11ee0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
11ef0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   ){.      int sz
11f00 50 67 3b 0a 20 20 20 20 20 20 75 33 32 20 73 61  Pg;.      u32 sa
11f10 76 65 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ved;.      if( p
11f20 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
11f30 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72          PgHistor
11f40 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
11f50 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
11f60 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 54  ager);.        T
11f70 52 41 43 45 32 28 22 4a 4f 55 52 4e 41 4c 20 70  RACE2("JOURNAL p
11f80 61 67 65 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e  age %d\n", pPg->
11f90 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 61  pgno);.        a
11fa0 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 4f  ssert( pHist->pO
11fb0 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rig==0 );.      
11fc0 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d    pHist->pOrig =
11fd0 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
11fe0 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ( pPager->pageSi
11ff0 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ze );.        if
12000 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29  ( pHist->pOrig )
12010 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
12020 70 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c  py(pHist->pOrig,
12030 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
12040 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg), pPager->pag
12050 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
12060 7d 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 69  }.        pPg->i
12070 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
12080 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12090 20 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70     u32 cksum = p
120a0 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
120b0 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 44  r, pPg->pgno, pD
120c0 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 73 61  ata);.        sa
120d0 76 65 64 20 3d 20 2a 28 75 33 32 2a 29 50 47 48  ved = *(u32*)PGH
120e0 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 29  DR_TO_EXTRA(pPg)
120f0 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 33  ;.        store3
12100 32 62 69 74 73 28 63 6b 73 75 6d 2c 20 70 50 67  2bits(cksum, pPg
12110 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
12120 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 50  ZE);.        szP
12130 67 20 3d 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  g = SQLITE_PAGE_
12140 53 49 5a 45 2b 38 3b 0a 20 20 20 20 20 20 20 20  SIZE+8;.        
12150 73 74 6f 72 65 33 32 62 69 74 73 28 70 50 67 2d  store32bits(pPg-
12160 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b  >pgno, pPg, -4);
12170 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 28 70  .        CODEC(p
12180 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
12190 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20  g->pgno, 7);.   
121a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
121b0 33 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72  3OsWrite(&pPager
121c0 2d 3e 6a 66 64 2c 20 26 28 28 63 68 61 72 2a 29  ->jfd, &((char*)
121d0 70 44 61 74 61 29 5b 2d 34 5d 2c 20 73 7a 50 67  pData)[-4], szPg
121e0 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  );.        TRACE
121f0 33 28 22 4a 4f 55 52 4e 41 4c 20 70 61 67 65 20  3("JOURNAL page 
12200 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e  %d needSync=%d\n
12210 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ", pPg->pgno, pP
12220 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20  g->needSync);.  
12230 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
12240 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
12250 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20  pgno, 0);.      
12260 20 20 2a 28 75 33 32 2a 29 50 47 48 44 52 5f 54    *(u32*)PGHDR_T
12270 4f 5f 45 58 54 52 41 28 70 50 67 29 20 3d 20 73  O_EXTRA(pPg) = s
12280 61 76 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66  aved;.        if
12290 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
122a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
122b0 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
122c0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
122d0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
122e0 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
122f0 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20  RR_FULL;.       
12300 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12310 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12320 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a  pPager->nRec++;.
12330 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
12340 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
12350 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  al!=0 );.       
12360 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
12370 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  nal[pPg->pgno/8]
12380 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
12390 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 70 50  o&7);.        pP
123a0 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  g->needSync = !p
123b0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20  Pager->noSync;. 
123c0 20 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f         pPg->inJo
123d0 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 20  urnal = 1;.     
123e0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
123f0 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
12400 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
12410 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
12420 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
12430 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20  gno&7);.        
12440 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
12450 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
12460 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
12470 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12480 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
12490 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
124a0 6c 53 74 61 72 74 65 64 20 26 26 20 21 70 50 61  lStarted && !pPa
124b0 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20  ger->noSync;.   
124c0 20 20 20 54 52 41 43 45 33 28 22 41 50 50 45 4e     TRACE3("APPEN
124d0 44 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  D page %d needSy
124e0 6e 63 3d 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70  nc=%d\n", pPg->p
124f0 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
12500 6e 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nc);.    }.    i
12510 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  f( pPg->needSync
12520 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
12530 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
12540 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
12550 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
12560 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e   journal is open
12570 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
12580 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 2a 2a   not in it,.  **
12590 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
125a0 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20  current page to 
125b0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
125c0 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61  urnal.  Note tha
125d0 74 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65  t.  ** the state
125e0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  ment journal for
125f0 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d  mat differs from
12600 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f   the standard jo
12610 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 2a  urnal format.  *
12620 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69  * in that it omi
12630 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  ts the checksums
12640 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e   and the header.
12650 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
12660 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26  er->stmtInUse &&
12670 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26   !pPg->inStmt &&
12680 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c   (int)pPg->pgno<
12690 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a  =pPager->stmtSiz
126a0 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
126b0 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
126c0 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  || (int)pPg->pgn
126d0 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  o>pPager->origDb
126e0 53 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20  Size );.    if( 
126f0 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
12700 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79  .      PgHistory
12710 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
12720 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
12730 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ger);.      asse
12740 72 74 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  rt( pHist->pStmt
12750 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 48 69  ==0 );.      pHi
12760 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69  st->pStmt = sqli
12770 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61  teMallocRaw( pPa
12780 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  ger->pageSize );
12790 0a 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74  .      if( pHist
127a0 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
127b0 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d     memcpy(pHist-
127c0 3e 70 53 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f  >pStmt, PGHDR_TO
127d0 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67  _DATA(pPg), pPag
127e0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
127f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41       }.      TRA
12800 43 45 32 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE2("STMT-JOURNA
12810 4c 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50  L page %d\n", pP
12820 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 65  g->pgno);.    }e
12830 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 6f 72 65  lse{.      store
12840 33 32 62 69 74 73 28 70 50 67 2d 3e 70 67 6e 6f  32bits(pPg->pgno
12850 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20 20 20  , pPg, -4);.    
12860 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20    CODEC(pPager, 
12870 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
12880 2c 20 37 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  , 7);.      rc =
12890 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
128a0 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 28  &pPager->stfd, (
128b0 28 63 68 61 72 2a 29 70 44 61 74 61 29 2d 34 2c  (char*)pData)-4,
128c0 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
128d0 45 2b 34 29 3b 0a 20 20 20 20 20 20 54 52 41 43  E+4);.      TRAC
128e0 45 32 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E2("STMT-JOURNAL
128f0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50 67   page %d\n", pPg
12900 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43  ->pgno);.      C
12910 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61  ODEC(pPager, pDa
12920 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 30  ta, pPg->pgno, 0
12930 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
12940 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12950 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67        sqlite3pag
12960 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
12970 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  er);.        pPa
12980 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
12990 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a  PAGER_ERR_FULL;.
129a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
129b0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
129c0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
129d0 63 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  c++;.      asser
129e0 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  t( pPager->aInSt
129f0 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  mt!=0 );.      p
12a00 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70  Pager->aInStmt[p
12a10 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
12a20 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
12a30 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 5f  .    }.    page_
12a40 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
12a50 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  (pPg);.  }..  /*
12a60 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61   Update the data
12a70 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65  base size and re
12a80 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  turn..  */.  if(
12a90 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
12aa0 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29  (int)pPg->pgno )
12ab0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
12ac0 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Size = pPg->pgno
12ad0 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
12ae0 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70 50 61 67  r->memDb && pPag
12af0 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44  er->dbSize==PEND
12b00 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d  ING_BYTE/pPager-
12b10 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
12b20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
12b30 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e++;.    }.  }. 
12b40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12b50 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
12b60 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76   if the page giv
12b70 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
12b80 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  nt was previousl
12b90 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73  y passed.** to s
12ba0 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
12bb0 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  e().  In other w
12bc0 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55  ords, return TRU
12bd0 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a  E if it is ok.**
12be0 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63   to change the c
12bf0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
12c00 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ge..*/.int sqlit
12c10 65 33 70 61 67 65 72 5f 69 73 77 72 69 74 65 61  e3pager_iswritea
12c20 62 6c 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ble(void *pData)
12c30 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
12c40 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
12c50 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20  Data);.  return 
12c60 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 0a 2f  pPg->dirty;.}../
12c70 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65  *.** Replace the
12c80 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73 69   content of a si
12c90 6e 67 6c 65 20 70 61 67 65 20 77 69 74 68 20 74  ngle page with t
12ca0 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  he information i
12cb0 6e 20 74 68 65 20 74 68 69 72 64 0a 2a 2a 20 61  n the third.** a
12cc0 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
12cd0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 76 65  sqlite3pager_ove
12ce0 72 77 72 69 74 65 28 50 61 67 65 72 20 2a 70 50  rwrite(Pager *pP
12cf0 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  ager, Pgno pgno,
12d00 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20   void *pData){. 
12d10 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20   void *pPage;.  
12d20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
12d30 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
12d40 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26  (pPager, pgno, &
12d50 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
12d60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
12d70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
12d80 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
12d90 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
12da0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12db0 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2c 20    memcpy(pPage, 
12dc0 70 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 50 41  pData, SQLITE_PA
12dd0 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a  GE_SIZE);.    }.
12de0 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
12df0 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  _unref(pPage);. 
12e00 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
12e10 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20  }../*.** A call 
12e20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
12e30 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20  tells the pager 
12e40 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e  that it is not n
12e50 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77  ecessary to.** w
12e60 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61  rite the informa
12e70 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70 67  tion on page "pg
12e80 6e 6f 22 20 62 61 63 6b 20 74 6f 20 74 68 65 20  no" back to the 
12e90 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67  disk, even thoug
12ea0 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d  h.** that page m
12eb0 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61  ight be marked a
12ec0 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54  s dirty..**.** T
12ed0 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66  he overlying sof
12ee0 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c  tware layer call
12ef0 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
12f00 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64  hen all of the d
12f10 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69  ata.** on the gi
12f20 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73  ven page is unus
12f30 65 64 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d  ed.  The pager m
12f40 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73  arks the page as
12f50 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61   clean so.** tha
12f60 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65  t it does not ge
12f70 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  t written to dis
12f80 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73  k..**.** Tests s
12f90 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70  how that this op
12fa0 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65  timization, toge
12fb0 74 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a  ther with the.**
12fc0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f   sqlite3pager_do
12fd0 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 62 65  nt_rollback() be
12fe0 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64  low, more than d
12ff0 6f 75 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a  ouble the speed.
13000 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45  ** of large INSE
13010 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e  RT operations an
13020 64 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20  d quadruple the 
13030 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44  speed of large D
13040 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68  ELETEs..**.** Wh
13050 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
13060 69 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74  is called, set t
13070 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  he alwaysRollbac
13080 6b 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a  k flag to true..
13090 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61  ** Subsequent ca
130a0 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 70 61  lls to sqlite3pa
130b0 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  ger_dont_rollbac
130c0 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d 65  k() for the same
130d0 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68   page.** will th
130e0 65 72 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f  ereafter be igno
130f0 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 6e 65  red.  This is ne
13100 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64  cessary to avoid
13110 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68   a problem.** wh
13120 65 72 65 20 61 20 70 61 67 65 20 77 69 74 68 20  ere a page with 
13130 64 61 74 61 20 69 73 20 61 64 64 65 64 20 74 6f  data is added to
13140 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75   the freelist du
13150 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f 66  ring one part of
13160 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f  .** a transactio
13170 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20 66  n then removed f
13180 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74  rom the freelist
13190 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72 20   during a later 
131a0 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73  part.** of the s
131b0 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ame transaction 
131c0 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20 73  and reused for s
131d0 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73  ome other purpos
131e0 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69  e.  When it.** i
131f0 73 20 66 69 72 73 74 20 61 64 64 65 64 20 74 6f  s first added to
13200 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 74   the freelist, t
13210 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
13220 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65 75  alled.  When reu
13230 73 65 64 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e 74  sed,.** the dont
13240 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74  _rollback() rout
13250 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20  ine is called.  
13260 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65 20  But because the 
13270 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  page contains.**
13280 20 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20   critical data, 
13290 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f  we still need to
132a0 20 62 65 20 73 75 72 65 20 69 74 20 67 65 74 73   be sure it gets
132b0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20   rolled back in 
132c0 73 70 69 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20  spite.** of the 
132d0 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
132e0 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  call..*/.void sq
132f0 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f  lite3pager_dont_
13300 77 72 69 74 65 28 50 61 67 65 72 20 2a 70 50 61  write(Pager *pPa
13310 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
13320 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
13330 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65    if( pPager->me
13340 6d 44 62 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  mDb ) return;.. 
13350 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
13360 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
13370 29 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79 73  );.  pPg->always
13380 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20  Rollback = 1;.  
13390 69 66 28 20 70 50 67 20 26 26 20 70 50 67 2d 3e  if( pPg && pPg->
133a0 64 69 72 74 79 20 29 7b 0a 20 20 20 20 69 66 28  dirty ){.    if(
133b0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
133c0 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20  =(int)pPg->pgno 
133d0 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  && pPager->origD
133e0 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62  bSize<pPager->db
133f0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
13400 20 49 66 20 74 68 69 73 20 70 61 67 65 73 20 69   If this pages i
13410 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  s the last page 
13420 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  in the file and 
13430 74 68 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f  the file has gro
13440 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69  wn.      ** duri
13450 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ng the current t
13460 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
13470 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65   do NOT mark the
13480 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a   page as clean..
13490 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68        ** When th
134a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
134b0 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d  grows, we must m
134c0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
134d0 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20  e last page.    
134e0 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65    ** gets writte
134f0 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20  n at least once 
13500 73 6f 20 74 68 61 74 20 74 68 65 20 64 69 73 6b  so that the disk
13510 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68   file will be th
13520 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20  e correct.      
13530 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20  ** size. If you 
13540 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69  do not write thi
13550 73 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 73  s page and the s
13560 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a  ize of the file.
13570 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
13580 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69  disk ends up bei
13590 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68  ng too small, th
135a0 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64  at can lead to d
135b0 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
135c0 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69   corruption duri
135d0 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e  ng the next tran
135e0 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
135f0 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /.    }else{.   
13600 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54 5f     TRACE3("DONT_
13610 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66  WRITE page %d of
13620 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20 70 50   %d\n", pgno, pP
13630 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20  ager->fd.h);.   
13640 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
13650 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
13660 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20  /*.** A call to 
13670 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c  this routine tel
13680 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61  ls the pager tha
13690 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20  t if a rollback 
136a0 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73  occurs,.** it is
136b0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
136c0 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
136d0 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ta on the given 
136e0 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d  page.  This.** m
136f0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61  eans that the pa
13700 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ger does not hav
13710 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20  e to record the 
13720 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68  given page in th
13730 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  e.** rollback jo
13740 75 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73  urnal..*/.void s
13750 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74  qlite3pager_dont
13760 5f 72 6f 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a  _rollback(void *
13770 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
13780 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50  *pPg = DATA_TO_P
13790 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50  GHDR(pData);.  P
137a0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
137b0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 69  Pg->pPager;..  i
137c0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
137d0 21 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  !=PAGER_EXCLUSIV
137e0 45 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  E || pPager->jou
137f0 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65  rnalOpen==0 ) re
13800 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d  turn;.  if( pPg-
13810 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
13820 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  || pPager->alway
13830 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61  sRollback || pPa
13840 67 65 72 2d 3e 6d 65 6d 44 62 20 29 20 72 65 74  ger->memDb ) ret
13850 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50 67 2d  urn;.  if( !pPg-
13860 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69  >inJournal && (i
13870 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20  nt)pPg->pgno <= 
13880 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
13890 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ze ){.    assert
138a0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
138b0 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70  rnal!=0 );.    p
138c0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
138d0 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  l[pPg->pgno/8] |
138e0 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
138f0 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a  7);.    pPg->inJ
13900 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20  ournal = 1;.    
13910 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
13920 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 70  InUse ){.      p
13930 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70  Pager->aInStmt[p
13940 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
13950 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
13960 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f  .      page_add_
13970 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
13980 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41  );.    }.    TRA
13990 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41  CE3("DONT_ROLLBA
139a0 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25 64  CK page %d of %d
139b0 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  \n", pPg->pgno, 
139c0 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20  pPager->fd.h);. 
139d0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
139e0 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20 21 70  >stmtInUse && !p
139f0 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28 69  Pg->inStmt && (i
13a00 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  nt)pPg->pgno<=pP
13a10 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29  ager->stmtSize )
13a20 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
13a30 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20  g->inJournal || 
13a40 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70  (int)pPg->pgno>p
13a50 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
13a60 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
13a70 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
13a80 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  !=0 );.    pPage
13a90 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e  r->aInStmt[pPg->
13aa0 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
13ab0 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
13ac0 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
13ad0 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 7d  t_list(pPg);.  }
13ae0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  .}.../*.** Clear
13af0 20 61 20 50 67 48 69 73 74 6f 72 79 20 62 6c 6f   a PgHistory blo
13b00 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ck.*/.static voi
13b10 64 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50  d clearHistory(P
13b20 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 29  gHistory *pHist)
13b30 7b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  {.  sqliteFree(p
13b40 48 69 73 74 2d 3e 70 4f 72 69 67 29 3b 0a 20 20  Hist->pOrig);.  
13b50 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74  sqliteFree(pHist
13b60 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 70 48 69 73  ->pStmt);.  pHis
13b70 74 2d 3e 70 4f 72 69 67 20 3d 20 30 3b 0a 20 20  t->pOrig = 0;.  
13b80 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30  pHist->pStmt = 0
13b90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
13ba0 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f  t all changes to
13bb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
13bc0 64 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  d release the wr
13bd0 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ite lock..**.** 
13be0 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61  If the commit fa
13bf0 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73  ils for any reas
13c00 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61  on, a rollback a
13c10 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a  ttempt is made.*
13c20 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
13c30 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
13c40 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20    If the commit 
13c50 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f  worked, SQLITE_O
13c60 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
13c70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13c80 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 50 61 67  pager_commit(Pag
13c90 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
13ca0 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
13cb0 70 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  pPg;..  if( pPag
13cc0 65 72 2d 3e 65 72 72 4d 61 73 6b 3d 3d 50 41 47  er->errMask==PAG
13cd0 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20  ER_ERR_FULL ){. 
13ce0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
13cf0 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
13d00 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
13d10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
13d20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
13d30 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  E_FULL;.    }.  
13d40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
13d50 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
13d60 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20  rrMask!=0 ){.   
13d70 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63   rc = pager_errc
13d80 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ode(pPager);.   
13d90 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
13da0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
13db0 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56  ate<PAGER_RESERV
13dc0 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ED ){.    return
13dd0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
13de0 20 7d 0a 20 20 54 52 41 43 45 32 28 22 43 4f 4d   }.  TRACE2("COM
13df0 4d 49 54 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  MIT %d\n", pPage
13e00 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 69 66 28 20  r->fd.h);.  if( 
13e10 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
13e20 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72  .    pPg = pager
13e30 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70  _get_all_dirty_p
13e40 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20  ages(pPager);.  
13e50 20 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b 0a    while( pPg ){.
13e60 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f        clearHisto
13e70 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54  ry(PGHDR_TO_HIST
13e80 28 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b 0a  (pPg, pPager));.
13e90 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79        pPg->dirty
13ea0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
13eb0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  >inJournal = 0;.
13ec0 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d        pPg->inStm
13ed0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  t = 0;.      pPg
13ee0 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50  ->pPrevStmt = pP
13ef0 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30  g->pNextStmt = 0
13f00 3b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70 50  ;.      pPg = pP
13f10 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d  g->pDirty;.    }
13f20 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
13f30 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
13f40 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
13f50 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
13f60 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  ){.      PgHisto
13f70 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
13f80 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
13f90 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73  Pager);.      as
13fa0 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77 61  sert( !pPg->alwa
13fb0 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20  ysRollback );.  
13fc0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69      assert( !pHi
13fd0 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20  st->pOrig );.   
13fe0 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73     assert( !pHis
13ff0 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20  t->pStmt );.    
14000 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61  }.#endif.    pPa
14010 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
14020 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
14030 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
14040 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
14050 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
14060 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43  ( pPager->dirtyC
14070 61 63 68 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  ache==0 ){.    /
14080 2a 20 45 78 69 74 20 65 61 72 6c 79 20 28 77 69  * Exit early (wi
14090 74 68 6f 75 74 20 64 6f 69 6e 67 20 74 68 65 20  thout doing the 
140a0 74 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e 67 20 73  time-consuming s
140b0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 63  qlite3OsSync() c
140c0 61 6c 6c 73 29 0a 20 20 20 20 2a 2a 20 69 66 20  alls).    ** if 
140d0 74 68 65 72 65 20 68 61 76 65 20 62 65 65 6e 20  there have been 
140e0 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  no changes to th
140f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
14100 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
14110 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
14120 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
14130 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
14140 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  k(pPager);.    p
14150 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
14160 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  -1;.    return r
14170 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
14180 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14190 4f 70 65 6e 20 29 3b 0a 23 69 66 20 30 0a 20 20  Open );.#if 0.  
141a0 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
141b0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 69  (pPager, 0);.  i
141c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
141d0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 6f 6d   ){.    goto com
141e0 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20 7d 0a 20  mit_abort;.  }. 
141f0 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74   pPg = pager_get
14200 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
14210 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
14220 70 50 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pPg ){.    rc = 
14230 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
14240 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 69  list(pPg);.    i
14250 66 28 20 72 63 20 7c 7c 20 28 21 70 50 61 67 65  f( rc || (!pPage
14260 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 73 71 6c  r->noSync && sql
14270 69 74 65 33 4f 73 53 79 6e 63 28 26 70 50 61 67  ite3OsSync(&pPag
14280 65 72 2d 3e 66 64 29 21 3d 53 51 4c 49 54 45 5f  er->fd)!=SQLITE_
14290 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  OK) ){.      got
142a0 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a  o commit_abort;.
142b0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
142c0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70  .  rc = sqlite3p
142d0 61 67 65 72 5f 73 79 6e 63 28 70 50 61 67 65 72  ager_sync(pPager
142e0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
142f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14300 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f   goto commit_abo
14310 72 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70  rt;.  }.  rc = p
14320 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
14330 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67  (pPager);.  pPag
14340 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
14350 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20  .  return rc;.. 
14360 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
14370 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
14380 72 6f 6e 67 20 64 75 72 69 6e 67 20 74 68 65 20  rong during the 
14390 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
143a0 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61 62 6f 72    */.commit_abor
143b0 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  t:.  rc = sqlite
143c0 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
143d0 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
143e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
143f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14400 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  FULL;.  }.  retu
14410 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
14420 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61  Rollback all cha
14430 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74 61 62  nges.  The datab
14440 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74  ase falls back t
14450 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d  o PAGER_SHARED m
14460 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d  ode..** All in-m
14470 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65  emory cache page
14480 73 20 72 65 76 65 72 74 20 74 6f 20 74 68 65 69  s revert to thei
14490 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20  r original data 
144a0 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65  contents..** The
144b0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65   journal is dele
144c0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ted..**.** This 
144d0 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66  routine cannot f
144e0 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20  ail unless some 
144f0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
14500 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   not following.*
14510 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
14520 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28  cking protocol (
14530 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29  SQLITE_PROTOCOL)
14540 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20   or unless some 
14550 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73  other.** process
14560 20 69 73 20 77 72 69 74 69 6e 67 20 74 72 61 73   is writing tras
14570 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  h into the journ
14580 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f  al file (SQLITE_
14590 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75  CORRUPT) or.** u
145a0 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61  nless a prior ma
145b0 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53  lloc() failed (S
145c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41  QLITE_NOMEM).  A
145d0 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
145e0 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65  .** codes are re
145f0 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74  turned for all t
14600 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20  hese occasions. 
14610 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53   Otherwise,.** S
14620 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
14630 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
14640 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
14650 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
14660 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 54  ){.  int rc;.  T
14670 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20  RACE2("ROLLBACK 
14680 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66  %d\n", pPager->f
14690 64 2e 68 29 3b 0a 20 20 69 66 28 20 70 50 61 67  d.h);.  if( pPag
146a0 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
146b0 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66   PgHdr *p;.    f
146c0 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c  or(p=pPager->pAl
146d0 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  l; p; p=p->pNext
146e0 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69  All){.      PgHi
146f0 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20  story *pHist;.  
14700 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e      assert( !p->
14710 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29  alwaysRollback )
14720 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e  ;.      if( !p->
14730 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20  dirty ){.       
14740 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48 69   assert( !((PgHi
14750 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f  story *)PGHDR_TO
14760 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29  _HIST(p, pPager)
14770 29 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20  )->pOrig );.    
14780 20 20 20 20 61 73 73 65 72 74 28 20 21 28 28 50      assert( !((P
14790 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52  gHistory *)PGHDR
147a0 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67  _TO_HIST(p, pPag
147b0 65 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20  er))->pStmt );. 
147c0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
147d0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
147e0 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
147f0 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29  _HIST(p, pPager)
14800 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 69 73  ;.      if( pHis
14810 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20  t->pOrig ){.    
14820 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52      memcpy(PGHDR
14830 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 48 69  _TO_DATA(p), pHi
14840 73 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67 65  st->pOrig, pPage
14850 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
14860 20 20 20 20 20 20 54 52 41 43 45 32 28 22 52 4f        TRACE2("RO
14870 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25 64 5c 6e  LLBACK-PAGE %d\n
14880 22 2c 20 70 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  ", p->pgno);.   
14890 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
148a0 20 20 54 52 41 43 45 32 28 22 50 41 47 45 20 25    TRACE2("PAGE %
148b0 64 20 69 73 20 63 6c 65 61 6e 5c 6e 22 2c 20 70  d is clean\n", p
148c0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  ->pgno);.      }
148d0 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74  .      clearHist
148e0 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20  ory(pHist);.    
148f0 20 20 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a    p->dirty = 0;.
14900 20 20 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e        p->inJourn
14910 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  al = 0;.      p-
14920 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  >inStmt = 0;.   
14930 20 20 20 70 2d 3e 70 50 72 65 76 53 74 6d 74 20     p->pPrevStmt 
14940 3d 20 70 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  = p->pNextStmt =
14950 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70   0;..      if( p
14960 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
14970 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
14980 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 50 47  er->xReiniter(PG
14990 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20  HDR_TO_DATA(p), 
149a0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
149b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
149c0 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67   .    }.    pPag
149d0 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  er->pStmt = 0;. 
149e0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
149f0 65 20 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  e = pPager->orig
14a00 44 62 53 69 7a 65 3b 0a 20 20 20 20 6d 65 6d 6f  DbSize;.    memo
14a10 72 79 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  ryTruncate(pPage
14a20 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
14a30 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20  stmtInUse = 0;. 
14a40 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
14a50 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
14a60 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14a70 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66  TE_OK;.  }..  if
14a80 28 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79  ( !pPager->dirty
14a90 43 61 63 68 65 20 7c 7c 20 21 70 50 61 67 65 72  Cache || !pPager
14aa0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
14ab0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
14ac0 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
14ad0 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
14ae0 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
14af0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
14b00 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
14b10 65 72 72 4d 61 73 6b 21 3d 30 20 26 26 20 70 50  errMask!=0 && pP
14b20 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 50  ager->errMask!=P
14b30 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b  AGER_ERR_FULL ){
14b40 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
14b50 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
14b60 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20  CLUSIVE ){.     
14b70 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
14b80 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
14b90 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67  }.    return pag
14ba0 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65  er_errcode(pPage
14bb0 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  r);.  }.  if( pP
14bc0 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
14bd0 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
14be0 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20     int rc2;.    
14bf0 72 63 20 3d 20 70 61 67 65 72 5f 72 65 6c 6f 61  rc = pager_reloa
14c00 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  d_cache(pPager);
14c10 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72  .    rc2 = pager
14c20 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
14c30 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
14c40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14c50 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
14c60 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
14c70 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
14c80 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29  yback(pPager, 1)
14c90 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
14ca0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14cb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
14cc0 52 55 50 54 3b 0a 20 20 20 20 70 50 61 67 65 72  RUPT;.    pPager
14cd0 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47  ->errMask |= PAG
14ce0 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a  ER_ERR_CORRUPT;.
14cf0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62    }.  pPager->db
14d00 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74  Size = -1;.  ret
14d10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
14d20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
14d30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14d40 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64  e is opened read
14d50 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46  -only.  Return F
14d60 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64  ALSE.** if the d
14d70 61 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74  atabase is (in t
14d80 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e  heory) writable.
14d90 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
14da0 61 67 65 72 5f 69 73 72 65 61 64 6f 6e 6c 79 28  ager_isreadonly(
14db0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
14dc0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
14dd0 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a  >readOnly;.}../*
14de0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
14df0 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
14e00 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
14e10 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a  s only..*/.int *
14e20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 61  sqlite3pager_sta
14e30 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ts(Pager *pPager
14e40 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  ){.  static int 
14e50 61 5b 39 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70  a[9];.  a[0] = p
14e60 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61  Pager->nRef;.  a
14e70 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50  [1] = pPager->nP
14e80 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50  age;.  a[2] = pP
14e90 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20  ager->mxPage;.  
14ea0 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64  a[3] = pPager->d
14eb0 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20  bSize;.  a[4] = 
14ec0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20  pPager->state;. 
14ed0 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[5] = pPager->
14ee0 65 72 72 4d 61 73 6b 3b 0a 20 20 61 5b 36 5d 20  errMask;.  a[6] 
14ef0 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a  = pPager->nHit;.
14f00 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d    a[7] = pPager-
14f10 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d  >nMiss;.  a[8] =
14f20 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a   pPager->nOvfl;.
14f30 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 0a 2f    return a;.}../
14f40 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61  *.** Set the sta
14f50 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  tement rollback 
14f60 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  point..**.** Thi
14f70 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
14f80 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20   be called with 
14f90 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
14fa0 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a  journal already.
14fb0 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20  ** open.  A new 
14fc0 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
14fd0 6c 20 69 73 20 63 72 65 61 74 65 64 20 74 68 61  l is created tha
14fe0 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
14ff0 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61   rollback.** cha
15000 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  nges of a single
15010 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74   SQL command wit
15020 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61  hin a larger tra
15030 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  nsaction..*/.int
15040 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
15050 6d 74 5f 62 65 67 69 6e 28 50 61 67 65 72 20 2a  mt_begin(Pager *
15060 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
15070 63 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b  c;.  char zTemp[
15080 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
15090 53 49 5a 45 5d 3b 0a 20 20 61 73 73 65 72 74 28  SIZE];.  assert(
150a0 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e   !pPager->stmtIn
150b0 55 73 65 20 29 3b 0a 20 20 54 52 41 43 45 32 28  Use );.  TRACE2(
150c0 22 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e  "STMT-BEGIN %d\n
150d0 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29  ", pPager->fd.h)
150e0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
150f0 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61  memDb ){.    pPa
15100 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
15110 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
15120 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65  stmtSize = pPage
15130 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 72  r->dbSize;.    r
15140 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15150 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
15160 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
15170 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
15180 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b  tmtAutoopen = 1;
15190 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
151a0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73  TE_OK;.  }.  ass
151b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
151c0 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 50  rnalOpen );.  pP
151d0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20  ager->aInStmt = 
151e0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50  sqliteMalloc( pP
151f0 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b  ager->dbSize/8 +
15200 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67   1 );.  if( pPag
15210 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20 29  er->aInStmt==0 )
15220 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4c  {.    sqlite3OsL
15230 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
15240 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
15250 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15260 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e  _NOMEM;.  }.#ifn
15270 64 65 66 20 4e 44 45 42 55 47 0a 20 20 72 63 20  def NDEBUG.  rc 
15280 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
15290 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ize(&pPager->jfd
152a0 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  , &pPager->stmtJ
152b0 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Size);.  if( rc 
152c0 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69  ) goto stmt_begi
152d0 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73 73 65  n_failed;.  asse
152e0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  rt( pPager->stmt
152f0 4a 53 69 7a 65 20 3d 3d 20 0a 20 20 20 20 70 50  JSize == .    pP
15300 61 67 65 72 2d 3e 6e 52 65 63 2a 4a 4f 55 52 4e  ager->nRec*JOURN
15310 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
15320 20 2b 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   + JOURNAL_HDR_S
15330 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 23 65 6e  Z(pPager) );.#en
15340 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  dif.  pPager->st
15350 6d 74 4a 53 69 7a 65 20 3d 0a 20 20 20 20 20 70  mtJSize =.     p
15360 50 61 67 65 72 2d 3e 6e 52 65 63 2a 4a 4f 55 52  Pager->nRec*JOUR
15370 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
15380 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ) + JOURNAL_HDR_
15390 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50  SZ(pPager);.  pP
153a0 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
153b0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
153c0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
153d0 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20  stmtOpen ){.    
153e0 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
153f0 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70  r_opentemp(zTemp
15400 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29  , &pPager->stfd)
15410 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
15420 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66  oto stmt_begin_f
15430 61 69 6c 65 64 3b 0a 20 20 20 20 70 50 61 67 65  ailed;.    pPage
15440 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31 3b  r->stmtOpen = 1;
15450 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
15460 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20  tNRec = 0;.  }. 
15470 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
15480 73 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  se = 1;.  return
15490 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74   SQLITE_OK;. .st
154a0 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a  mt_begin_failed:
154b0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
154c0 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71  InStmt ){.    sq
154d0 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
154e0 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 70  >aInStmt);.    p
154f0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d  Pager->aInStmt =
15500 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
15510 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   rc;.}../*.** Co
15520 6d 6d 69 74 20 61 20 73 74 61 74 65 6d 65 6e 74  mmit a statement
15530 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15540 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69  pager_stmt_commi
15550 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
15560 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
15570 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
15580 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e   PgHdr *pPg, *pN
15590 65 78 74 3b 0a 20 20 20 20 54 52 41 43 45 32 28  ext;.    TRACE2(
155a0 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c  "STMT-COMMIT %d\
155b0 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68  n", pPager->fd.h
155c0 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
155d0 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
155e0 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b     sqlite3OsSeek
155f0 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  (&pPager->stfd, 
15600 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c  0);.      /* sql
15610 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 26  ite3OsTruncate(&
15620 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
15630 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  ; */.      sqlit
15640 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61  eFree( pPager->a
15650 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20  InStmt );.      
15660 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
15670 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  = 0;.    }.    f
15680 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
15690 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70  Stmt; pPg; pPg=p
156a0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 70 4e 65  Next){.      pNe
156b0 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53  xt = pPg->pNextS
156c0 74 6d 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  tmt;.      asser
156d0 74 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29  t( pPg->inStmt )
156e0 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53  ;.      pPg->inS
156f0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tmt = 0;.      p
15700 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  Pg->pPrevStmt = 
15710 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  pPg->pNextStmt =
15720 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   0;.      if( pP
15730 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
15740 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79         PgHistory
15750 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
15760 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
15770 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ger);.        sq
15780 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e  liteFree(pHist->
15790 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
157a0 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30  pHist->pStmt = 0
157b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
157c0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
157d0 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50  NRec = 0;.    pP
157e0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
157f0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
15800 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  >pStmt = 0;.  }.
15810 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
15820 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65  toopen = 0;.  re
15830 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15840 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
15850 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  k a statement..*
15860 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
15870 65 72 5f 73 74 6d 74 5f 72 6f 6c 6c 62 61 63 6b  er_stmt_rollback
15880 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
15890 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
158a0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
158b0 73 65 20 29 7b 0a 20 20 20 20 54 52 41 43 45 32  se ){.    TRACE2
158c0 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20  ("STMT-ROLLBACK 
158d0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66  %d\n", pPager->f
158e0 64 2e 68 29 3b 0a 20 20 20 20 69 66 28 20 70 50  d.h);.    if( pP
158f0 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
15900 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b       PgHdr *pPg;
15910 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70  .      for(pPg=p
15920 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50  Pager->pStmt; pP
15930 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
15940 74 53 74 6d 74 29 7b 0a 20 20 20 20 20 20 20 20  tStmt){.        
15950 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
15960 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
15970 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
15980 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74         if( pHist
15990 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
159a0 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44       memcpy(PGHD
159b0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
159c0 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50  pHist->pStmt, pP
159d0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
159e0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
159f0 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74  eFree(pHist->pSt
15a00 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  mt);.          p
15a10 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Hist->pStmt = 0;
15a20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15a30 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
15a40 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
15a50 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20  ->stmtSize;.    
15a60 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65    memoryTruncate
15a70 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
15a80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15a90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15aa0 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d 74   rc = pager_stmt
15ab0 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
15ac0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
15ad0 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63  ite3pager_stmt_c
15ae0 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20  ommit(pPager);. 
15af0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
15b00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
15b10 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
15b20 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65  toopen = 0;.  re
15b30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
15b40 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
15b50 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
15b60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
15b70 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
15b80 73 71 6c 69 74 65 33 70 61 67 65 72 5f 66 69 6c  sqlite3pager_fil
15b90 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  ename(Pager *pPa
15ba0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
15bb0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
15bc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
15bd0 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  n the directory 
15be0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
15bf0 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
15c00 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65  har *sqlite3page
15c10 72 5f 64 69 72 6e 61 6d 65 28 50 61 67 65 72 20  r_dirname(Pager 
15c20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
15c30 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  rn pPager->zDire
15c40 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ctory;.}../*.** 
15c50 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
15c60 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
15c70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f  journal file..*/
15c80 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
15c90 69 74 65 33 70 61 67 65 72 5f 6a 6f 75 72 6e 61  ite3pager_journa
15ca0 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  lname(Pager *pPa
15cb0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
15cc0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b  Pager->zJournal;
15cd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
15ce0 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73  e codec for this
15cf0 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73   pager.*/.void s
15d00 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f  qlite3pager_set_
15d10 63 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a  codec(.  Pager *
15d20 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 28  pPager,.  void (
15d30 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
15d40 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a  oid*,Pgno,int),.
15d50 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72    void *pCodecAr
15d60 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  g.){.  pPager->x
15d70 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a  Codec = xCodec;.
15d80 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63    pPager->pCodec
15d90 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67 3b  Arg = pCodecArg;
15da0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
15db0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
15dc0 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68   to increment th
15dd0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
15de0 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a  change-counter,.
15df0 2a 2a 20 73 74 6f 72 65 64 20 61 74 20 62 79 74  ** stored at byt
15e00 65 20 32 34 20 6f 66 20 74 68 65 20 70 61 67 65  e 24 of the page
15e10 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  r file..*/.stati
15e20 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72  c int pager_incr
15e30 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50  _changecounter(P
15e40 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
15e50 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20   void *pPage;.  
15e60 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20  PgHdr *pPgHdr;. 
15e70 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e   u32 change_coun
15e80 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ter;.  int rc;..
15e90 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31    /* Open page 1
15ea0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72   of the file for
15eb0 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 72   writing. */.  r
15ec0 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
15ed0 5f 67 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20  _get(pPager, 1, 
15ee0 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  &pPage);.  if( r
15ef0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
15f00 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
15f10 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
15f20 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66  ite(pPage);.  if
15f30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15f40 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
15f50 2f 2a 20 52 65 61 64 20 74 68 65 20 63 75 72 72  /* Read the curr
15f60 65 6e 74 20 76 61 6c 75 65 20 61 74 20 62 79 74  ent value at byt
15f70 65 20 32 34 2e 20 2a 2f 0a 20 20 70 50 67 48 64  e 24. */.  pPgHd
15f80 72 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  r = DATA_TO_PGHD
15f90 52 28 70 50 61 67 65 29 3b 0a 20 20 63 68 61 6e  R(pPage);.  chan
15fa0 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 72 65 74  ge_counter = ret
15fb0 72 69 65 76 65 33 32 62 69 74 73 28 70 50 67 48  rieve32bits(pPgH
15fc0 64 72 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a 20 49  dr, 24);..  /* I
15fd0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c  ncrement the val
15fe0 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64  ue just read and
15ff0 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74   write it back t
16000 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20  o byte 24. */.  
16010 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b  change_counter++
16020 3b 0a 20 20 73 74 6f 72 65 33 32 62 69 74 73 28  ;.  store32bits(
16030 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2c 20  change_counter, 
16040 70 50 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20 20  pPgHdr, 24);..  
16050 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 70  /* Release the p
16060 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a  age reference. *
16070 2f 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72  /.  sqlite3pager
16080 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  _unref(pPage);. 
16090 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
160a0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  K;.}../*.** Sync
160b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
160c0 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72  le for the pager
160d0 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72   pPager. zMaster
160e0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e   points to the n
160f0 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74  ame.** of a mast
16100 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
16110 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
16120 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
16130 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f  individual.** jo
16140 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73  urnal file. zMas
16150 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c  ter may be NULL,
16160 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70   which is interp
16170 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74  reted as no mast
16180 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61  er.** journal (a
16190 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
161a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
161b0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
161c0 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74  e ensures that t
161d0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
161e0 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79 20  nced, all dirty 
161f0 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a  pages written.**
16200 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
16210 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64 61   file and the da
16220 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63  tabase file sync
16230 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68 69  ed. The only thi
16240 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69  ng that.** remai
16250 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65  ns to commit the
16260 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
16270 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  to delete the jo
16280 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a  urnal file (or.*
16290 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
162a0 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69   file if specifi
162b0 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ed)..**.** Note 
162c0 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d  that if zMaster=
162d0 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73  =NULL, this does
162e0 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61   not overwrite a
162f0 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a   previous value.
16300 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20  ** passed to an 
16310 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e  sqlite3pager_syn
16320 63 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 69 6e 74  c() call..*/.int
16330 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79   sqlite3pager_sy
16340 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
16350 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
16360 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
16370 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
16380 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
16390 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20  n in-memory db, 
163a0 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65  or no pages have
163b0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
163c0 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 66  , or this.  ** f
163d0 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  unction has alre
163e0 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  ady been called,
163f0 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
16400 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
16410 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
16420 53 59 4e 43 45 44 20 26 26 20 21 70 50 61 67 65  SYNCED && !pPage
16430 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70 50 61 67  r->memDb && pPag
16440 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29  er->dirtyCache )
16450 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
16460 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
16470 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
16480 6e 20 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70  n );..    rc = p
16490 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
164a0 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 29 3b  counter(pPager);
164b0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
164c0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
164d0 6e 63 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a  nc_exit;..    /*
164e0 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
164f0 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 63  l file */.    rc
16500 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
16510 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b  Pager, zMaster);
16520 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
16530 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
16540 6e 63 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a  nc_exit;..    /*
16550 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79   Write all dirty
16560 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 61   pages to the da
16570 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
16580 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67     pPg = pager_g
16590 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67  et_all_dirty_pag
165a0 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  es(pPager);.    
165b0 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
165c0 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a  _pagelist(pPg);.
165d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
165e0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
165f0 63 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20  c_exit;..    /* 
16600 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  Sync the databas
16610 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  e file. */.    i
16620 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
16630 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nc ){.      rc =
16640 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 26   sqlite3OsSync(&
16650 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
16660 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   }..    pPager->
16670 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59  state = PAGER_SY
16680 4e 43 45 44 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f  NCED;.  }..sync_
16690 65 78 69 74 3a 0a 20 20 72 65 74 75 72 6e 20 72  exit:.  return r
166a0 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
166b0 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
166c0 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
166d0 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  nt state of the 
166e0 66 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74 68  file lock for th
166f0 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a  e given pager..*
16700 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
16710 75 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f 5f  ue is one of NO_
16720 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43  LOCK, SHARED_LOC
16730 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  K, RESERVED_LOCK
16740 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  ,.** PENDING_LOC
16750 4b 2c 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  K, or EXCLUSIVE_
16760 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  LOCK..*/.int sql
16770 69 74 65 33 70 61 67 65 72 5f 6c 6f 63 6b 73 74  ite3pager_lockst
16780 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
16790 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
167a0 67 65 72 2d 3e 66 64 2e 6c 6f 63 6b 74 79 70 65  ger->fd.locktype
167b0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ;.}.#endif..#ifd
167c0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
167d0 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73  *.** Print a lis
167e0 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65  ting of all refe
167f0 72 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64  renced pages and
16800 20 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74   their ref count
16810 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
16820 33 70 61 67 65 72 5f 72 65 66 64 75 6d 70 28 50  3pager_refdump(P
16830 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
16840 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66   PgHdr *pPg;.  f
16850 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
16860 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
16870 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
16880 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c    if( pPg->nRef<
16890 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
168a0 20 20 20 70 72 69 6e 74 66 28 22 50 41 47 45 20     printf("PAGE 
168b0 25 33 64 20 61 64 64 72 3d 30 78 25 30 38 78 20  %3d addr=0x%08x 
168c0 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20  nRef=%d\n", .   
168d0 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28      pPg->pgno, (
168e0 69 6e 74 29 50 47 48 44 52 5f 54 4f 5f 44 41 54  int)PGHDR_TO_DAT
168f0 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65  A(pPg), pPg->nRe
16900 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  f);.  }.}.#endif
16910 0a                                               .