/ Hex Artifact Content
Login

Artifact d852730901441babf6cd16fc528dd6eecc2b2eab:


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: 32 20 32 30 30 34 2f 30 36 2f 31 30 20 30 35 3a  2 2004/06/10 05:
0360: 35 39 3a 32 35 20 64 61 6e 69 65 6c 6b 31 39 37  59:25 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 57 72 69  ESERVED      Wri
0880: 74 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ting is permitte
0890: 64 20 74 6f 20 74 68 65 20 70 61 67 65 20 63 61  d to the page ca
08a0: 63 68 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 20 20 20  che only..**    
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08c0: 20 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20     The original 
08d0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
08e0: 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66  s not been modif
08f0: 69 65 64 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  ied..**         
0900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 74                Ot
0910: 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 6d 61  her processes ma
0920: 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69  y still be readi
0930: 6e 67 20 74 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a  ng the on-disk.*
0940: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0950: 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
0960: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50   file..**.**   P
0970: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20  AGER_EXCLUSIVE  
0980: 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68     The page cach
0990: 65 20 69 73 20 77 72 69 74 69 6e 67 20 74 68 65  e is writing the
09a0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20   database..**   
09b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09c0: 20 20 20 20 41 63 63 65 73 73 20 69 73 20 65 78      Access is ex
09d0: 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20 6f 74 68  clusive.  No oth
09e0: 65 72 20 70 72 6f 63 65 73 73 65 73 20 6f 72 0a  er processes or.
09f0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0a00: 20 20 20 20 20 20 20 20 20 74 68 72 65 61 64 73           threads
0a10: 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20   can be reading 
0a20: 6f 72 20 77 72 69 74 69 6e 67 20 77 68 69 6c 65  or writing while
0a30: 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   one.**         
0a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
0a50: 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e 67  ocess is writing
0a60: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
0a70: 20 63 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20   cache comes up 
0a80: 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e  in PAGER_UNLOCK.
0a90: 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65    The first time
0aa0: 20 61 0a 2a 2a 20 73 71 6c 69 74 65 5f 70 61 67   a.** sqlite_pag
0ab0: 65 5f 67 65 74 28 29 20 6f 63 63 75 72 73 2c 20  e_get() occurs, 
0ac0: 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69  the state transi
0ad0: 74 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53  tions to PAGER_S
0ae0: 48 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20  HARED..** After 
0af0: 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62  all pages have b
0b00: 65 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69  een released usi
0b10: 6e 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75  ng sqlite_page_u
0b20: 6e 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73  nref(),.** the s
0b30: 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73  tate transitions
0b40: 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55   back to PAGER_U
0b50: 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73  NLOCK.  The firs
0b60: 74 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73  t time.** that s
0b70: 71 6c 69 74 65 5f 70 61 67 65 5f 77 72 69 74 65  qlite_page_write
0b80: 28 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  () is called, th
0b90: 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69  e state transiti
0ba0: 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f  ons to.** PAGER_
0bb0: 52 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65  RESERVED.  (Note
0bc0: 20 74 68 61 74 20 73 71 6c 69 74 65 5f 70 61 67   that sqlite_pag
0bd0: 65 5f 77 72 69 74 65 28 29 20 63 61 6e 20 6f 6e  e_write() can on
0be0: 6c 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20  ly be.** called 
0bf0: 6f 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  on an outstandin
0c00: 67 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61  g page which mea
0c10: 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
0c20: 72 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20  r must.** be in 
0c30: 50 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66  PAGER_SHARED bef
0c40: 6f 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f  ore it transitio
0c50: 6e 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45  ns to PAGER_RESE
0c60: 52 56 45 44 2e 29 0a 2a 2a 20 54 68 65 20 73 71  RVED.).** The sq
0c70: 6c 69 74 65 5f 70 61 67 65 5f 72 6f 6c 6c 62 61  lite_page_rollba
0c80: 63 6b 28 29 20 61 6e 64 20 73 71 6c 69 74 65 5f  ck() and sqlite_
0c90: 70 61 67 65 5f 63 6f 6d 6d 69 74 28 29 20 66 75  page_commit() fu
0ca0: 6e 63 74 69 6f 6e 73 20 0a 2a 2a 20 74 72 61 6e  nctions .** tran
0cb0: 73 69 74 69 6f 6e 20 74 68 65 20 73 74 61 74 65  sition the state
0cc0: 20 66 72 6f 6d 20 50 41 47 45 52 5f 52 45 53 45   from PAGER_RESE
0cd0: 52 56 45 44 20 74 6f 20 50 41 47 45 52 5f 45 58  RVED to PAGER_EX
0ce0: 43 4c 55 53 49 56 45 20 74 6f 0a 2a 2a 20 50 41  CLUSIVE to.** PA
0cf0: 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2f 0a 23  GER_SHARED..*/.#
0d00: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c  define PAGER_UNL
0d10: 4f 43 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69  OCK      0.#defi
0d20: 6e 65 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  ne PAGER_SHARED 
0d30: 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20 50       1.#define P
0d40: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 20 20  AGER_RESERVED   
0d50: 20 32 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   2.#define PAGER
0d60: 5f 45 58 43 4c 55 53 49 56 45 20 20 20 33 0a 0a  _EXCLUSIVE   3..
0d70: 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 2d 6d  ./*.** Each in-m
0d80: 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 61  emory image of a
0d90: 20 70 61 67 65 20 62 65 67 69 6e 73 20 77 69 74   page begins wit
0da0: 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
0db0: 68 65 61 64 65 72 2e 0a 2a 2a 20 54 68 69 73 20  header..** This 
0dc0: 68 65 61 64 65 72 20 69 73 20 6f 6e 6c 79 20 76  header is only v
0dd0: 69 73 69 62 6c 65 20 74 6f 20 74 68 69 73 20 70  isible to this p
0de0: 61 67 65 72 20 6d 6f 64 75 6c 65 2e 20 20 54 68  ager module.  Th
0df0: 65 20 63 6c 69 65 6e 74 0a 2a 2a 20 63 6f 64 65  e client.** code
0e00: 20 74 68 61 74 20 63 61 6c 6c 73 20 70 61 67 65   that calls page
0e10: 72 20 73 65 65 73 20 6f 6e 6c 79 20 74 68 65 20  r sees only the 
0e20: 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77  data that follow
0e30: 73 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a  s the header..**
0e40: 0a 2a 2a 20 43 6c 69 65 6e 74 20 63 6f 64 65 20  .** Client code 
0e50: 73 68 6f 75 6c 64 20 63 61 6c 6c 20 73 71 6c 69  should call sqli
0e60: 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29  te3pager_write()
0e70: 20 6f 6e 20 61 20 70 61 67 65 20 70 72 69 6f 72   on a page prior
0e80: 20 74 6f 20 6d 61 6b 69 6e 67 0a 2a 2a 20 61 6e   to making.** an
0e90: 79 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20  y modifications 
0ea0: 74 6f 20 74 68 61 74 20 70 61 67 65 2e 20 20 54  to that page.  T
0eb0: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 73 71  he first time sq
0ec0: 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
0ed0: 28 29 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c  ().** is called,
0ee0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
0ef0: 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
0f00: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
0f10: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75   rollback.** jou
0f20: 72 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 69  rnal and PgHdr.i
0f30: 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48  nJournal and PgH
0f40: 64 72 2e 6e 65 65 64 53 79 6e 63 20 61 72 65 20  dr.needSync are 
0f50: 73 65 74 2e 20 20 4c 61 74 65 72 2c 20 6f 6e 63  set.  Later, onc
0f60: 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e.** the journal
0f70: 20 70 61 67 65 20 68 61 73 20 6d 61 64 65 20 69   page has made i
0f80: 74 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20  t onto the disk 
0f90: 73 75 72 66 61 63 65 2c 20 50 67 48 64 72 2e 6e  surface, PgHdr.n
0fa0: 65 65 64 53 79 6e 63 0a 2a 2a 20 69 73 20 63 6c  eedSync.** is cl
0fb0: 65 61 72 65 64 2e 20 20 54 68 65 20 6d 6f 64 69  eared.  The modi
0fc0: 66 69 65 64 20 70 61 67 65 20 63 61 6e 6e 6f 74  fied page cannot
0fd0: 20 62 65 20 77 72 69 74 74 65 6e 20 62 61 63 6b   be written back
0fe0: 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
0ff0: 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  al.** database f
1000: 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 6a 6f  ile until the jo
1010: 75 72 6e 61 6c 20 70 61 67 65 73 20 68 61 73 20  urnal pages has 
1020: 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64  been synced to d
1030: 69 73 6b 20 61 6e 64 20 74 68 65 0a 2a 2a 20 50  isk and the.** P
1040: 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 68 61  gHdr.needSync ha
1050: 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64 2e 0a  s been cleared..
1060: 2a 2a 0a 2a 2a 20 54 68 65 20 50 67 48 64 72 2e  **.** The PgHdr.
1070: 64 69 72 74 79 20 66 6c 61 67 20 69 73 20 73 65  dirty flag is se
1080: 74 20 77 68 65 6e 20 73 71 6c 69 74 65 33 70 61  t when sqlite3pa
1090: 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 63  ger_write() is c
10a0: 61 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 69 73 20  alled and.** is 
10b0: 63 6c 65 61 72 65 64 20 61 67 61 69 6e 20 77 68  cleared again wh
10c0: 65 6e 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  en the page cont
10d0: 65 6e 74 20 69 73 20 77 72 69 74 74 65 6e 20 62  ent is written b
10e0: 61 63 6b 20 74 6f 20 74 68 65 20 6f 72 69 67 69  ack to the origi
10f0: 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  nal.** database 
1100: 66 69 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  file..*/.typedef
1110: 20 73 74 72 75 63 74 20 50 67 48 64 72 20 50 67   struct PgHdr Pg
1120: 48 64 72 3b 0a 73 74 72 75 63 74 20 50 67 48 64  Hdr;.struct PgHd
1130: 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  r {.  Pager *pPa
1140: 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ger;            
1150: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
1160: 72 20 74 6f 20 77 68 69 63 68 20 74 68 69 73 20  r to which this 
1170: 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a  page belongs */.
1180: 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
1190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a0: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d   /* The page num
11b0: 62 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67  ber for this pag
11c0: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  e */.  PgHdr *pN
11d0: 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65 76 48  extHash, *pPrevH
11e0: 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20 63 6f  ash;  /* Hash co
11f0: 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66 6f  llision chain fo
1200: 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a  r PgHdr.pgno */.
1210: 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 46 72    PgHdr *pNextFr
1220: 65 65 2c 20 2a 70 50 72 65 76 46 72 65 65 3b 20  ee, *pPrevFree; 
1230: 20 2f 2a 20 46 72 65 65 6c 69 73 74 20 6f 66 20   /* Freelist of 
1240: 70 61 67 65 73 20 77 68 65 72 65 20 6e 52 65 66  pages where nRef
1250: 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ==0 */.  PgHdr *
1260: 70 4e 65 78 74 41 6c 6c 3b 20 20 20 20 20 20 20  pNextAll;       
1270: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6c 69 73          /* A lis
1280: 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a  t of all pages *
1290: 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74  /.  PgHdr *pNext
12a0: 53 74 6d 74 2c 20 2a 70 50 72 65 76 53 74 6d 74  Stmt, *pPrevStmt
12b0: 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61  ;  /* List of pa
12c0: 67 65 73 20 69 6e 20 74 68 65 20 73 74 61 74 65  ges in the state
12d0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  ment journal */.
12e0: 20 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20    u8 inJournal; 
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1300: 20 2f 2a 20 54 52 55 45 20 69 66 20 68 61 73 20   /* TRUE if has 
1310: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
1320: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20  journal */.  u8 
1330: 69 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20  inStmt;         
1340: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1350: 52 55 45 20 69 66 20 69 6e 20 74 68 65 20 73 74  RUE if in the st
1360: 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e  atement subjourn
1370: 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79  al */.  u8 dirty
1380: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1390: 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69         /* TRUE i
13a0: 66 20 77 65 20 6e 65 65 64 20 74 6f 20 77 72 69  f we need to wri
13b0: 74 65 20 62 61 63 6b 20 63 68 61 6e 67 65 73 20  te back changes 
13c0: 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63  */.  u8 needSync
13d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13e0: 20 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75 72      /* Sync jour
13f0: 6e 61 6c 20 62 65 66 6f 72 65 20 77 72 69 74 69  nal before writi
1400: 6e 67 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  ng this page */.
1410: 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62    u8 alwaysRollb
1420: 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ack;            
1430: 20 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e 74   /* Disable dont
1440: 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20  _rollback() for 
1450: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 73  this page */.  s
1460: 68 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b 20 20  hort int nRef;  
1470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1480: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65 72 73   Number of users
1490: 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 2a 2f   of this page */
14a0: 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72 74 79  .  PgHdr *pDirty
14b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14c0: 20 20 2f 2a 20 44 69 72 74 79 20 70 61 67 65 73    /* Dirty pages
14d0: 20 73 6f 72 74 65 64 20 62 79 20 50 67 48 64 72   sorted by PgHdr
14e0: 2e 70 67 6e 6f 20 2a 2f 0a 20 20 2f 2a 20 53 51  .pgno */.  /* SQ
14f0: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 20 62  LITE_PAGE_SIZE b
1500: 79 74 65 73 20 6f 66 20 70 61 67 65 20 64 61 74  ytes of page dat
1510: 61 20 66 6f 6c 6c 6f 77 20 74 68 69 73 20 68 65  a follow this he
1520: 61 64 65 72 20 2a 2f 0a 20 20 2f 2a 20 50 61 67  ader */.  /* Pag
1530: 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20  er.nExtra bytes 
1540: 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 20 66 6f  of local data fo
1550: 6c 6c 6f 77 20 74 68 65 20 70 61 67 65 20 64 61  llow the page da
1560: 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ta */.};../*.** 
1570: 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  For an in-memory
1580: 20 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 2c 20   only database, 
1590: 73 6f 6d 65 20 65 78 74 72 61 20 69 6e 66 6f 72  some extra infor
15a0: 6d 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64  mation is record
15b0: 65 64 20 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68  ed about.** each
15c0: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 63 68   page so that ch
15d0: 61 6e 67 65 73 20 63 61 6e 20 62 65 20 72 6f 6c  anges can be rol
15e0: 6c 65 64 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72  led back.  (Jour
15f0: 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20 6e 6f  nal files are no
1600: 74 0a 2a 2a 20 75 73 65 64 20 66 6f 72 20 69 6e  t.** used for in
1610: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
1620: 73 2e 29 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  s.)  The followi
1630: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ng information i
1640: 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68  s added to.** th
1650: 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 45  e end of every E
1660: 58 54 52 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69  XTRA block for i
1670: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1680: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  es..**.** This i
1690: 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64  nformation could
16a0: 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65 64   have been added
16b0: 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
16c0: 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72 65   PgHdr structure
16d0: 2e 0a 2a 2a 20 42 75 74 20 74 68 65 6e 20 69 74  ..** But then it
16e0: 20 77 6f 75 6c 64 20 74 61 6b 65 20 75 70 20 61   would take up a
16f0: 6e 20 65 78 74 72 61 20 38 20 62 79 74 65 73 20  n extra 8 bytes 
1700: 6f 66 20 73 74 6f 72 61 67 65 20 6f 6e 20 65 76  of storage on ev
1710: 65 72 79 20 50 67 48 64 72 0a 2a 2a 20 65 76 65  ery PgHdr.** eve
1720: 6e 20 66 6f 72 20 64 69 73 6b 2d 62 61 73 65 64  n for disk-based
1730: 20 64 61 74 61 62 61 73 65 73 2e 20 20 53 70 6c   databases.  Spl
1740: 69 74 74 69 6e 67 20 69 74 20 6f 75 74 20 73 61  itting it out sa
1750: 76 65 73 20 38 20 62 79 74 65 73 2e 20 20 54 68  ves 8 bytes.  Th
1760: 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20  is.** is only a 
1770: 73 61 76 69 6e 67 73 20 6f 66 20 30 2e 38 25 20  savings of 0.8% 
1780: 62 75 74 20 74 68 6f 73 65 20 70 65 72 63 65 6e  but those percen
1790: 74 61 67 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f  tages add up..*/
17a0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
17b0: 50 67 48 69 73 74 6f 72 79 20 50 67 48 69 73 74  PgHistory PgHist
17c0: 6f 72 79 3b 0a 73 74 72 75 63 74 20 50 67 48 69  ory;.struct PgHi
17d0: 73 74 6f 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f  story {.  u8 *pO
17e0: 72 69 67 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67  rig;     /* Orig
17f0: 69 6e 61 6c 20 70 61 67 65 20 74 65 78 74 2e 20  inal page text. 
1800: 20 52 65 73 74 6f 72 65 20 74 6f 20 74 68 69 73   Restore to this
1810: 20 6f 6e 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62   on a full rollb
1820: 61 63 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74  ack */.  u8 *pSt
1830: 6d 74 3b 20 20 20 20 20 2f 2a 20 54 65 78 74 20  mt;     /* Text 
1840: 61 73 20 69 74 20 77 61 73 20 61 74 20 74 68 65  as it was at the
1850: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
1860: 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  e current statem
1870: 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ent */.};../*.**
1880: 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f   A macro used fo
1890: 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63  r invoking the c
18a0: 6f 64 65 63 20 69 66 20 74 68 65 72 65 20 69 73  odec if there is
18b0: 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53   one.*/.#ifdef S
18c0: 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
18d0: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 28 50  # define CODEC(P
18e0: 2c 44 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78  ,D,N,X) if( P->x
18f0: 43 6f 64 65 63 20 29 7b 20 50 2d 3e 78 43 6f 64  Codec ){ P->xCod
1900: 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c  ec(P->pCodecArg,
1910: 44 2c 4e 2c 58 29 3b 20 7d 0a 23 65 6c 73 65 0a  D,N,X); }.#else.
1920: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 28 50  # define CODEC(P
1930: 2c 44 2c 4e 2c 58 29 0a 23 65 6e 64 69 66 0a 0a  ,D,N,X).#endif..
1940: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
1950: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 67 48  pointer to a PgH
1960: 64 72 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65  dr into a pointe
1970: 72 20 74 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a  r to its data.**
1980: 20 61 6e 64 20 62 61 63 6b 20 61 67 61 69 6e 2e   and back again.
1990: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47 48 44  .*/.#define PGHD
19a0: 52 5f 54 4f 5f 44 41 54 41 28 50 29 20 20 28 28  R_TO_DATA(P)  ((
19b0: 76 6f 69 64 2a 29 28 26 28 50 29 5b 31 5d 29 29  void*)(&(P)[1]))
19c0: 0a 23 64 65 66 69 6e 65 20 44 41 54 41 5f 54 4f  .#define DATA_TO
19d0: 5f 50 47 48 44 52 28 44 29 20 20 28 26 28 28 50  _PGHDR(D)  (&((P
19e0: 67 48 64 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a  gHdr*)(D))[-1]).
19f0: 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f  #define PGHDR_TO
1a00: 5f 45 58 54 52 41 28 50 29 20 28 28 76 6f 69 64  _EXTRA(P) ((void
1a10: 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28 50 29  *)&((char*)(&(P)
1a20: 5b 31 5d 29 29 5b 53 51 4c 49 54 45 5f 50 41 47  [1]))[SQLITE_PAG
1a30: 45 5f 53 49 5a 45 5d 29 0a 23 64 65 66 69 6e 65  E_SIZE]).#define
1a40: 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 50   PGHDR_TO_HIST(P
1a50: 2c 50 47 52 29 20 20 5c 0a 20 20 20 20 20 20 20  ,PGR)  \.       
1a60: 20 20 20 20 20 28 28 50 67 48 69 73 74 6f 72 79       ((PgHistory
1a70: 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28 50 29  *)&((char*)(&(P)
1a80: 5b 31 5d 29 29 5b 28 50 47 52 29 2d 3e 70 61 67  [1]))[(PGR)->pag
1a90: 65 53 69 7a 65 2b 28 50 47 52 29 2d 3e 6e 45 78  eSize+(PGR)->nEx
1aa0: 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 48 6f 77  tra])../*.** How
1ab0: 20 62 69 67 20 74 6f 20 6d 61 6b 65 20 74 68 65   big to make the
1ac0: 20 68 61 73 68 20 74 61 62 6c 65 20 75 73 65 64   hash table used
1ad0: 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20 69 6e   for locating in
1ae0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 0a 2a 2a  -memory pages.**
1af0: 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72 2e   by page number.
1b00: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 50 47  .*/.#define N_PG
1b10: 5f 48 41 53 48 20 32 30 34 38 0a 0a 2f 2a 0a 2a  _HASH 2048../*.*
1b20: 2a 20 48 61 73 68 20 61 20 70 61 67 65 20 6e 75  * Hash a page nu
1b30: 6d 62 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  mber.*/.#define 
1b40: 70 61 67 65 72 5f 68 61 73 68 28 50 4e 29 20 20  pager_hash(PN)  
1b50: 28 28 50 4e 29 26 28 4e 5f 50 47 5f 48 41 53 48  ((PN)&(N_PG_HASH
1b60: 2d 31 29 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70  -1))../*.** A op
1b70: 65 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73  en page cache is
1b80: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
1b90: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
1ba0: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75  ructure..*/.stru
1bb0: 63 74 20 50 61 67 65 72 20 7b 0a 20 20 63 68 61  ct Pager {.  cha
1bc0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20  r *zFilename;   
1bd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1be0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1bf0: 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
1c00: 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  *zJournal;      
1c10: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1c20: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1c30: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44  le */.  char *zD
1c40: 69 72 65 63 74 6f 72 79 3b 20 20 20 20 20 20 20  irectory;       
1c50: 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79      /* Directory
1c60: 20 68 6f 6c 64 20 64 61 74 61 62 61 73 65 20 61   hold database a
1c70: 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nd journal files
1c80: 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 66 64 2c   */.  OsFile fd,
1c90: 20 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20   jfd;           
1ca0: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
1cb0: 70 74 6f 72 73 20 66 6f 72 20 64 61 74 61 62 61  ptors for databa
1cc0: 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a  se and journal *
1cd0: 2f 0a 20 20 4f 73 46 69 6c 65 20 73 74 66 64 3b  /.  OsFile stfd;
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
1d00: 6f 72 20 66 6f 72 20 74 68 65 20 73 74 61 74 65  or for the state
1d10: 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a  ment subjournal*
1d20: 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 3b 20  /.  int dbSize; 
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d40: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1d50: 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 2a  es in the file *
1d60: 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44 62 53 69  /.  int origDbSi
1d70: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
1d80: 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65  /* dbSize before
1d90: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68 61   the current cha
1da0: 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d  nge */.  int stm
1db0: 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  tSize;          
1dc0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1dd0: 64 61 74 61 62 61 73 65 20 28 69 6e 20 70 61 67  database (in pag
1de0: 65 73 29 20 61 74 20 73 74 6d 74 5f 62 65 67 69  es) at stmt_begi
1df0: 6e 28 29 20 2a 2f 0a 20 20 6f 66 66 5f 74 20 73  n() */.  off_t s
1e00: 74 6d 74 4a 53 69 7a 65 3b 20 20 20 20 20 20 20  tmtJSize;       
1e10: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1e20: 6a 6f 75 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f  journal at stmt_
1e30: 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74  begin() */.  int
1e40: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
1e50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1e60: 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74  er of pages writ
1e70: 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
1e80: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  al */.  u32 cksu
1e90: 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20  mInit;          
1ea0: 20 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e      /* Quasi-ran
1eb0: 64 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20  dom value added 
1ec0: 74 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75  to every checksu
1ed0: 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 4e  m */.  int stmtN
1ee0: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
1ef0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1f00: 72 65 63 6f 72 64 73 20 69 6e 20 73 74 6d 74 20  records in stmt 
1f10: 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  subjournal */.  
1f20: 69 6e 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20  int nExtra;     
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1f40: 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  dd this many byt
1f50: 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  es to each in-me
1f60: 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 76  mory page */.  v
1f70: 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63 74 6f  oid (*xDestructo
1f80: 72 29 28 76 6f 69 64 2a 2c 69 6e 74 29 3b 20 2f  r)(void*,int); /
1f90: 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  * Call this rout
1fa0: 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69 6e 67  ine when freeing
1fb0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64   pages */.  void
1fc0: 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28 76 6f   (*xReiniter)(vo
1fd0: 69 64 2a 2c 69 6e 74 29 3b 20 20 20 2f 2a 20 43  id*,int);   /* C
1fe0: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
1ff0: 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20   when reloading 
2000: 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 70  pages */.  int p
2010: 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ageSize;        
2020: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2030: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70   of bytes in a p
2040: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  age */.  int nPa
2050: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
2060: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
2070: 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
2080: 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  y pages */.  int
2090: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
20a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
20b0: 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
20c0: 70 61 67 65 73 20 77 69 74 68 20 50 67 48 64 72  pages with PgHdr
20d0: 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74  .nRef>0 */.  int
20e0: 20 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20 20   mxPage;        
20f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
2100: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  mum number of pa
2110: 67 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63  ges to hold in c
2120: 61 63 68 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 48  ache */.  int nH
2130: 69 74 2c 20 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c  it, nMiss, nOvfl
2140: 3b 20 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68  ;     /* Cache h
2150: 69 74 73 2c 20 6d 69 73 73 69 6e 67 2c 20 61 6e  its, missing, an
2160: 64 20 4c 52 55 20 6f 76 65 72 66 6c 6f 77 73 20  d LRU overflows 
2170: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  */.  void (*xCod
2180: 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c  ec)(void*,void*,
2190: 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f  Pgno,int); /* Ro
21a0: 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63  utine for en/dec
21b0: 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20  oding data */.  
21c0: 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 3b  void *pCodecArg;
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
21e0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
21f0: 20 78 43 6f 64 65 63 28 29 20 2a 2f 0a 20 20 75   xCodec() */.  u
2200: 38 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20 20  8 journalOpen;  
2210: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2220: 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69  ue if journal fi
2230: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 69  le descriptors i
2240: 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 75 38 20  s valid */.  u8 
2250: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 3b 20  journalStarted; 
2260: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2270: 20 69 66 20 68 65 61 64 65 72 20 6f 66 20 6a 6f   if header of jo
2280: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
2290: 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e  */.  u8 useJourn
22a0: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
22b0: 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61   /* Use a rollba
22c0: 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68  ck journal on th
22d0: 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  is file */.  u8 
22e0: 73 74 6d 74 4f 70 65 6e 3b 20 20 20 20 20 20 20  stmtOpen;       
22f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2300: 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   if the statemen
2310: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 69 73 20  t subjournal is 
2320: 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d  open */.  u8 stm
2330: 74 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20 20  tInUse;         
2340: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77 65        /* True we
2350: 20 61 72 65 20 69 6e 20 61 20 73 74 61 74 65 6d   are in a statem
2360: 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
2370: 6f 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 41  on */.  u8 stmtA
2380: 75 74 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20 20  utoopen;        
2390: 20 20 20 20 2f 2a 20 4f 70 65 6e 20 73 74 6d 74      /* Open stmt
23a0: 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d 61   journal when ma
23b0: 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70  in journal is op
23c0: 65 6e 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53 79  ened*/.  u8 noSy
23d0: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
23e0: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73       /* Do not s
23f0: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
2400: 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20  if true */.  u8 
2410: 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20  fullSync;       
2420: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65           /* Do e
2430: 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68  xtra syncs of th
2440: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f  e journal for ro
2450: 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38  bustness */.  u8
2460: 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20   state;         
2470: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
2480: 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52  ER_UNLOCK, _SHAR
2490: 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20 65  ED, _RESERVED, e
24a0: 74 63 2e 20 2a 2f 0a 20 20 75 38 20 65 72 72 4d  tc. */.  u8 errM
24b0: 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
24c0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
24d0: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
24e0: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 75 38 20 74  errors */.  u8 t
24f0: 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20  empFile;        
2500: 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65          /* zFile
2510: 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72  name is a tempor
2520: 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  ary file */.  u8
2530: 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20   readOnly;      
2540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2550: 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c  e for a read-onl
2560: 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  y database */.  
2570: 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20  u8 needSync;    
2580: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2590: 72 75 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28  rue if an fsync(
25a0: 29 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74  ) is needed on t
25b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
25c0: 75 38 20 64 69 72 74 79 43 61 63 68 65 3b 20 20  u8 dirtyCache;  
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
25e0: 72 75 65 20 69 66 20 63 61 63 68 65 64 20 70 61  rue if cached pa
25f0: 67 65 73 20 68 61 76 65 20 63 68 61 6e 67 65 64  ges have changed
2600: 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52   */.  u8 alwaysR
2610: 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20  ollback;        
2620: 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e    /* Disable don
2630: 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72  t_rollback() for
2640: 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20   all pages */.  
2650: 75 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20  u8 memDb;       
2660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2670: 72 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61  rue to inhibit a
2680: 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20  ll file I/O */. 
2690: 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b   u8 *aInJournal;
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26b0: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
26c0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
26d0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
26e0: 75 38 20 2a 61 49 6e 53 74 6d 74 3b 20 20 20 20  u8 *aInStmt;    
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2700: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
2710: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
2720: 62 61 73 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  base */.  PgHdr 
2730: 2a 70 46 69 72 73 74 2c 20 2a 70 4c 61 73 74 3b  *pFirst, *pLast;
2740: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
2750: 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f 0a 20   free pages */. 
2760: 20 50 67 48 64 72 20 2a 70 46 69 72 73 74 53 79   PgHdr *pFirstSy
2770: 6e 63 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  nced;        /* 
2780: 46 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20  First free page 
2790: 77 69 74 68 20 50 67 48 64 72 2e 6e 65 65 64 53  with PgHdr.needS
27a0: 79 6e 63 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64  ync==0 */.  PgHd
27b0: 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20 20 20  r *pAll;        
27c0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
27d0: 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a  of all pages */.
27e0: 20 20 50 67 48 64 72 20 2a 70 53 74 6d 74 3b 20    PgHdr *pStmt; 
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2800: 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69   List of pages i
2810: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
2820: 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  subjournal */.  
2830: 50 67 48 64 72 20 2a 61 48 61 73 68 5b 4e 5f 50  PgHdr *aHash[N_P
2840: 47 5f 48 41 53 48 5d 3b 20 20 20 20 2f 2a 20 48  G_HASH];    /* H
2850: 61 73 68 20 74 61 62 6c 65 20 74 6f 20 6d 61 70  ash table to map
2860: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
2870: 50 67 48 64 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  PgHdr */.  int n
2880: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
2890: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
28a0: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 73   of bytes to res
28b0: 65 72 76 65 20 66 6f 72 20 6d 61 73 74 65 72 20  erve for master 
28c0: 6a 2e 70 20 2a 2f 0a 20 20 42 75 73 79 48 61 6e  j.p */.  BusyHan
28d0: 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c  dler *pBusyHandl
28e0: 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  er;  /* Pointer 
28f0: 74 6f 20 73 71 6c 69 74 65 2e 62 75 73 79 48 61  to sqlite.busyHa
2900: 6e 64 6c 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  ndler */.};../*.
2910: 2a 2a 20 54 68 65 73 65 20 61 72 65 20 62 69 74  ** These are bit
2920: 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 73 65  s that can be se
2930: 74 20 69 6e 20 50 61 67 65 72 2e 65 72 72 4d 61  t in Pager.errMa
2940: 73 6b 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  sk..*/.#define P
2950: 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 20 20  AGER_ERR_FULL   
2960: 20 20 30 78 30 31 20 20 2f 2a 20 61 20 77 72 69    0x01  /* a wri
2970: 74 65 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 23  te() failed */.#
2980: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52  define PAGER_ERR
2990: 5f 4d 45 4d 20 20 20 20 20 20 30 78 30 32 20 20  _MEM      0x02  
29a0: 2f 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  /* malloc() fail
29b0: 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  ed */.#define PA
29c0: 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 20 20 20  GER_ERR_LOCK    
29d0: 20 30 78 30 34 20 20 2f 2a 20 65 72 72 6f 72 20   0x04  /* error 
29e0: 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70  in the locking p
29f0: 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 23 64 65 66 69  rotocol */.#defi
2a00: 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52  ne PAGER_ERR_COR
2a10: 52 55 50 54 20 20 30 78 30 38 20 20 2f 2a 20 64  RUPT  0x08  /* d
2a20: 61 74 61 62 61 73 65 20 6f 72 20 6a 6f 75 72 6e  atabase or journ
2a30: 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  al corruption */
2a40: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
2a50: 52 52 5f 44 49 53 4b 20 20 20 20 20 30 78 31 30  RR_DISK     0x10
2a60: 20 20 2f 2a 20 67 65 6e 65 72 61 6c 20 64 69 73    /* general dis
2a70: 6b 20 49 2f 4f 20 65 72 72 6f 72 20 2d 20 62 61  k I/O error - ba
2a80: 64 20 68 61 72 64 20 64 72 69 76 65 3f 20 2a 2f  d hard drive? */
2a90: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20  ../*.** Journal 
2aa0: 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68  files begin with
2ab0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
2ac0: 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68  agic string.  Th
2ad0: 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62  e data.** was ob
2ae0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76  tained from /dev
2af0: 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20  /random.  It is 
2b00: 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73  used only as a s
2b10: 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a  anity check..**.
2b20: 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e  ** Since version
2b30: 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72   2.8.0, the jour
2b40: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61  nal format conta
2b50: 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73  ins additional s
2b60: 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e  anity.** checkin
2b70: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20  g information.  
2b80: 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69  If the power fai
2b90: 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ls while the jou
2ba0: 72 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a 2a 2a  rnal is begin.**
2bb0: 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72   written, semi-r
2bc0: 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61  andom garbage da
2bd0: 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  ta might appear 
2be0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
2bf0: 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77  * file after pow
2c00: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20  er is restored. 
2c10: 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69   If an attempt i
2c20: 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74  s then made.** t
2c30: 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e  o roll the journ
2c40: 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74  al back, the dat
2c50: 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63  abase could be c
2c60: 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61  orrupted.  The a
2c70: 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e  dditional.** san
2c80: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74  ity checking dat
2c90: 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  a is an attempt 
2ca0: 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20  to discover the 
2cb0: 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a  garbage in the.*
2cc0: 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67  * journal and ig
2cd0: 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  nore it..**.** T
2ce0: 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  he sanity checki
2cf0: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
2d00: 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e  or the new journ
2d10: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73  al format consis
2d20: 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69  ts.** of a 32-bi
2d30: 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61  t checksum on ea
2d40: 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  ch page of data.
2d50: 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63    The checksum c
2d60: 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68  overs both.** th
2d70: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
2d80: 64 20 74 68 65 20 53 51 4c 49 54 45 5f 50 41 47  d the SQLITE_PAG
2d90: 45 5f 53 49 5a 45 20 62 79 74 65 73 20 6f 66 20  E_SIZE bytes of 
2da0: 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67  data for the pag
2db0: 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d  e..** This cksum
2dc0: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
2dd0: 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64  to a 32-bit rand
2de0: 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70  om value that ap
2df0: 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20  pears in the.** 
2e00: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67  journal file rig
2e10: 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61  ht after the hea
2e20: 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d  der.  The random
2e30: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20   initializer is 
2e40: 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65  important,.** be
2e50: 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61  cause garbage da
2e60: 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ta that appears 
2e70: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
2e80: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c  journal is likel
2e90: 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77  y.** data that w
2ea0: 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72  as once in other
2eb0: 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65   files that have
2ec0: 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65   now been delete
2ed0: 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61  d.  If the.** ga
2ee0: 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20  rbage data came 
2ef0: 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65  from an obsolete
2f00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
2f10: 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67  he checksums mig
2f20: 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74  ht.** be correct
2f30: 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61  .  But by initia
2f40: 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b  lizing the check
2f50: 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61  sum to random va
2f60: 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  lue which.** is 
2f70: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
2f80: 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20  ery journal, we 
2f90: 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69  minimize that ri
2fa0: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  sk..*/.static co
2fb0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
2fc0: 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  r aJournalMagic[
2fd0: 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78  ] = {.  0xd9, 0x
2fe0: 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20  d5, 0x05, 0xf9, 
2ff0: 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33  0x20, 0xa1, 0x63
3000: 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  , 0xd7,.};../*.*
3010: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
3020: 65 20 68 65 61 64 65 72 20 61 6e 64 20 6f 66 20  e header and of 
3030: 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65  each page in the
3040: 20 6a 6f 75 72 6e 61 6c 20 76 61 72 69 65 73 20   journal varies 
3050: 61 63 63 6f 72 64 69 6e 67 0a 2a 2a 20 74 6f 20  according.** to 
3060: 77 68 69 63 68 20 6a 6f 75 72 6e 61 6c 20 66 6f  which journal fo
3070: 72 6d 61 74 20 69 73 20 62 65 69 6e 67 20 75 73  rmat is being us
3080: 65 64 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ed.  The followi
3090: 6e 67 20 6d 61 63 72 6f 73 20 66 69 67 75 72 65  ng macros figure
30a0: 20 6f 75 74 0a 2a 2a 20 74 68 65 20 73 69 7a 65   out.** the size
30b0: 73 20 62 61 73 65 64 20 6f 6e 20 66 6f 72 6d 61  s based on forma
30c0: 74 20 6e 75 6d 62 65 72 73 2e 0a 2a 2f 0a 23 64  t numbers..*/.#d
30d0: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44  efine JOURNAL_HD
30e0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 32 34  R_SZ(pPager) (24
30f0: 20 2b 20 28 70 50 61 67 65 72 29 2d 3e 6e 4d 61   + (pPager)->nMa
3100: 73 74 65 72 29 0a 23 64 65 66 69 6e 65 20 4a 4f  ster).#define JO
3110: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
3120: 65 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70  er)  ((pPager->p
3130: 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 0a  ageSize) + 8)...
3140: 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 72 65 66  /*.** Enable ref
3150: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 74 72 61  erence count tra
3160: 63 6b 69 6e 67 20 68 65 72 65 3a 0a 2a 2f 0a 23  cking here:.*/.#
3170: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
3180: 54 0a 20 20 69 6e 74 20 70 61 67 65 72 33 5f 72  T.  int pager3_r
3190: 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d 20  efinfo_enable = 
31a0: 30 3b 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  0;.  static void
31b0: 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 50   pager_refinfo(P
31c0: 67 48 64 72 20 2a 70 29 7b 0a 20 20 20 20 73 74  gHdr *p){.    st
31d0: 61 74 69 63 20 69 6e 74 20 63 6e 74 20 3d 20 30  atic int cnt = 0
31e0: 3b 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 72  ;.    if( !pager
31f0: 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65  3_refinfo_enable
3200: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
3210: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22 52  rintf(.       "R
3220: 45 46 43 4e 54 3a 20 25 34 64 20 61 64 64 72 3d  EFCNT: %4d addr=
3230: 30 78 25 30 38 78 20 6e 52 65 66 3d 25 64 5c 6e  0x%08x nRef=%d\n
3240: 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e 70 67 6e  ",.       p->pgn
3250: 6f 2c 20 28 69 6e 74 29 50 47 48 44 52 5f 54 4f  o, (int)PGHDR_TO
3260: 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52 65  _DATA(p), p->nRe
3270: 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6e 74  f.    );.    cnt
3280: 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68 69  ++;   /* Somethi
3290: 6e 67 20 74 6f 20 73 65 74 20 61 20 62 72 65 61  ng to set a brea
32a0: 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d  kpoint on */.  }
32b0: 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46  .# define REFINF
32c0: 4f 28 58 29 20 20 70 61 67 65 72 5f 72 65 66 69  O(X)  pager_refi
32d0: 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20 64  nfo(X).#else.# d
32e0: 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29  efine REFINFO(X)
32f0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
3300: 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ead a 32-bit int
3310: 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69  eger from the gi
3320: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
3330: 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20  tor.  Store the 
3340: 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20  integer.** that 
3350: 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73  is read in *pRes
3360: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
3370: 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
3380: 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a  g worked, or an.
3390: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
33a0: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
33b0: 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
33c0: 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28   int read32bits(
33d0: 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32 20  OsFile *fd, u32 
33e0: 2a 70 52 65 73 29 7b 0a 20 20 75 33 32 20 72 65  *pRes){.  u32 re
33f0: 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72  s;.  int rc;.  r
3400: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
3410: 64 28 66 64 2c 20 26 72 65 73 2c 20 73 69 7a 65  d(fd, &res, size
3420: 6f 66 28 72 65 73 29 29 3b 0a 20 20 69 66 28 20  of(res));.  if( 
3430: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
3440: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
3450: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 20 20 6d 65  ar ac[4];.    me
3460: 6d 63 70 79 28 61 63 2c 20 26 72 65 73 2c 20 34  mcpy(ac, &res, 4
3470: 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 28 61 63  );.    res = (ac
3480: 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63 5b 31  [0]<<24) | (ac[1
3490: 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32 5d 3c  ]<<16) | (ac[2]<
34a0: 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 20 20 7d  <8) | ac[3];.  }
34b0: 0a 20 20 2a 70 52 65 73 20 3d 20 72 65 73 3b 0a  .  *pRes = res;.
34c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
34d0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
34e0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
34f0: 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  o the given file
3500: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65   descriptor.  Re
3510: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
3520: 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  * on success or 
3530: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
3540: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
3550: 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
3560: 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73   int write32bits
3570: 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32  (OsFile *fd, u32
3580: 20 76 61 6c 29 7b 0a 20 20 75 6e 73 69 67 6e 65   val){.  unsigne
3590: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
35a0: 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34  ac[0] = (val>>24
35b0: 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 31  ) & 0xff;.  ac[1
35c0: 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26 20  ] = (val>>16) & 
35d0: 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d 20  0xff;.  ac[2] = 
35e0: 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b  (val>>8) & 0xff;
35f0: 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26  .  ac[3] = val &
3600: 20 30 78 66 66 3b 0a 20 20 72 65 74 75 72 6e 20   0xff;.  return 
3610: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66  sqlite3OsWrite(f
3620: 64 2c 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a  d, ac, 4);.}../*
3630: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
3640: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
3650: 61 20 70 61 67 65 20 68 65 61 64 65 72 20 72 69  a page header ri
3660: 67 68 74 20 62 65 66 6f 72 65 20 74 68 65 0a 2a  ght before the.*
3670: 2a 20 70 61 67 65 20 64 61 74 61 2e 20 20 54 68  * page data.  Th
3680: 69 73 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74  is will overwrit
3690: 65 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72  e the PgHdr.pDir
36a0: 74 79 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  ty pointer..*/.s
36b0: 74 61 74 69 63 20 76 6f 69 64 20 73 74 6f 72 65  tatic void store
36c0: 33 32 62 69 74 73 28 75 33 32 20 76 61 6c 2c 20  32bits(u32 val, 
36d0: 50 67 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66  PgHdr *p, int of
36e0: 66 73 65 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65  fset){.  unsigne
36f0: 64 20 63 68 61 72 20 2a 61 63 3b 0a 20 20 61 63  d char *ac;.  ac
3700: 20 3d 20 26 28 28 75 6e 73 69 67 6e 65 64 20 63   = &((unsigned c
3710: 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  har*)PGHDR_TO_DA
3720: 54 41 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a  TA(p))[offset];.
3730: 20 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e    ac[0] = (val>>
3740: 32 34 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  24) & 0xff;.  ac
3750: 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20  [1] = (val>>16) 
3760: 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20  & 0xff;.  ac[2] 
3770: 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66  = (val>>8) & 0xf
3780: 66 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c  f;.  ac[3] = val
3790: 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 0a 2f 2a 0a   & 0xff;.}.../*.
37a0: 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 62  ** Convert the b
37b0: 69 74 73 20 69 6e 20 74 68 65 20 70 50 61 67 65  its in the pPage
37c0: 72 2d 3e 65 72 72 4d 61 73 6b 20 69 6e 74 6f 20  r->errMask into 
37d0: 61 6e 20 61 70 70 72 6f 70 72 61 74 65 0a 2a 2a  an approprate.**
37e0: 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 0a 2a 2f   return code..*/
37f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
3800: 72 5f 65 72 72 63 6f 64 65 28 50 61 67 65 72 20  r_errcode(Pager 
3810: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
3820: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
3830: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
3840: 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52  rMask & PAGER_ER
3850: 52 5f 4c 4f 43 4b 20 29 20 20 20 20 72 63 20 3d  R_LOCK )    rc =
3860: 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c   SQLITE_PROTOCOL
3870: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
3880: 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f  errMask & PAGER_
3890: 45 52 52 5f 44 49 53 4b 20 29 20 20 20 20 72 63  ERR_DISK )    rc
38a0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b   = SQLITE_IOERR;
38b0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
38c0: 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45  rrMask & PAGER_E
38d0: 52 52 5f 46 55 4c 4c 20 29 20 20 20 20 72 63 20  RR_FULL )    rc 
38e0: 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
38f0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
3900: 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52  Mask & PAGER_ERR
3910: 5f 4d 45 4d 20 29 20 20 20 20 20 72 63 20 3d 20  _MEM )     rc = 
3920: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
3930: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
3940: 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f  ask & PAGER_ERR_
3950: 43 4f 52 52 55 50 54 20 29 20 72 63 20 3d 20 53  CORRUPT ) rc = S
3960: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
3970: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
3980: 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f  *.** Add or remo
3990: 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  ve a page from t
39a0: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70  he list of all p
39b0: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e  ages that are in
39c0: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
39d0: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
39e0: 20 54 68 65 20 50 61 67 65 72 20 6b 65 65 70 73   The Pager keeps
39f0: 20 61 20 73 65 70 61 72 61 74 65 20 6c 69 73 74   a separate list
3a00: 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 61   of pages that a
3a10: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a  re currently in.
3a20: 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
3a30: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20   journal.  This 
3a40: 68 65 6c 70 73 20 74 68 65 20 73 71 6c 69 74 65  helps the sqlite
3a50: 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d  3pager_stmt_comm
3a60: 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  it().** routine 
3a70: 72 75 6e 20 4d 55 43 48 20 66 61 73 74 65 72 20  run MUCH faster 
3a80: 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
3a90: 61 73 65 20 77 68 65 72 65 20 74 68 65 72 65 20  ase where there 
3aa0: 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65  are many.** page
3ab0: 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20  s in memory but 
3ac0: 6f 6e 6c 79 20 61 20 66 65 77 20 61 72 65 20 69  only a few are i
3ad0: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
3ae0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74  journal..*/.stat
3af0: 69 63 20 76 6f 69 64 20 70 61 67 65 5f 61 64 64  ic void page_add
3b00: 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67  _to_stmt_list(Pg
3b10: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
3b20: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
3b30: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20  ->pPager;.  if( 
3b40: 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72 65  pPg->inStmt ) re
3b50: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
3b60: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d  pPg->pPrevStmt==
3b70: 30 20 26 26 20 70 50 67 2d 3e 70 4e 65 78 74 53  0 && pPg->pNextS
3b80: 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 70 50 67 2d  tmt==0 );.  pPg-
3b90: 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a  >pPrevStmt = 0;.
3ba0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 53    if( pPager->pS
3bb0: 74 6d 74 20 29 7b 0a 20 20 20 20 70 50 61 67 65  tmt ){.    pPage
3bc0: 72 2d 3e 70 53 74 6d 74 2d 3e 70 50 72 65 76 53  r->pStmt->pPrevS
3bd0: 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20  tmt = pPg;.  }. 
3be0: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20   pPg->pNextStmt 
3bf0: 3d 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  = pPager->pStmt;
3c00: 0a 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  .  pPager->pStmt
3c10: 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 69   = pPg;.  pPg->i
3c20: 6e 53 74 6d 74 20 3d 20 31 3b 0a 7d 0a 73 74 61  nStmt = 1;.}.sta
3c30: 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65  tic void page_re
3c40: 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c  move_from_stmt_l
3c50: 69 73 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ist(PgHdr *pPg){
3c60: 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 53  .  if( !pPg->inS
3c70: 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  tmt ) return;.  
3c80: 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74  if( pPg->pPrevSt
3c90: 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  mt ){.    assert
3ca0: 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74  ( pPg->pPrevStmt
3cb0: 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 70 50 67  ->pNextStmt==pPg
3cc0: 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72   );.    pPg->pPr
3cd0: 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d  evStmt->pNextStm
3ce0: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  t = pPg->pNextSt
3cf0: 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  mt;.  }else{.   
3d00: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
3d10: 61 67 65 72 2d 3e 70 53 74 6d 74 3d 3d 70 50 67  ager->pStmt==pPg
3d20: 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61   );.    pPg->pPa
3d30: 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67  ger->pStmt = pPg
3d40: 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d  ->pNextStmt;.  }
3d50: 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78  .  if( pPg->pNex
3d60: 74 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73  tStmt ){.    ass
3d70: 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 53  ert( pPg->pNextS
3d80: 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d  tmt->pPrevStmt==
3d90: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
3da0: 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50 72 65 76  pNextStmt->pPrev
3db0: 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 50 72 65  Stmt = pPg->pPre
3dc0: 76 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 70 50 67  vStmt;.  }.  pPg
3dd0: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
3de0: 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d  .  pPg->pPrevStm
3df0: 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 69 6e  t = 0;.  pPg->in
3e00: 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Stmt = 0;.}../*.
3e10: 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 69  ** Find a page i
3e20: 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  n the hash table
3e30: 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65 20   given its page 
3e40: 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a  number.  Return.
3e50: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
3e60: 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c  the page or NULL
3e70: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
3e80: 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  /.static PgHdr *
3e90: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67  pager_lookup(Pag
3ea0: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
3eb0: 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
3ec0: 2a 70 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61  *p = pPager->aHa
3ed0: 73 68 5b 70 61 67 65 72 5f 68 61 73 68 28 70 67  sh[pager_hash(pg
3ee0: 6e 6f 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70  no)];.  while( p
3ef0: 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e   && p->pgno!=pgn
3f00: 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  o ){.    p = p->
3f10: 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20  pNextHash;.  }. 
3f20: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
3f30: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  .** Unlock the d
3f40: 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c 65 61  atabase and clea
3f50: 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  r the in-memory 
3f60: 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
3f70: 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65  tine.** sets the
3f80: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
3f90: 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74  ger back to what
3fa0: 20 69 74 20 77 61 73 20 77 68 65 6e 20 69 74 20   it was when it 
3fb0: 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65  was first.** ope
3fc0: 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61  ned.  Any outsta
3fd0: 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
3fe0: 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20  invalidated and 
3ff0: 73 75 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d  subsequent attem
4000: 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  pts.** to access
4010: 20 74 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c   those pages wil
4020: 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20  l likely result 
4030: 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
4040: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
4050: 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20  ger_reset(Pager 
4060: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
4070: 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a  r *pPg, *pNext;.
4080: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
4090: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
40a0: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
40b0: 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  xt = pPg->pNextA
40c0: 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  ll;.    sqliteFr
40d0: 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70  ee(pPg);.  }.  p
40e0: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
40f0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69  0;.  pPager->pFi
4100: 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20  rstSynced = 0;. 
4110: 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
4120: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41   0;.  pPager->pA
4130: 6c 6c 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  ll = 0;.  memset
4140: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
4150: 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
4160: 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 70 50 61  ->aHash));.  pPa
4170: 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  ger->nPage = 0;.
4180: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
4190: 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
41a0: 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  VED ){.    sqlit
41b0: 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
41c0: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
41d0: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
41e0: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f  &pPager->fd, NO_
41f0: 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d  LOCK);.  pPager-
4200: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
4210: 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d  NLOCK;.  pPager-
4220: 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
4230: 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30  pPager->nRef = 0
4240: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
4250: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
4260: 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  =0 );.}../*.** W
4270: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
4280: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
4290: 70 61 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f  pager has the jo
42a0: 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20  urnal file open 
42b0: 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45  and.** a RESERVE
42c0: 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
42d0: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
42e0: 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ase.  This routi
42f0: 6e 65 20 72 65 6c 65 61 73 65 73 0a 2a 2a 20 74  ne releases.** t
4300: 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
4310: 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20   and acquires a 
4320: 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69  SHARED lock in i
4330: 74 73 20 70 6c 61 63 65 2e 20 20 54 68 65 20 6a  ts place.  The j
4340: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 69  ournal.** file i
4350: 73 20 64 65 6c 65 74 65 64 20 61 6e 64 20 63 6c  s deleted and cl
4360: 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f  osed..**.** TODO
4370: 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70 69  : Consider keepi
4380: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
4390: 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d  ile open for tem
43a0: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73  porary databases
43b0: 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20  ..** This might 
43c0: 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e  give a performan
43d0: 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f  ce improvement o
43e0: 6e 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65 20  n windows where 
43f0: 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c  opening.** a fil
4400: 65 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76  e is an expensiv
4410: 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  e operation..*/.
4420: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
4430: 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 50 61 67  _unwritelock(Pag
4440: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
4450: 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 66 28  gHdr *pPg;.  if(
4460: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50   pPager->state<P
4470: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
4480: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
4490: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c  TE_OK;.  }.  sql
44a0: 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63  ite3pager_stmt_c
44b0: 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20  ommit(pPager);. 
44c0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
44d0: 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  tOpen ){.    sql
44e0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61  ite3OsClose(&pPa
44f0: 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20  ger->stfd);.    
4500: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
4510: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
4520: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
4530: 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
4540: 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  e3OsClose(&pPage
4550: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 70 50 61  r->jfd);.    pPa
4560: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
4570: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
4580: 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
4590: 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  ->zJournal);.   
45a0: 20 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61   sqliteFree( pPa
45b0: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
45c0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
45d0: 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
45e0: 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
45f0: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
4600: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
4610: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  {.      pPg->inJ
4620: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
4630: 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
4640: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
4650: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d  dSync = 0;.    }
4660: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
4670: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69  sert( pPager->di
4680: 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70  rtyCache==0 || p
4690: 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
46a0: 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 73 71  l==0 );.  }.  sq
46b0: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70  lite3OsUnlock(&p
46c0: 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45  Pager->fd, SHARE
46d0: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65  D_LOCK);.  pPage
46e0: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
46f0: 5f 53 48 41 52 45 44 3b 0a 20 20 72 65 74 75 72  _SHARED;.  retur
4700: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
4710: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e  /*.** Compute an
4720: 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b  d return a check
4730: 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67 65  sum for the page
4740: 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20   of data..**.** 
4750: 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65  This is not a re
4760: 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49 74  al checksum.  It
4770: 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20   is really just 
4780: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a  the sum of the .
4790: 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  ** random initia
47a0: 6c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20  l value and the 
47b0: 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57 65  page number.  We
47c0: 20 63 6f 6e 73 69 64 65 72 65 64 20 64 6f 20 61   considered do a
47d0: 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 20 6f 66 20   checksum.** of 
47e0: 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 62 75  the database, bu
47f0: 74 20 74 68 61 74 20 77 61 73 20 66 6f 75 6e 64  t that was found
4800: 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77 2e   to be too slow.
4810: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
4820: 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72  ager_cksum(Pager
4830: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
4840: 67 6e 6f 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  gno, const char 
4850: 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63  *aData){.  u32 c
4860: 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63  ksum = pPager->c
4870: 6b 73 75 6d 49 6e 69 74 20 2b 20 70 67 6e 6f 3b  ksumInit + pgno;
4880: 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b  .  return cksum;
4890: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
48a0: 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f   single page fro
48b0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
48c0: 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c  le opened on fil
48d0: 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20  e descriptor.** 
48e0: 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74  jfd.  Playback t
48f0: 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a  his one page..**
4900: 0a 2a 2a 20 0a 2a 2a 20 0a 2a 2a 20 54 68 65 72  .** .** .** Ther
4910: 65 20 61 72 65 20 74 68 72 65 65 20 64 69 66 66  e are three diff
4920: 65 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f  erent journal fo
4930: 72 6d 61 74 73 2e 20 20 54 68 65 20 66 6f 72 6d  rmats.  The form
4940: 61 74 20 70 61 72 61 6d 65 74 65 72 20 64 65 74  at parameter det
4950: 65 72 6d 69 6e 65 73 0a 2a 2a 20 77 68 69 63 68  ermines.** which
4960: 20 66 6f 72 6d 61 74 20 69 73 20 75 73 65 64 20   format is used 
4970: 62 79 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  by the journal t
4980: 68 61 74 20 69 73 20 70 6c 61 79 65 64 20 62 61  hat is played ba
4990: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
49a0: 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
49b0: 5f 6f 6e 65 5f 70 61 67 65 28 50 61 67 65 72 20  _one_page(Pager 
49c0: 2a 70 50 61 67 65 72 2c 20 4f 73 46 69 6c 65 20  *pPager, OsFile 
49d0: 2a 6a 66 64 2c 20 69 6e 74 20 75 73 65 43 6b 73  *jfd, int useCks
49e0: 75 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  um){.  int rc;. 
49f0: 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20   PgHdr *pPg;    
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4a10: 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61  * An existing pa
4a20: 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  ge in the cache 
4a30: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20  */.  Pgno pgno; 
4a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a50: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
4a60: 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20  umber of a page 
4a70: 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
4a80: 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20  u32 cksum;      
4a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4aa0: 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66   Checksum used f
4ab0: 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  or sanity checki
4ac0: 6e 67 20 2a 2f 0a 20 20 75 38 20 61 44 61 74 61  ng */.  u8 aData
4ad0: 5b 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a  [SQLITE_PAGE_SIZ
4ae0: 45 5d 3b 20 20 20 2f 2a 20 53 74 6f 72 65 20 64  E];   /* Store d
4af0: 61 74 61 20 68 65 72 65 20 2a 2f 0a 0a 20 20 72  ata here */..  r
4b00: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
4b10: 66 64 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66  fd, &pgno);.  if
4b20: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
4b30: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
4b40: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
4b50: 64 28 6a 66 64 2c 20 26 61 44 61 74 61 2c 20 70  d(jfd, &aData, p
4b60: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
4b70: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
4b80: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
4b90: 63 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20  c;..  /* Sanity 
4ba0: 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20  checking on the 
4bb0: 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d  page.  This is m
4bc0: 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ore important th
4bd0: 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a  at I originally.
4be0: 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49    ** thought.  I
4bf0: 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  f a power failur
4c00: 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  e occurs while t
4c10: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
4c20: 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a  ing written,.  *
4c30: 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65  * it could cause
4c40: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f   invalid data to
4c50: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
4c60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57   the journal.  W
4c70: 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64  e need to.  ** d
4c80: 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c  etect this inval
4c90: 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69  id data (with hi
4ca0: 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20  gh probability) 
4cb0: 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20  and ignore it.. 
4cc0: 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   */.  if( pgno==
4cd0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
4ce0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
4cf0: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73  .  if( pgno>(uns
4d00: 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62  igned)pPager->db
4d10: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
4d20: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
4d30: 7d 0a 20 20 69 66 28 20 75 73 65 43 6b 73 75 6d  }.  if( useCksum
4d40: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61   ){.    rc = rea
4d50: 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26 63 6b  d32bits(jfd, &ck
4d60: 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sum);.    if( rc
4d70: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
4d80: 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75    if( pager_cksu
4d90: 6d 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  m(pPager, pgno, 
4da0: 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b  aData)!=cksum ){
4db0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
4dc0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
4dd0: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
4de0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
4df0: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c  AGER_RESERVED ||
4e00: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
4e10: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
4e20: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
4e30: 70 61 67 65 72 20 69 73 20 69 6e 20 52 45 53 45  pager is in RESE
4e40: 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e  RVED state, then
4e50: 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
4e60: 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20   copy of this.  
4e70: 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70  ** page in the p
4e80: 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74  ager cache. In t
4e90: 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70  his case just up
4ea0: 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
4eb0: 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74  ache,.  ** not t
4ec0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
4ed0: 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65  . The page is le
4ee0: 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20  ft marked dirty 
4ef0: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
4f00: 2a 2a 0a 20 20 2a 2a 20 46 49 58 20 4d 45 3a 20  **.  ** FIX ME: 
4f10: 49 64 65 61 6c 6c 79 20 74 68 65 20 70 61 67 65  Ideally the page
4f20: 20 77 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6c   would only be l
4f30: 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79  eft marked dirty
4f40: 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 70   when the.  ** p
4f50: 61 67 65 72 20 69 73 20 69 6e 20 52 45 53 45 52  ager is in RESER
4f60: 56 45 44 20 73 74 61 74 65 20 69 66 20 69 74 20  VED state if it 
4f70: 77 61 73 20 64 69 72 74 79 20 77 68 65 6e 20 74  was dirty when t
4f80: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  his statement.  
4f90: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
4fa0: 61 73 20 73 74 61 72 74 65 64 2e 20 0a 20 20 2a  as started. .  *
4fb0: 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43  *.  ** If in EXC
4fc0: 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74 68  LUSIVE state, th
4fd0: 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65  en we update the
4fe0: 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20   pager cache if 
4ff0: 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61  it exists.  ** a
5000: 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65  nd the main file
5010: 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68  . The page is th
5020: 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69  en marked not di
5030: 72 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20  rty..  */.  pPg 
5040: 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
5050: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
5060: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
5070: 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 58 43  state==PAGER_EXC
5080: 4c 55 53 49 56 45 20 7c 7c 20 70 50 67 20 29 3b  LUSIVE || pPg );
5090: 0a 20 20 54 52 41 43 45 32 28 22 50 4c 41 59 42  .  TRACE2("PLAYB
50a0: 41 43 4b 20 70 61 67 65 20 25 64 5c 6e 22 2c 20  ACK page %d\n", 
50b0: 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61  pgno);.  if( pPa
50c0: 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
50d0: 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20  R_EXCLUSIVE ){. 
50e0: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b     sqlite3OsSeek
50f0: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70  (&pPager->fd, (p
5100: 67 6e 6f 2d 31 29 2a 28 6f 66 66 5f 74 29 53 51  gno-1)*(off_t)SQ
5110: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
5120: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
5130: 33 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72  3OsWrite(&pPager
5140: 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 53 51 4c  ->fd, aData, SQL
5150: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
5160: 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b    }.  if( pPg ){
5170: 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20  .    /* No page 
5180: 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20 72  should ever be r
5190: 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20  olled back that 
51a0: 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70  is in use, excep
51b0: 74 20 66 6f 72 20 70 61 67 65 0a 20 20 20 20 2a  t for page.    *
51c0: 2a 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c  * 1 which is hel
51d0: 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65  d in use in orde
51e0: 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f  r to keep the lo
51f0: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
5200: 73 65 0a 20 20 20 20 2a 2a 20 61 63 74 69 76 65  se.    ** active
5210: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69  ..    */.    voi
5220: 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 61 73  d *pData;.    as
5230: 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d  sert( pPg->nRef=
5240: 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d  =0 || pPg->pgno=
5250: 3d 31 20 29 3b 0a 20 20 20 20 70 44 61 74 61 20  =1 );.    pData 
5260: 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  = PGHDR_TO_DATA(
5270: 70 50 67 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  pPg);.    memcpy
5280: 28 70 44 61 74 61 2c 20 61 44 61 74 61 2c 20 70  (pData, aData, p
5290: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
52a0: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
52b0: 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b  ->xDestructor ){
52c0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78  .      pPager->x
52d0: 44 65 73 74 72 75 63 74 6f 72 28 70 44 61 74 61  Destructor(pData
52e0: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
52f0: 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ze);.    }.    i
5300: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
5310: 3d 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ==PAGER_EXCLUSIV
5320: 45 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  E ){.      pPg->
5330: 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  dirty = 0;.     
5340: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
5350: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 43   0;.    }..    C
5360: 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61  ODEC(pPager, pDa
5370: 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  ta, pPg->pgno, 3
5380: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
5390: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  rc;.}../*.** Par
53a0: 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69  ameter zMaster i
53b0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
53c0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
53d0: 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f  ile. A single jo
53e0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68  urnal.** file th
53f0: 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74  at referred to t
5400: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
5410: 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20  l file has just 
5420: 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
5430: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
5440: 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69  e checks if it i
5450: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
5460: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
5470: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a  journal file,.**
5480: 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20   and does so if 
5490: 69 74 20 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  it is..*/.static
54a0: 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61   int pager_delma
54b0: 73 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20  ster(const char 
54c0: 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
54d0: 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65   rc;.  int maste
54e0: 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f 73  r_open = 0;.  Os
54f0: 46 69 6c 65 20 6d 61 73 74 65 72 3b 0a 20 20 63  File master;.  c
5500: 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72  har *zMasterJour
5510: 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74  nal = 0; /* Cont
5520: 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a  ents of master j
5530: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
5540: 20 6f 66 66 5f 74 20 6e 4d 61 73 74 65 72 4a 6f   off_t nMasterJo
5550: 75 72 6e 61 6c 3b 20 20 20 20 20 2f 2a 20 53 69  urnal;     /* Si
5560: 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ze of master jou
5570: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  rnal file */..  
5580: 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74  /* Open the mast
5590: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
55a0: 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63  exclusively in c
55b0: 61 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  ase some other p
55c0: 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72  rocess.  ** is r
55d0: 75 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74  unning this rout
55e0: 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68  ine also. Not th
55f0: 61 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20  at it makes too 
5600: 6d 75 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e  much difference.
5610: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
5620: 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73  ite3OsOpenExclus
5630: 69 76 65 28 7a 4d 61 73 74 65 72 2c 20 26 6d 61  ive(zMaster, &ma
5640: 73 74 65 72 2c 20 30 29 3b 0a 20 20 69 66 28 20  ster, 0);.  if( 
5650: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
5660: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
5670: 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65  ut;.  master_ope
5680: 6e 20 3d 20 31 3b 0a 0a 20 20 72 63 20 3d 20 73  n = 1;..  rc = s
5690: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
56a0: 28 26 6d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74  (&master, &nMast
56b0: 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  erJournal);.  if
56c0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
56d0: 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
56e0: 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61  _out;..  if( nMa
56f0: 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b  sterJournal>0 ){
5700: 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62 3b 0a  .    char *zDb;.
5710: 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e      zMasterJourn
5720: 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  al = (char *)sql
5730: 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65  iteMalloc(nMaste
5740: 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69  rJournal);.    i
5750: 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  f( !zMasterJourn
5760: 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  al ){.      rc =
5770: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
5780: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
5790: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ter_out;.    }. 
57a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
57b0: 73 52 65 61 64 28 26 6d 61 73 74 65 72 2c 20 7a  sRead(&master, z
57c0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e  MasterJournal, n
57d0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
57e0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
57f0: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
5800: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20  master_out;..   
5810: 20 7a 44 62 20 3d 20 7a 4d 61 73 74 65 72 4a 6f   zDb = zMasterJo
5820: 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65  urnal;.    while
5830: 28 20 28 7a 44 62 2d 7a 4d 61 73 74 65 72 4a 6f  ( (zDb-zMasterJo
5840: 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f  urnal)<nMasterJo
5850: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 63  urnal ){.      c
5860: 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 20 3d 20  har *zJournal = 
5870: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
5880: 53 65 74 53 74 72 69 6e 67 28 26 7a 4a 6f 75 72  SetString(&zJour
5890: 6e 61 6c 2c 20 7a 44 62 2c 20 22 2d 6a 6f 75 72  nal, zDb, "-jour
58a0: 6e 61 6c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  nal", 0);.      
58b0: 69 66 28 20 21 7a 4a 6f 75 72 6e 61 6c 20 29 7b  if( !zJournal ){
58c0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
58d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
58e0: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
58f0: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
5900: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
5910: 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4a  3OsFileExists(zJ
5920: 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20  ournal) ){.     
5930: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
5940: 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65   journals pointe
5950: 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74  d to by the mast
5960: 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  er journal exist
5970: 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70  s..        ** Op
5980: 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20  en it and check 
5990: 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  if it points at 
59a0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
59b0: 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a  al. If.        *
59c0: 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74  * so, return wit
59d0: 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68  hout deleting th
59e0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
59f0: 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
5a00: 2f 0a 20 20 20 20 20 20 20 20 4f 73 46 69 6c 65  /.        OsFile
5a10: 20 6a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 20 20   journal;.      
5a20: 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b 0a 20    int nMaster;. 
5a30: 20 20 20 20 20 20 20 6f 66 66 5f 74 20 6a 73 7a         off_t jsz
5a40: 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ;..        rc = 
5a50: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
5a60: 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61 6c 2c 20  dOnly(zJournal, 
5a70: 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  &journal);.     
5a80: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4a     sqliteFree(zJ
5a90: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  ournal);.       
5aa0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5ab0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
5ac0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
5ad0: 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  journal);.      
5ae0: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
5af0: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
5b00: 7d 0a 0a 09 2f 2a 20 43 68 65 63 6b 20 69 66 20  }.../* Check if 
5b10: 74 68 65 20 66 69 6c 65 20 69 73 20 62 69 67 20  the file is big 
5b20: 65 6e 6f 75 67 68 20 74 6f 20 62 65 20 61 20 6a  enough to be a j
5b30: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20  ournal file.    
5b40: 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20      ** with the 
5b50: 72 65 71 75 69 72 65 64 20 6d 61 73 74 65 72 20  required master 
5b60: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 49 66  journal name. If
5b70: 20 6e 6f 74 2c 20 69 67 6e 6f 72 65 20 69 74 2e   not, ignore it.
5b80: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
5b90: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
5ba0: 4f 73 46 69 6c 65 53 69 7a 65 28 26 6a 6f 75 72  OsFileSize(&jour
5bb0: 6e 61 6c 2c 20 26 6a 73 7a 29 3b 0a 20 20 20 20  nal, &jsz);.    
5bc0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
5bd0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
5be0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
5bf0: 65 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  e(&journal);.   
5c00: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
5c10: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
5c20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
5c30: 20 6a 73 7a 3c 28 32 35 2b 73 74 72 6c 65 6e 28   jsz<(25+strlen(
5c40: 7a 4d 61 73 74 65 72 29 29 20 29 7b 0a 20 20 20  zMaster)) ){.   
5c50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
5c60: 43 6c 6f 73 65 28 26 6a 6f 75 72 6e 61 6c 29 3b  Close(&journal);
5c70: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
5c80: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
5c90: 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
5ca0: 2f 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 70  /* Seek to the p
5cb0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  oint in the jour
5cc0: 6e 61 6c 20 77 68 65 72 65 20 74 68 65 20 6d 61  nal where the ma
5cd0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
5ce0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  e.        ** is 
5cf0: 73 74 6f 72 65 64 2e 20 52 65 61 64 20 74 68 65  stored. Read the
5d00: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5d10: 6e 61 6d 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  name into memory
5d20: 20 6f 62 74 61 69 6e 65 64 0a 20 20 20 20 20 20   obtained.      
5d30: 20 20 2a 2a 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63    ** from malloc
5d40: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
5d50: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
5d60: 33 4f 73 53 65 65 6b 28 26 6a 6f 75 72 6e 61 6c  3OsSeek(&journal
5d70: 2c 20 32 30 29 3b 0a 20 20 20 20 20 20 20 20 69  , 20);.        i
5d80: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
5d90: 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
5da0: 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 72  r_out;.        r
5db0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 26  c = read32bits(&
5dc0: 6a 6f 75 72 6e 61 6c 2c 20 28 75 33 32 2a 29 26  journal, (u32*)&
5dd0: 6e 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  nMaster);.      
5de0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5df0: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
5e00: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
5e10: 20 20 69 66 28 20 6e 4d 61 73 74 65 72 3e 30 20    if( nMaster>0 
5e20: 26 26 20 6e 4d 61 73 74 65 72 3e 3d 73 74 72 6c  && nMaster>=strl
5e30: 65 6e 28 7a 4d 61 73 74 65 72 29 2b 31 20 29 7b  en(zMaster)+1 ){
5e40: 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
5e50: 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 28 63  *zMasterPtr = (c
5e60: 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c  har *)sqliteMall
5e70: 6f 63 28 6e 4d 61 73 74 65 72 29 3b 0a 20 20 20  oc(nMaster);.   
5e80: 20 20 20 20 20 20 20 69 66 28 20 21 7a 4d 61 73         if( !zMas
5e90: 74 65 72 50 74 72 20 29 7b 0a 20 20 20 20 20 20  terPtr ){.      
5ea0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
5eb0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
5ec0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
5ed0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
5ee0: 64 28 26 6a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73  d(&journal, zMas
5ef0: 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 29  terPtr, nMaster)
5f00: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
5f10: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
5f20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
5f30: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 50  iteFree(zMasterP
5f40: 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  tr);.           
5f50: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
5f60: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  out;.          }
5f70: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 30  .          if( 0
5f80: 3d 3d 73 74 72 6e 63 6d 70 28 7a 4d 61 73 74 65  ==strncmp(zMaste
5f90: 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  rPtr, zMaster, n
5fa0: 4d 61 73 74 65 72 29 20 29 7b 0a 20 20 20 20 20  Master) ){.     
5fb0: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
5fc0: 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
5fd0: 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
5fe0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
5ff0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
6000: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73   sqliteFree(zMas
6010: 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20  terPtr);.       
6020: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
6030: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
6040: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
6050: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 44 62       }.      zDb
6060: 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 44 62 29   += (strlen(zDb)
6070: 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  +1);.    }.  }. 
6080: 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c   .  sqlite3OsDel
6090: 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64  ete(zMaster);..d
60a0: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20  elmaster_out:.  
60b0: 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  if( zMasterJourn
60c0: 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
60d0: 46 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72  Free(zMasterJour
60e0: 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66  nal);.  }  .  if
60f0: 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b  ( master_open ){
6100: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
6110: 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20  ose(&master);.  
6120: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6130: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 65 76 65  ../*.** Make eve
6140: 72 79 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  ry page in the c
6150: 61 63 68 65 20 61 67 72 65 65 20 77 69 74 68 20  ache agree with 
6160: 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e  what is on disk.
6170: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
6180: 2c 0a 2a 2a 20 72 65 72 65 61 64 20 74 68 65 20  ,.** reread the 
6190: 64 69 73 6b 20 74 6f 20 72 65 73 65 74 20 74 68  disk to reset th
61a0: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63  e state of the c
61b0: 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ache..**.** This
61c0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
61d0: 65 64 20 61 66 74 65 72 20 61 20 72 6f 6c 6c 62  ed after a rollb
61e0: 61 63 6b 20 69 6e 20 77 68 69 63 68 20 73 6f 6d  ack in which som
61f0: 65 20 6f 66 20 74 68 65 20 64 69 72 74 79 20 63  e of the dirty c
6200: 61 63 68 65 0a 2a 2a 20 70 61 67 65 73 20 68 61  ache.** pages ha
6210: 64 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69  d never been wri
6220: 74 74 65 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b  tten out to disk
6230: 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f  .  We need to ro
6240: 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 63  ll back the.** c
6250: 61 63 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64  ache content and
6260: 20 74 68 65 20 65 61 73 69 65 73 74 20 77 61 79   the easiest way
6270: 20 74 6f 20 64 6f 20 74 68 61 74 20 69 73 20 74   to do that is t
6280: 6f 20 72 65 72 65 61 64 20 74 68 65 20 6f 6c 64  o reread the old
6290: 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62 61 63 6b   content.** back
62a0: 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 2e 0a   from the disk..
62b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
62c0: 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65  ger_reload_cache
62d0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
62e0: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
62f0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
6300: 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70  _OK;.  for(pPg=p
6310: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
6320: 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
6330: 41 6c 6c 29 7b 0a 20 20 20 20 63 68 61 72 20 7a  All){.    char z
6340: 42 75 66 5b 53 51 4c 49 54 45 5f 50 41 47 45 5f  Buf[SQLITE_PAGE_
6350: 53 49 5a 45 5d 3b 0a 20 20 20 20 69 66 28 20 21  SIZE];.    if( !
6360: 70 50 67 2d 3e 64 69 72 74 79 20 29 20 63 6f 6e  pPg->dirty ) con
6370: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
6380: 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
6390: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
63a0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ize ){.      sql
63b0: 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67  ite3OsSeek(&pPag
63c0: 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 50  er->fd, SQLITE_P
63d0: 41 47 45 5f 53 49 5a 45 2a 28 6f 66 66 5f 74 29  AGE_SIZE*(off_t)
63e0: 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 29 3b 0a  (pPg->pgno-1));.
63f0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
6400: 65 33 4f 73 52 65 61 64 28 26 70 50 61 67 65 72  e3OsRead(&pPager
6410: 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 53 51 4c 49  ->fd, zBuf, SQLI
6420: 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  TE_PAGE_SIZE);. 
6430: 20 20 20 20 20 54 52 41 43 45 32 28 22 52 45 46       TRACE2("REF
6440: 45 54 43 48 20 70 61 67 65 20 25 64 5c 6e 22 2c  ETCH page %d\n",
6450: 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
6460: 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
6470: 20 7a 42 75 66 2c 20 70 50 67 2d 3e 70 67 6e 6f   zBuf, pPg->pgno
6480: 2c 20 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 2);.      if( 
6490: 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
64a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
64b0: 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 53 51 4c  set(zBuf, 0, SQL
64c0: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
64d0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
64e0: 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 6d 65  g->nRef==0 || me
64f0: 6d 63 6d 70 28 7a 42 75 66 2c 20 50 47 48 44 52  mcmp(zBuf, PGHDR
6500: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 53  _TO_DATA(pPg), S
6510: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
6520: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
6530: 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
6540: 50 67 29 2c 20 7a 42 75 66 2c 20 53 51 4c 49 54  Pg), zBuf, SQLIT
6550: 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  E_PAGE_SIZE);.  
6560: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
6570: 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20  xReiniter ){.   
6580: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
6590: 69 6e 69 74 65 72 28 50 47 48 44 52 5f 54 4f 5f  initer(PGHDR_TO_
65a0: 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65  DATA(pPg), pPage
65b0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
65c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
65d0: 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
65e0: 54 4f 5f 45 58 54 52 41 28 70 50 67 29 2c 20 30  TO_EXTRA(pPg), 0
65f0: 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  , pPager->nExtra
6600: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
6610: 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79  .    pPg->needSy
6620: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d  nc = 0;.    pPg-
6630: 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a  >dirty = 0;.  }.
6640: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
6650: 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
6660: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
6670: 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65  thus restore the
6680: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
6690: 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69  o.** the state i
66a0: 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20  t was in before 
66b0: 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e  we started makin
66c0: 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a  g changes.  .**.
66d0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
66e0: 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73  ile format is as
66f0: 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a   follows: .**.**
6700: 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72    (1)  8 byte pr
6710: 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66  efix.  A copy of
6720: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
6730: 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74  ..**  (2)  4 byt
6740: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
6750: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
6760: 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69  e number of vali
6770: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a  d page records.*
6780: 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a  *       in the j
6790: 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73  ournal.  If this
67a0: 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
67b0: 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75  ffff, then compu
67c0: 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
67d0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
67e0: 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
67f0: 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a  journal size..**
6800: 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69    (3)  4 byte bi
6810: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
6820: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
6830: 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20  itial value for 
6840: 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61  the .**       sa
6850: 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  nity checksum..*
6860: 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69  *  (4)  4 byte i
6870: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
6880: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
6890: 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20  ges to truncate 
68a0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74  the.**       dat
68b0: 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20  abase to during 
68c0: 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20  a rollback..**  
68d0: 28 35 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (5)  4 byte inte
68e0: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
68f0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
6900: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a   in the master j
6910: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
6920: 6e 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65  name.  The value
6930: 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e   may be zero (in
6940: 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 72  dicate that ther
6950: 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a  e is no master.*
6960: 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e  *       journal.
6970: 29 0a 2a 2a 20 20 28 36 29 20 20 4e 20 62 79 74  ).**  (6)  N byt
6980: 65 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  es of the master
6990: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20   journal name.  
69a0: 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65  The name will be
69b0: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a   nul-terminated.
69c0: 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67  **       and mig
69d0: 68 74 20 62 65 20 73 68 6f 72 74 65 72 20 74 68  ht be shorter th
69e0: 61 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  an the value rea
69f0: 64 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20  d from (5).  If 
6a00: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a  the first byte.*
6a10: 2a 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e  *       of the n
6a20: 61 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e  ame is \000 then
6a30: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73   there is no mas
6a40: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ter journal.  Th
6a50: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20  e master.**     
6a60: 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69    journal name i
6a70: 73 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d  s stored in UTF-
6a80: 38 2e 0a 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f  8..**  (7)  Zero
6a90: 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69   or more pages i
6aa0: 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61  nstances, each a
6ab0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20  s follows:.**   
6ac0: 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70       +  4 byte p
6ad0: 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20  age number..**  
6ae0: 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d        +  pPager-
6af0: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
6b00: 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20  of data..**     
6b10: 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65     +  4 byte che
6b20: 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  cksum.**.** When
6b30: 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65   we speak of the
6b40: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c   journal header,
6b50: 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72   we mean the fir
6b60: 73 74 20 36 20 69 74 65 6d 73 20 61 62 6f 76 65  st 6 items above
6b70: 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20  ..** Each entry 
6b80: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
6b90: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
6ba0: 20 74 68 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a   the 7th item..*
6bb0: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61  *.** Call the va
6bc0: 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63  lue from the sec
6bd0: 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63  ond bullet "nRec
6be0: 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20  ".  nRec is the 
6bf0: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c  number of.** val
6c00: 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20  id page entries 
6c10: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
6c20: 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20   In most cases, 
6c30: 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20  you can compute 
6c40: 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
6c50: 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69  nRec from the si
6c60: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
6c70: 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20  l file.  But if 
6c80: 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  a power.** failu
6c90: 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
6ca0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  e the journal wa
6cb0: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
6cc0: 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65   it could be the
6cd0: 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68  .** case that th
6ce0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
6cf0: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61  urnal file had a
6d00: 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
6d10: 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65  eased but.** the
6d20: 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68   extra entries h
6d30: 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20  ad not yet made 
6d40: 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73  it safely to dis
6d50: 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61  k.  In such a ca
6d60: 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  se,.** the value
6d70: 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65   of nRec compute
6d80: 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  d from the file 
6d90: 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  size would be to
6da0: 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a  o large.  For.**
6db0: 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65   that reason, we
6dc0: 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
6dd0: 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68  nRec value in th
6de0: 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  e header..**.** 
6df0: 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  If the nRec valu
6e00: 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20  e is 0xffffffff 
6e10: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52  it means that nR
6e20: 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ec should be com
6e30: 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68  puted.** from th
6e40: 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68  e file size.  Th
6e50: 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64  is value is used
6e60: 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73   when the user s
6e70: 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f  elects the.** no
6e80: 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72  -sync option for
6e90: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
6ea0: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
6eb0: 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72  ould lead to cor
6ec0: 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  ruption.** in th
6ed0: 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f  is case.  But fo
6ee0: 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65  r things like te
6ef0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77  mporary table (w
6f00: 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  hich will be.** 
6f10: 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
6f20: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
6f30: 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72  ed) we don't car
6f40: 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e.  .**.** If th
6f50: 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73  e file opened as
6f60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6f70: 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d  e is not a well-
6f80: 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61  formed.** journa
6f90: 6c 20 66 69 6c 65 20 74 68 65 6e 20 74 68 65 20  l file then the 
6fa0: 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 6c 69  database will li
6fb0: 6b 65 6c 79 20 61 6c 72 65 61 64 79 20 62 65 0a  kely already be.
6fc0: 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20 73 6f  ** corrupted, so
6fd0: 20 74 68 65 20 50 41 47 45 52 5f 45 52 52 5f 43   the PAGER_ERR_C
6fe0: 4f 52 52 55 50 54 20 62 69 74 20 69 73 20 73 65  ORRUPT bit is se
6ff0: 74 20 69 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  t in pPager->err
7000: 4d 61 73 6b 0a 2a 2a 20 61 6e 64 20 53 51 4c 49  Mask.** and SQLI
7010: 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65  TE_CORRUPT is re
7020: 74 75 72 6e 65 64 2e 20 20 49 66 20 69 74 20 61  turned.  If it a
7030: 6c 6c 20 77 6f 72 6b 73 2c 20 74 68 65 6e 20 74  ll works, then t
7040: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
7050: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
7060: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7070: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50  pager_playback(P
7080: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
7090: 74 20 75 73 65 4a 6f 75 72 6e 61 6c 53 69 7a 65  t useJournalSize
70a0: 29 7b 0a 20 20 6f 66 66 5f 74 20 73 7a 4a 3b 20  ){.  off_t szJ; 
70b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
70c0: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   Size of the jou
70d0: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
70e0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63  es */.  int nRec
70f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7100: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65   /* Number of Re
7110: 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75  cords in the jou
7120: 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  rnal */.  int i;
7130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7140: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
7150: 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  er */.  Pgno mxP
7160: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
7170: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
7180: 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e  original file in
7190: 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 6e 73 69   pages */.  unsi
71a0: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
71b0: 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72  [8]; /* A buffer
71c0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
71d0: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ic header */.  i
71e0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
71f0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
7200: 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
7210: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
7220: 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20  nMaster;        
7230: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7240: 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6e  f bytes in the n
7250: 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ame of master jo
7260: 75 72 6e 61 6c 20 2a 2f 0a 20 20 63 68 61 72 20  urnal */.  char 
7270: 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20  *zMaster = 0;   
7280: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d      /* Name of m
7290: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
72a0: 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20  le if any */..  
72b0: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
72c0: 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
72d0: 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
72e0: 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20  l.  Abort early 
72f0: 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  if.  ** the jour
7300: 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20  nal is empty..  
7310: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
7320: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
7330: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 53   );.  sqlite3OsS
7340: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
7350: 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  , 0);.  rc = sql
7360: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26  ite3OsFileSize(&
7370: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
7380: 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  J);.  if( rc!=SQ
7390: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
73a0: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
73b0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
73c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
73d0: 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 74 6f 20  is too small to 
73e0: 63 6f 6e 74 61 69 6e 20 61 20 63 6f 6d 70 6c 65  contain a comple
73f0: 74 65 20 68 65 61 64 65 72 2c 0a 20 20 2a 2a 20  te header,.  ** 
7400: 69 74 20 6d 75 73 74 20 6d 65 61 6e 20 74 68 61  it must mean tha
7410: 74 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  t the process th
7420: 61 74 20 63 72 65 61 74 65 64 20 74 68 65 20 6a  at created the j
7430: 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74 0a  ournal was just.
7440: 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 74    ** beginning t
7450: 6f 20 77 72 69 74 65 20 74 68 65 20 6a 6f 75 72  o write the jour
7460: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74  nal file when it
7470: 20 64 69 65 64 2e 20 20 49 6e 20 74 68 61 74 20   died.  In that 
7480: 63 61 73 65 2c 0a 20 20 2a 2a 20 74 68 65 20 64  case,.  ** the d
7490: 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
74a0: 75 6c 64 20 68 61 76 65 20 73 74 69 6c 6c 20 62  uld have still b
74b0: 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75  een completely u
74c0: 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 20 4e  nchanged..  ** N
74d0: 6f 74 68 69 6e 67 20 6e 65 65 64 73 20 74 6f 20  othing needs to 
74e0: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  be rolled back. 
74f0: 20 57 65 20 63 61 6e 20 73 61 66 65 6c 79 20 69   We can safely i
7500: 67 6e 6f 72 65 20 74 68 69 73 20 6a 6f 75 72 6e  gnore this journ
7510: 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  al..  */.  if( s
7520: 7a 4a 20 3c 20 32 34 20 29 7b 0a 20 20 20 20 67  zJ < 24 ){.    g
7530: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
7540: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 28 31 29 20  ;.  }..  /* (1) 
7550: 52 65 61 64 20 74 68 65 20 62 65 67 69 6e 6e 69  Read the beginni
7560: 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ng of the journa
7570: 6c 20 61 6e 64 20 76 65 72 69 66 79 20 74 68 65  l and verify the
7580: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 0a 20 20   magic string.  
7590: 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ** at the beginn
75a0: 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ing of the journ
75b0: 61 6c 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  al. */.  rc = sq
75c0: 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70 50 61  lite3OsRead(&pPa
75d0: 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63  ger->jfd, aMagic
75e0: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
75f0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
7600: 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70  ITE_OK || memcmp
7610: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
7620: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
7630: 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20  Magic))!=0 ){.  
7640: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 52    rc = SQLITE_PR
7650: 4f 54 4f 43 4f 4c 3b 0a 20 20 20 20 67 6f 74 6f  OTOCOL;.    goto
7660: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
7670: 20 7d 0a 0a 20 20 2f 2a 20 28 32 29 20 52 65 61   }..  /* (2) Rea
7680: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
7690: 70 61 67 65 73 20 73 74 6f 72 65 64 20 69 6e 20  pages stored in 
76a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 2a 2f  the journal.  */
76b0: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
76c0: 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
76d0: 20 28 75 33 32 2a 29 26 6e 52 65 63 29 3b 0a 20   (u32*)&nRec);. 
76e0: 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
76f0: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 69  nd_playback;.  i
7700: 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66  f( nRec==0xfffff
7710: 66 66 66 20 7c 7c 20 75 73 65 4a 6f 75 72 6e 61  fff || useJourna
7720: 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 6e 52 65  lSize ){.    nRe
7730: 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e  c = (szJ - JOURN
7740: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
7750: 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ))/JOURNAL_PG_SZ
7760: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
7770: 20 2f 2a 20 28 33 29 20 52 65 61 64 20 74 68 65   /* (3) Read the
7780: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66   initial value f
7790: 6f 72 20 74 68 65 20 73 61 6e 69 74 79 20 63 68  or the sanity ch
77a0: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 72 63 20 3d  ecksum */.  rc =
77b0: 20 72 65 61 64 33 32 62 69 74 73 28 26 70 50 61   read32bits(&pPa
77c0: 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65  ger->jfd, &pPage
77d0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
77e0: 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
77f0: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 0a 20 20  nd_playback;..  
7800: 2f 2a 20 28 34 29 20 52 65 61 64 20 74 68 65 20  /* (4) Read the 
7810: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
7820: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7830: 66 69 6c 65 20 70 72 69 6f 72 20 74 6f 20 74 68  file prior to th
7840: 65 0a 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20  e.  ** start of 
7850: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
7860: 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  */.  rc = read32
7870: 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66  bits(&pPager->jf
7880: 64 2c 20 26 6d 78 50 67 29 3b 0a 20 20 69 66 28  d, &mxPg);.  if(
7890: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
78a0: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
78b0: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
78c0: 2f 2a 20 28 35 29 20 61 6e 64 20 28 36 29 3a 20  /* (5) and (6): 
78d0: 43 68 65 63 6b 20 69 66 20 61 20 6d 61 73 74 65  Check if a maste
78e0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
78f0: 73 20 73 70 65 63 69 66 69 65 64 2e 20 49 66 20  s specified. If 
7900: 6f 6e 65 20 69 73 0a 20 20 2a 2a 20 73 70 65 63  one is.  ** spec
7910: 69 66 69 65 64 2c 20 6f 6e 6c 79 20 70 72 6f 63  ified, only proc
7920: 65 65 64 20 77 69 74 68 20 74 68 65 20 70 6c 61  eed with the pla
7930: 79 62 61 63 6b 20 69 66 20 69 74 20 73 74 69 6c  yback if it stil
7940: 6c 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20 72  l exists. */.  r
7950: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 26  c = read32bits(&
7960: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6e 4d  pPager->jfd, &nM
7970: 61 73 74 65 72 29 3b 0a 20 20 69 66 28 20 72 63  aster);.  if( rc
7980: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79   ) goto end_play
7990: 62 61 63 6b 3b 0a 20 20 69 66 28 20 6e 4d 61 73  back;.  if( nMas
79a0: 74 65 72 3e 30 20 29 7b 0a 20 20 20 20 7a 4d 61  ter>0 ){.    zMa
79b0: 73 74 65 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c  ster = sqliteMal
79c0: 6c 6f 63 28 6e 4d 61 73 74 65 72 29 3b 0a 20 20  loc(nMaster);.  
79d0: 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 29    if( !zMaster )
79e0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
79f0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
7a00: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
7a10: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ck;.    }.    rc
7a20: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
7a30: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  (&pPager->jfd, z
7a40: 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29  Master, nMaster)
7a50: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
7a60: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73  LITE_OK || (zMas
7a70: 74 65 72 5b 30 5d 20 26 26 20 21 73 71 6c 69 74  ter[0] && !sqlit
7a80: 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a  e3OsFileExists(z
7a90: 4d 61 73 74 65 72 29 29 20 29 7b 0a 20 20 20 20  Master)) ){.    
7aa0: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
7ab0: 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ack;.    }.  }..
7ac0: 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68    /* Truncate th
7ad0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
7ae0: 62 61 63 6b 20 74 6f 20 69 74 27 73 20 6f 72 69  back to it's ori
7af0: 67 69 6e 61 6c 20 73 69 7a 65 20 2a 2f 0a 20 20  ginal size */.  
7b00: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
7b10: 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 7c 7c  origDbSize==0 ||
7b20: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
7b30: 69 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20 20 72  ize==mxPg );.  r
7b40: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
7b50: 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e 66  ncate(&pPager->f
7b60: 64 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  d, SQLITE_PAGE_S
7b70: 49 5a 45 2a 28 6f 66 66 5f 74 29 6d 78 50 67 29  IZE*(off_t)mxPg)
7b80: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
7b90: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
7ba0: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
7bb0: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62    }.  pPager->db
7bc0: 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 0a  Size = mxPg;.  .
7bd0: 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e    /* Copy origin
7be0: 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20  al pages out of 
7bf0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
7c00: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
7c10: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a  tabase file..  *
7c20: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  /.  for(i=0; i<n
7c30: 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  Rec; i++){.    r
7c40: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
7c50: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
7c60: 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  er, &pPager->jfd
7c70: 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 1);.    if( rc
7c80: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
7c90: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
7ca0: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
7cb0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
7cc0: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
7cd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7ce0: 20 7d 0a 0a 20 20 2f 2a 20 50 61 67 65 73 20 74   }..  /* Pages t
7cf0: 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 77 72  hat have been wr
7d00: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
7d10: 72 6e 61 6c 20 62 75 74 20 6e 65 76 65 72 20 73  rnal but never s
7d20: 79 6e 63 65 64 0a 20 20 2a 2a 20 77 68 65 72 65  ynced.  ** where
7d30: 20 6e 6f 74 20 72 65 73 74 6f 72 65 64 20 62 79   not restored by
7d40: 20 74 68 65 20 6c 6f 6f 70 20 61 62 6f 76 65 2e   the loop above.
7d50: 20 20 57 65 20 68 61 76 65 20 74 6f 20 72 65 73    We have to res
7d60: 74 6f 72 65 20 74 68 6f 73 65 0a 20 20 2a 2a 20  tore those.  ** 
7d70: 70 61 67 65 73 20 62 79 20 72 65 61 64 69 6e 67  pages by reading
7d80: 20 74 68 65 6d 20 62 61 63 6b 20 66 72 6f 6d 20   them back from 
7d90: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
7da0: 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  abase..  */.  if
7db0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7dc0: 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 6c  ){.    pager_rel
7dd0: 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65 72  oad_cache(pPager
7de0: 29 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 70 6c 61 79  );.  }..end_play
7df0: 62 61 63 6b 3a 0a 20 20 69 66 28 20 7a 4d 61 73  back:.  if( zMas
7e00: 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ter ){.    /* If
7e10: 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73   there was a mas
7e20: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ter journal and 
7e30: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
7e40: 6c 20 72 65 74 75 72 6e 20 74 72 75 65 2c 0a 20  l return true,. 
7e50: 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
7e60: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
7e70: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
7e80: 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 65 72 72   journal. If err
7e90: 6f 72 73 20 0a 20 20 20 20 2a 2a 20 6f 63 63 75  ors .    ** occu
7ea0: 72 20 64 75 72 69 6e 67 20 74 68 69 73 20 70 72  r during this pr
7eb0: 6f 63 65 73 73 2c 20 69 67 6e 6f 72 65 20 74 68  ocess, ignore th
7ec0: 65 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  em..    */.    i
7ed0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7ee0: 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
7ef0: 64 65 6c 6d 61 73 74 65 72 28 7a 4d 61 73 74 65  delmaster(zMaste
7f00: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
7f10: 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72  liteFree(zMaster
7f20: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
7f30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7f40: 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 57 65 20    /* FIX ME: We 
7f50: 73 68 6f 75 6c 64 6e 27 74 20 64 65 6c 65 74 65  shouldn't delete
7f60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20   the journal if 
7f70: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  an error occured
7f80: 20 64 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20 72   during.    ** r
7f90: 6f 6c 6c 62 61 63 6b 2e 20 49 74 20 6d 61 79 20  ollback. It may 
7fa0: 68 61 76 65 20 62 65 65 6e 20 61 20 74 72 61 6e  have been a tran
7fb0: 73 69 65 6e 74 20 65 72 72 6f 72 20 61 6e 64 20  sient error and 
7fc0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79  the rollback may
7fd0: 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 65 64 20  .    ** succeed 
7fe0: 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73 20  next time it is 
7ff0: 61 74 74 65 6d 70 74 65 64 2e 0a 20 20 20 20 2a  attempted..    *
8000: 2f 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 77 72  /.    pager_unwr
8010: 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
8020: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
8030: 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52  Mask |= PAGER_ER
8040: 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72  R_CORRUPT;.    r
8050: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
8060: 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  PT;.  }else{.   
8070: 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
8080: 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
8090: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
80a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  ;.}../*.** Playb
80b0: 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ack the statemen
80c0: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
80d0: 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72   This is similar
80e0: 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   to playing back
80f0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
8100: 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74   journal but wit
8110: 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61  h.** a few extra
8120: 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20   twists..**.**  
8130: 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65    (1)  The numbe
8140: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
8150: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
8160: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a  at the start of.
8170: 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 73  **         the s
8180: 74 61 74 65 6d 65 6e 74 20 69 73 20 73 74 6f 72  tatement is stor
8190: 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 73 74  ed in pPager->st
81a0: 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74  mtSize, not in t
81b0: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f  he.**         jo
81c0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c  urnal file itsel
81d0: 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  f..**.**    (2) 
81e0: 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20   In addition to 
81f0: 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65  playing back the
8200: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
8210: 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20  al, also.**     
8220: 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c      playback all
8230: 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 74 72   pages of the tr
8240: 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
8250: 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20  l beginning.**  
8260: 20 20 20 20 20 20 20 61 74 20 6f 66 66 73 65 74         at offset
8270: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
8280: 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
8290: 74 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61  t pager_stmt_pla
82a0: 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
82b0: 67 65 72 29 7b 0a 20 20 6f 66 66 5f 74 20 73 7a  ger){.  off_t sz
82c0: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
82d0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
82e0: 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  full journal */.
82f0: 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20    int nRec;     
8300: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8310: 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
8320: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
8330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8340: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
8350: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
8360: 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 64 61   Truncate the da
8370: 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f 20 69  tabase back to i
8380: 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
8390: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
83a0: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
83b0: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  &pPager->fd, SQL
83c0: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2a 28 6f  ITE_PAGE_SIZE*(o
83d0: 66 66 5f 74 29 70 50 61 67 65 72 2d 3e 73 74 6d  ff_t)pPager->stm
83e0: 74 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72  tSize);.  pPager
83f0: 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
8400: 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 0a 20 20  r->stmtSize;..  
8410: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
8420: 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
8430: 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  re in the statem
8440: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  ent journal..  *
8450: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
8460: 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26  er->stmtInUse &&
8470: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8480: 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65  Open );.  sqlite
8490: 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
84a0: 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52 65  >stfd, 0);.  nRe
84b0: 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  c = pPager->stmt
84c0: 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f  NRec;.  .  /* Co
84d0: 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  py original page
84e0: 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74 61  s out of the sta
84f0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61  tement journal a
8500: 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
8510: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
8520: 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  ile.  Note that 
8530: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
8540: 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65 63  urnal omits chec
8550: 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  ksums from.  ** 
8560: 65 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e 63  each record sinc
8570: 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20  e power-failure 
8580: 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20  recovery is not 
8590: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74 61  important to sta
85a0: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72  tement.  ** jour
85b0: 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  nals..  */.  for
85c0: 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b  (i=nRec-1; i>=0;
85d0: 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20   i--){.    rc = 
85e0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
85f0: 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
8600: 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30  &pPager->stfd, 0
8610: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
8620: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
8630: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
8640: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
8650: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
8660: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75  ;.  }..  /* Figu
8670: 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
8680: 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65  pages need to be
8690: 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66 20 74   copied out of t
86a0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  he transaction. 
86b0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a   ** journal..  *
86c0: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
86d0: 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
86e0: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d  jfd, pPager->stm
86f0: 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  tJSize);.  if( r
8700: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
8710: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d      goto end_stm
8720: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  t_playback;.  }.
8730: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
8740: 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72  FileSize(&pPager
8750: 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20  ->jfd, &szJ);.  
8760: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
8770: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
8780: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
8790: 0a 20 20 7d 0a 20 20 6e 52 65 63 20 3d 20 28 73  .  }.  nRec = (s
87a0: 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 73 74 6d  zJ - pPager->stm
87b0: 74 4a 53 69 7a 65 29 2f 4a 4f 55 52 4e 41 4c 5f  tJSize)/JOURNAL_
87c0: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  PG_SZ(pPager);. 
87d0: 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69   for(i=nRec-1; i
87e0: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72  >=0; i--){.    r
87f0: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
8800: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
8810: 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  er, &pPager->jfd
8820: 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 1);.    if( rc
8830: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
8840: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
8850: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
8860: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73        goto end_s
8870: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
8880: 20 20 7d 0a 20 20 7d 0a 20 20 0a 65 6e 64 5f 73    }.  }.  .end_s
8890: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  tmt_playback:.  
88a0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
88b0: 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
88c0: 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45  >errMask |= PAGE
88d0: 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20  R_ERR_CORRUPT;. 
88e0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
88f0: 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20 72 65  ORRUPT;.  }.  re
8900: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
8910: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78  * Change the max
8920: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69  imum number of i
8930: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74  n-memory pages t
8940: 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e  hat are allowed.
8950: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  .**.** The maxim
8960: 75 6d 20 6e 75 6d 62 65 72 20 69 73 20 74 68 65  um number is the
8970: 20 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20   absolute value 
8980: 6f 66 20 74 68 65 20 6d 78 50 61 67 65 20 70 61  of the mxPage pa
8990: 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 49 66 20 6d  rameter..** If m
89a0: 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76  xPage is negativ
89b0: 65 2c 20 74 68 65 20 6e 6f 53 79 6e 63 20 66 6c  e, the noSync fl
89c0: 61 67 20 69 73 20 61 6c 73 6f 20 73 65 74 2e 20  ag is also set. 
89d0: 20 6e 6f 53 79 6e 63 20 62 79 70 61 73 73 65 73   noSync bypasses
89e0: 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  .** calls to sql
89f0: 69 74 65 33 4f 73 53 79 6e 63 28 29 2e 20 20 54  ite3OsSync().  T
8a00: 68 65 20 70 61 67 65 72 20 72 75 6e 73 20 6d 75  he pager runs mu
8a10: 63 68 20 66 61 73 74 65 72 20 77 69 74 68 20 6e  ch faster with n
8a20: 6f 53 79 6e 63 20 6f 6e 2c 0a 2a 2a 20 62 75 74  oSync on,.** but
8a30: 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e   if the operatin
8a40: 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73  g system crashes
8a50: 20 6f 72 20 74 68 65 72 65 20 69 73 20 61 6e 20   or there is an 
8a60: 61 62 72 75 70 74 20 70 6f 77 65 72 20 0a 2a 2a  abrupt power .**
8a70: 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64 61   failure, the da
8a80: 74 61 62 61 73 65 20 66 69 6c 65 20 6d 69 67 68  tabase file migh
8a90: 74 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20  t be left in an 
8aa0: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64  inconsistent and
8ab0: 0a 2a 2a 20 75 6e 72 65 70 61 69 72 61 62 6c 65  .** unrepairable
8ac0: 20 73 74 61 74 65 2e 20 20 0a 2a 2f 0a 76 6f 69   state.  .*/.voi
8ad0: 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  d sqlite3pager_s
8ae0: 65 74 5f 63 61 63 68 65 73 69 7a 65 28 50 61 67  et_cachesize(Pag
8af0: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
8b00: 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d  mxPage){.  if( m
8b10: 78 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20  xPage>=0 ){.    
8b20: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
8b30: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
8b40: 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  e;.    if( pPage
8b50: 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67  r->noSync ) pPag
8b60: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
8b70: 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ; .  }else{.    
8b80: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
8b90: 20 31 3b 0a 20 20 20 20 6d 78 50 61 67 65 20 3d   1;.    mxPage =
8ba0: 20 2d 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20   -mxPage;.  }.  
8bb0: 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20 29 7b  if( mxPage>10 ){
8bc0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
8bd0: 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20  age = mxPage;.  
8be0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73  }.}../*.** Adjus
8bf0: 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73  t the robustness
8c00: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
8c10: 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74   to damage due t
8c20: 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20  o OS crashes.** 
8c30: 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  or power failure
8c40: 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68  s by changing th
8c50: 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63  e number of sync
8c60: 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e  s()s when writin
8c70: 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  g.** the rollbac
8c80: 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72  k journal.  Ther
8c90: 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65  e are three leve
8ca0: 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46  ls:.**.**    OFF
8cb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
8cc0: 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Sync() is never 
8cd0: 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73  called.  This is
8ce0: 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20   the default.** 
8cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
8d00: 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74   temporary and t
8d10: 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a  ransient files..
8d20: 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20  **.**    NORMAL 
8d30: 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
8d40: 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65  s synced once be
8d50: 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
8d60: 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
8d70: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
8d80: 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
8d90: 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72  ally adequate pr
8da0: 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a  otection, but.**
8db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74                it
8dc0: 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c   is theoreticall
8dd0: 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75  y possible, thou
8de0: 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79  gh very unlikely
8df0: 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
8e00: 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72    that an inoper
8e10: 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75  tune power failu
8e20: 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74  re could leave t
8e30: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  he journal.**   
8e40: 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20             in a 
8e50: 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c  state which woul
8e60: 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74  d cause damage t
8e70: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  o the database.*
8e80: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  *              w
8e90: 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64  hen it is rolled
8ea0: 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   back..**.**    
8eb0: 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f  FULL      The jo
8ec0: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
8ed0: 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69  twice before wri
8ee0: 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
8ef0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
8f00: 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20   database (with 
8f10: 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  some additional 
8f20: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68  information - th
8f30: 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20  e nRec field.** 
8f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
8f50: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
8f60: 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74  er - being writt
8f70: 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  en in between th
8f80: 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20  e two.**        
8f90: 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49        syncs).  I
8fa0: 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74  f we assume that
8fb0: 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20   writing a.**   
8fc0: 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c             singl
8fd0: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73  e disk sector is
8fe0: 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68   atomic, then th
8ff0: 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73  is mode provides
9000: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
9010: 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20   assurance that 
9020: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c  the journal will
9030: 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65   not be corrupte
9040: 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20  d to the.**     
9050: 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f           point o
9060: 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65  f causing damage
9070: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
9080: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
9090: 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20  ..**.** Numeric 
90a0: 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65  values associate
90b0: 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61  d with these sta
90c0: 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20  tes are OFF==1, 
90d0: 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64  NORMAL=2,.** and
90e0: 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 76 6f 69 64   FULL=3..*/.void
90f0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
9100: 74 5f 73 61 66 65 74 79 5f 6c 65 76 65 6c 28 50  t_safety_level(P
9110: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
9120: 74 20 6c 65 76 65 6c 29 7b 0a 20 20 70 50 61 67  t level){.  pPag
9130: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65  er->noSync =  le
9140: 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72  vel==1 || pPager
9150: 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
9160: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
9170: 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50   level==3 && !pP
9180: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
9190: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
91a0: 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e  Sync ) pPager->n
91b0: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 0a  eedSync = 0;.}..
91c0: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d  /*.** Open a tem
91d0: 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 57 72  porary file.  Wr
91e0: 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ite the name of 
91f0: 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 7a 4e  the file into zN
9200: 61 6d 65 0a 2a 2a 20 28 7a 4e 61 6d 65 20 6d 75  ame.** (zName mu
9210: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 53  st be at least S
9220: 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
9230: 49 5a 45 20 62 79 74 65 73 20 6c 6f 6e 67 2e 29  IZE bytes long.)
9240: 20 20 57 72 69 74 65 0a 2a 2a 20 74 68 65 20 66    Write.** the f
9250: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
9260: 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e  nto *fd.  Return
9270: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
9280: 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a  ccess or some.**
9290: 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
92a0: 65 20 69 66 20 77 65 20 66 61 69 6c 2e 0a 2a 2a  e if we fail..**
92b0: 0a 2a 2a 20 54 68 65 20 4f 53 20 77 69 6c 6c 20  .** The OS will 
92c0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
92d0: 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61  lete the tempora
92e0: 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20  ry file when it 
92f0: 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f  is.** closed..*/
9300: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
9310: 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d  te3pager_opentem
9320: 70 28 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 4f  p(char *zFile, O
9330: 73 46 69 6c 65 20 2a 66 64 29 7b 0a 20 20 69 6e  sFile *fd){.  in
9340: 74 20 63 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74  t cnt = 8;.  int
9350: 20 72 63 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 63   rc;.  do{.    c
9360: 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nt--;.    sqlite
9370: 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28  3OsTempFileName(
9380: 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d  zFile);.    rc =
9390: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78   sqlite3OsOpenEx
93a0: 63 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c 20 66  clusive(zFile, f
93b0: 64 2c 20 31 29 3b 0a 20 20 7d 77 68 69 6c 65 28  d, 1);.  }while(
93c0: 20 63 6e 74 3e 30 20 26 26 20 72 63 21 3d 53 51   cnt>0 && rc!=SQ
93d0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74  LITE_OK );.  ret
93e0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
93f0: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   Create a new pa
9400: 67 65 20 63 61 63 68 65 20 61 6e 64 20 70 75 74  ge cache and put
9410: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
9420: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 6e 20  e page cache in 
9430: 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65  *ppPager..** The
9440: 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
9450: 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73  ed need not exis
9460: 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73 20  t.  The file is 
9470: 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c  not locked until
9480: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 61  .** the first ca
9490: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67  ll to sqlite3pag
94a0: 65 72 5f 67 65 74 28 29 20 61 6e 64 20 69 73 20  er_get() and is 
94b0: 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75  only held open u
94c0: 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74  ntil the.** last
94d0: 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65   page is release
94e0: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 70  d using sqlite3p
94f0: 61 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2a  ager_unref()..**
9500: 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
9510: 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20   is NULL then a 
9520: 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74  randomly-named t
9530: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
9540: 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
9550: 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65  used as the file
9560: 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20   to be cached.  
9570: 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  The file will be
9580: 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f   deleted.** auto
9590: 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69  matically when i
95a0: 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  t is closed..*/.
95b0: 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
95c0: 5f 6f 70 65 6e 28 0a 20 20 50 61 67 65 72 20 2a  _open(.  Pager *
95d0: 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
95e0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
95f0: 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
9600: 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
9610: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
9620: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
9630: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
9640: 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
9650: 20 6d 78 50 61 67 65 2c 20 20 20 20 20 20 20 20   mxPage,        
9660: 20 20 20 20 20 20 2f 2a 20 4d 61 78 20 6e 75 6d        /* Max num
9670: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
9680: 20 63 61 63 68 65 20 70 61 67 65 73 20 2a 2f 0a   cache pages */.
9690: 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
96a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
96b0: 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64  tra bytes append
96c0: 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
96d0: 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
96e0: 20 75 73 65 4a 6f 75 72 6e 61 6c 2c 20 20 20 20   useJournal,    
96f0: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 74 6f        /* TRUE to
9700: 20 75 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   use a rollback 
9710: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
9720: 66 69 6c 65 20 2a 2f 0a 20 20 76 6f 69 64 20 20  file */.  void  
9730: 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 20 20 20  *pBusyHandler   
9740: 20 20 20 2f 2a 20 42 75 73 79 20 63 61 6c 6c 62     /* Busy callb
9750: 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65  ack */.){.  Page
9760: 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 63 68 61  r *pPager;.  cha
9770: 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  r *zFullPathname
9780: 3b 0a 20 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b  ;.  int nameLen;
9790: 0a 20 20 4f 73 46 69 6c 65 20 66 64 3b 0a 20 20  .  OsFile fd;.  
97a0: 69 6e 74 20 72 63 2c 20 69 3b 0a 20 20 69 6e 74  int rc, i;.  int
97b0: 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 6e 74   tempFile;.  int
97c0: 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e   memDb = 0;.  in
97d0: 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a  t readOnly = 0;.
97e0: 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c    char zTemp[SQL
97f0: 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a  ITE_TEMPNAME_SIZ
9800: 45 5d 3b 0a 0a 20 20 2a 70 70 50 61 67 65 72 20  E];..  *ppPager 
9810: 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  = 0;.  if( sqlit
9820: 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
9830: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
9840: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
9850: 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
9860: 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
9870: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63   ){.    if( strc
9880: 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d  mp(zFilename,":m
9890: 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20  emory:")==0 ){. 
98a0: 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a       memDb = 1;.
98b0: 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e        zFullPathn
98c0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ame = sqliteMall
98d0: 6f 63 28 34 29 3b 0a 20 20 20 20 20 20 69 66 28  oc(4);.      if(
98e0: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29   zFullPathname )
98f0: 20 73 74 72 63 70 79 28 7a 46 75 6c 6c 50 61 74   strcpy(zFullPat
9900: 68 6e 61 6d 65 2c 20 22 22 29 3b 0a 20 20 20 20  hname, "");.    
9910: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
9920: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9930: 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65     zFullPathname
9940: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
9950: 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Pathname(zFilena
9960: 6d 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  me);.      rc = 
9970: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
9980: 64 57 72 69 74 65 28 7a 46 75 6c 6c 50 61 74 68  dWrite(zFullPath
9990: 6e 61 6d 65 2c 20 26 66 64 2c 20 26 72 65 61 64  name, &fd, &read
99a0: 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 74 65 6d  Only);.      tem
99b0: 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 7d  pFile = 0;.    }
99c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
99d0: 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
99e0: 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20  opentemp(zTemp, 
99f0: 26 66 64 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e  &fd);.    zFilen
9a00: 61 6d 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20  ame = zTemp;.   
9a10: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d   zFullPathname =
9a20: 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
9a30: 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65  thname(zFilename
9a40: 29 3b 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20  );.    tempFile 
9a50: 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  = 1;.  }.  if( s
9a60: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
9a70: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
9a80: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
9a90: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
9aa0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9ab0: 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c  sqliteFree(zFull
9ac0: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72  Pathname);.    r
9ad0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
9ae0: 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 6e 61 6d  TOPEN;.  }.  nam
9af0: 65 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46  eLen = strlen(zF
9b00: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
9b10: 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 4d  pPager = sqliteM
9b20: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
9b30: 50 61 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65 6e  Pager) + nameLen
9b40: 2a 33 20 2b 20 33 30 20 29 3b 0a 20 20 69 66 28  *3 + 30 );.  if(
9b50: 20 70 50 61 67 65 72 3d 3d 30 20 29 7b 0a 20 20   pPager==0 ){.  
9b60: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
9b70: 28 26 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  (&fd);.    sqlit
9b80: 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  eFree(zFullPathn
9b90: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
9ba0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
9bb0: 20 7d 0a 20 20 53 45 54 5f 50 41 47 45 52 28 70   }.  SET_PAGER(p
9bc0: 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72  Pager);.  pPager
9bd0: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63  ->zFilename = (c
9be0: 68 61 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b  har*)&pPager[1];
9bf0: 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  .  pPager->zDire
9c00: 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65 72 2d  ctory = &pPager-
9c10: 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c  >zFilename[nameL
9c20: 65 6e 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d  en+1];.  pPager-
9c30: 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61  >zJournal = &pPa
9c40: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b  ger->zDirectory[
9c50: 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74  nameLen+1];.  st
9c60: 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69  rcpy(pPager->zFi
9c70: 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74  lename, zFullPat
9c80: 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79  hname);.  strcpy
9c90: 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  (pPager->zDirect
9ca0: 6f 72 79 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  ory, zFullPathna
9cb0: 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 61 6d  me);.  for(i=nam
9cc0: 65 4c 65 6e 3b 20 69 3e 30 20 26 26 20 70 50 61  eLen; i>0 && pPa
9cd0: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b  ger->zDirectory[
9ce0: 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b  i-1]!='/'; i--){
9cf0: 7d 0a 20 20 69 66 28 20 69 3e 30 20 29 20 70 50  }.  if( i>0 ) pP
9d00: 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
9d10: 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20 20 73 74 72  [i-1] = 0;.  str
9d20: 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  cpy(pPager->zJou
9d30: 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  rnal, zFullPathn
9d40: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ame);.  sqliteFr
9d50: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
9d60: 29 3b 0a 20 20 73 74 72 63 70 79 28 26 70 50 61  );.  strcpy(&pPa
9d70: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61  ger->zJournal[na
9d80: 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61  meLen], "-journa
9d90: 6c 22 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  l");.  pPager->f
9da0: 64 20 3d 20 66 64 3b 0a 20 20 70 50 61 67 65 72  d = fd;.  pPager
9db0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
9dc0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65  0;.  pPager->use
9dd0: 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75  Journal = useJou
9de0: 72 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a  rnal && !memDb;.
9df0: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70    pPager->stmtOp
9e00: 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  en = 0;.  pPager
9e10: 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
9e20: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  .  pPager->nRef 
9e30: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  = 0;.  pPager->d
9e40: 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b  bSize = memDb-1;
9e50: 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  .  pPager->pageS
9e60: 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 50 41 47  ize = SQLITE_PAG
9e70: 45 5f 53 49 5a 45 3b 0a 20 20 70 50 61 67 65 72  E_SIZE;.  pPager
9e80: 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 0a  ->stmtSize = 0;.
9e90: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53    pPager->stmtJS
9ea0: 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ize = 0;.  pPage
9eb0: 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  r->nPage = 0;.  
9ec0: 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d  pPager->mxPage =
9ed0: 20 6d 78 50 61 67 65 3e 35 20 3f 20 6d 78 50 61   mxPage>5 ? mxPa
9ee0: 67 65 20 3a 20 31 30 3b 0a 20 20 70 50 61 67 65  ge : 10;.  pPage
9ef0: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
9f00: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65  _UNLOCK;.  pPage
9f10: 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 0a  r->errMask = 0;.
9f20: 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
9f30: 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20  le = tempFile;. 
9f40: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d   pPager->memDb =
9f50: 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72   memDb;.  pPager
9f60: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61  ->readOnly = rea
9f70: 64 4f 6e 6c 79 3b 0a 20 20 70 50 61 67 65 72 2d  dOnly;.  pPager-
9f80: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
9f90: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
9fa0: 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
9fb0: 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61  le || !useJourna
9fc0: 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69  l;.  pPager->pFi
9fd0: 72 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  rst = 0;.  pPage
9fe0: 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
9ff0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
a000: 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  Last = 0;.  pPag
a010: 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 6e 45 78  er->nExtra = nEx
a020: 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  tra;.  pPager->p
a030: 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 28 42  BusyHandler = (B
a040: 75 73 79 48 61 6e 64 6c 65 72 20 2a 29 70 42 75  usyHandler *)pBu
a050: 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 6d 65 6d  syHandler;.  mem
a060: 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73  set(pPager->aHas
a070: 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61  h, 0, sizeof(pPa
a080: 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20  ger->aHash));.  
a090: 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  *ppPager = pPage
a0a0: 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  r;.  return SQLI
a0b0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
a0c0: 53 65 74 20 74 68 65 20 64 65 73 74 72 75 63 74  Set the destruct
a0d0: 6f 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  or for this page
a0e0: 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c  r.  If not NULL,
a0f0: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
a100: 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65  is called.** whe
a110: 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  n the reference 
a120: 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68 20 70 61  count on each pa
a130: 67 65 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e  ge reaches zero.
a140: 20 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72    The destructor
a150: 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20   can.** be used 
a160: 74 6f 20 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f  to clean up info
a170: 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 65  rmation in the e
a180: 78 74 72 61 20 73 65 67 6d 65 6e 74 20 61 70 70  xtra segment app
a190: 65 6e 64 65 64 20 74 6f 20 65 61 63 68 20 70 61  ended to each pa
a1a0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  ge..**.** The de
a1b0: 73 74 72 75 63 74 6f 72 20 69 73 20 6e 6f 74 20  structor is not 
a1c0: 63 61 6c 6c 65 64 20 61 73 20 61 20 72 65 73 75  called as a resu
a1d0: 6c 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  lt sqlite3pager_
a1e0: 63 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65  close().  .** De
a1f0: 73 74 72 75 63 74 6f 72 73 20 61 72 65 20 6f 6e  structors are on
a200: 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c  ly called by sql
a210: 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
a220: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
a230: 65 33 70 61 67 65 72 5f 73 65 74 5f 64 65 73 74  e3pager_set_dest
a240: 72 75 63 74 6f 72 28 50 61 67 65 72 20 2a 70 50  ructor(Pager *pP
a250: 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 44 65  ager, void (*xDe
a260: 73 63 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29 7b  sc)(void*,int)){
a270: 0a 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74  .  pPager->xDest
a280: 72 75 63 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a  ructor = xDesc;.
a290: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
a2a0: 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66   reinitializer f
a2b0: 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20  or this pager.  
a2c0: 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  If not NULL, the
a2d0: 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a   reinitializer.*
a2e0: 2a 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  * is called when
a2f0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
a300: 61 20 70 61 67 65 20 69 6e 20 63 61 63 68 65 20  a page in cache 
a310: 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  is restored to i
a320: 74 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76  ts original.** v
a330: 61 6c 75 65 20 61 73 20 61 20 72 65 73 75 6c 74  alue as a result
a340: 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20   of a rollback. 
a350: 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 67 69   The callback gi
a360: 76 65 73 20 68 69 67 68 65 72 2d 6c 65 76 65 6c  ves higher-level
a370: 20 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f   code.** an oppo
a380: 72 74 75 6e 69 74 79 20 74 6f 20 72 65 73 74 6f  rtunity to resto
a390: 72 65 20 74 68 65 20 45 58 54 52 41 20 73 65 63  re the EXTRA sec
a3a0: 74 69 6f 6e 20 74 6f 20 61 67 72 65 65 20 77 69  tion to agree wi
a3b0: 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 0a  th the restored.
a3c0: 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f  ** page data..*/
a3d0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
a3e0: 65 72 5f 73 65 74 5f 72 65 69 6e 69 74 65 72 28  er_set_reiniter(
a3f0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76  Pager *pPager, v
a400: 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 76  oid (*xReinit)(v
a410: 6f 69 64 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50  oid*,int)){.  pP
a420: 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
a430: 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a  = xReinit;.}../*
a440: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
a450: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
a460: 61 67 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b  ages in the disk
a470: 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64   file associated
a480: 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e   with.** pPager.
a490: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
a4a0: 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 50  ager_pagecount(P
a4b0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
a4c0: 20 6f 66 66 5f 74 20 6e 3b 0a 20 20 61 73 73 65   off_t n;.  asse
a4d0: 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
a4e0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
a4f0: 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20  bSize>=0 ){.    
a500: 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 64  return pPager->d
a510: 62 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28  bSize;.  }.  if(
a520: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
a530: 7a 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ze(&pPager->fd, 
a540: 26 6e 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  &n)!=SQLITE_OK )
a550: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
a560: 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
a570: 52 52 5f 44 49 53 4b 3b 0a 20 20 20 20 72 65 74  RR_DISK;.    ret
a580: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 20 2f  urn 0;.  }.  n /
a590: 3d 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  = SQLITE_PAGE_SI
a5a0: 5a 45 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  ZE;.  if( pPager
a5b0: 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
a5c0: 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 50 61  NLOCK ){.    pPa
a5d0: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b  ger->dbSize = n;
a5e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
a5f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72  .}../*.** Forwar
a600: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f  d declaration.*/
a610: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
a620: 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 2c 20  Journal(Pager*, 
a630: 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 0a 0a  const char*);...
a640: 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70  /*.** Unlink a p
a650: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65  age from the fre
a660: 65 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74  e list (the list
a670: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 77 68   of all pages wh
a680: 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20  ere nRef==0).** 
a690: 61 6e 64 20 66 72 6f 6d 20 69 74 73 20 68 61 73  and from its has
a6a0: 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69  h collision chai
a6b0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
a6c0: 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48  d unlinkPage(PgH
a6d0: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
a6e0: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
a6f0: 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b  >pPager;..  /* K
a700: 65 65 70 20 74 68 65 20 70 46 69 72 73 74 53 79  eep the pFirstSy
a710: 6e 63 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69  nced pointer poi
a720: 6e 74 69 6e 67 20 61 74 20 74 68 65 20 66 69 72  nting at the fir
a730: 73 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20  st synchronized 
a740: 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70 50  page */.  if( pP
a750: 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g==pPager->pFirs
a760: 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 50  tSynced ){.    P
a770: 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70  gHdr *p = pPg->p
a780: 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 77 68  NextFree;.    wh
a790: 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65  ile( p && p->nee
a7a0: 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e  dSync ){ p = p->
a7b0: 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20  pNextFree; }.   
a7c0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
a7d0: 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a  ynced = p;.  }..
a7e0: 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d    /* Unlink from
a7f0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
a800: 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65  .  if( pPg->pPre
a810: 76 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67  vFree ){.    pPg
a820: 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65  ->pPrevFree->pNe
a830: 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e  xtFree = pPg->pN
a840: 65 78 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65  extFree;.  }else
a850: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
a860: 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50  ager->pFirst==pP
a870: 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  g );.    pPager-
a880: 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70  >pFirst = pPg->p
a890: 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20 20  NextFree;.  }.  
a8a0: 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  if( pPg->pNextFr
a8b0: 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70  ee ){.    pPg->p
a8c0: 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46  NextFree->pPrevF
a8d0: 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ree = pPg->pPrev
a8e0: 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Free;.  }else{. 
a8f0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a900: 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b  r->pLast==pPg );
a910: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61  .    pPager->pLa
a920: 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  st = pPg->pPrevF
a930: 72 65 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  ree;.  }.  pPg->
a940: 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d  pNextFree = pPg-
a950: 3e 70 50 72 65 76 46 72 65 65 20 3d 20 30 3b 0a  >pPrevFree = 0;.
a960: 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f  .  /* Unlink fro
a970: 6d 20 74 68 65 20 70 67 6e 6f 20 68 61 73 68 20  m the pgno hash 
a980: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  table */.  if( p
a990: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b  Pg->pNextHash ){
a9a0: 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  .    pPg->pNextH
a9b0: 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  ash->pPrevHash =
a9c0: 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b   pPg->pPrevHash;
a9d0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e  .  }.  if( pPg->
a9e0: 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20  pPrevHash ){.   
a9f0: 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 2d   pPg->pPrevHash-
aa00: 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67  >pNextHash = pPg
aa10: 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d  ->pNextHash;.  }
aa20: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 68 20  else{.    int h 
aa30: 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70 50 67  = pager_hash(pPg
aa40: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73  ->pgno);.    ass
aa50: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61  ert( pPager->aHa
aa60: 73 68 5b 68 5d 3d 3d 70 50 67 20 29 3b 0a 20 20  sh[h]==pPg );.  
aa70: 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b    pPager->aHash[
aa80: 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48  h] = pPg->pNextH
aa90: 61 73 68 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  ash;.  }.  pPg->
aaa0: 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d  pNextHash = pPg-
aab0: 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a  >pPrevHash = 0;.
aac0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
aad0: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
aae0: 20 74 72 75 6e 63 61 74 65 20 61 6e 20 69 6e 2d   truncate an in-
aaf0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
ab00: 20 20 44 65 6c 65 74 65 0a 2a 2a 20 65 76 65 72    Delete.** ever
ab10: 79 20 70 61 67 65 73 20 77 68 6f 73 65 20 70 67  y pages whose pg
ab20: 6e 6f 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  no is larger tha
ab30: 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  n pPager->dbSize
ab40: 20 61 6e 64 20 69 73 20 75 6e 72 65 66 65 72 65   and is unrefere
ab50: 6e 63 65 64 2e 0a 2a 2a 20 52 65 66 65 72 65 6e  nced..** Referen
ab60: 63 65 64 20 70 61 67 65 73 20 6c 61 72 67 65 72  ced pages larger
ab70: 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62   than pPager->db
ab80: 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e  Size are zeroed.
ab90: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
aba0: 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 50  memoryTruncate(P
abb0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
abc0: 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 50   PgHdr *pPg;.  P
abd0: 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69  gHdr **ppPg;.  i
abe0: 6e 74 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67  nt dbSize = pPag
abf0: 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70  er->dbSize;..  p
ac00: 70 50 67 20 3d 20 26 70 50 61 67 65 72 2d 3e 70  pPg = &pPager->p
ac10: 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 70  All;.  while( (p
ac20: 50 67 20 3d 20 2a 70 70 50 67 29 21 3d 30 20 29  Pg = *ppPg)!=0 )
ac30: 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  {.    if( pPg->p
ac40: 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20  gno<=dbSize ){. 
ac50: 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67       ppPg = &pPg
ac60: 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
ac70: 7d 65 6c 73 65 20 69 66 28 20 70 50 67 2d 3e 6e  }else if( pPg->n
ac80: 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d  Ref>0 ){.      m
ac90: 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44  emset(PGHDR_TO_D
aca0: 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61  ATA(pPg), 0, pPa
acb0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
acc0: 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50        ppPg = &pP
acd0: 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
ace0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70   }else{.      *p
acf0: 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  pPg = pPg->pNext
ad00: 41 6c 6c 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e  All;.      unlin
ad10: 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  kPage(pPg);.    
ad20: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67    sqliteFree(pPg
ad30: 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
ad40: 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a  >nPage--;.    }.
ad50: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75    }.}../*.** Tru
ad60: 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74  ncate the file t
ad70: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
ad80: 70 61 67 65 73 20 73 70 65 63 69 66 69 65 64 2e  pages specified.
ad90: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
ada0: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
adb0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
adc0: 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  o nPage){.  int 
add0: 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  rc;.  if( pPager
ade0: 2d 3e 64 62 53 69 7a 65 3c 30 20 29 7b 0a 20 20  ->dbSize<0 ){.  
adf0: 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70    sqlite3pager_p
ae00: 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
ae10: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
ae20: 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29  er->errMask!=0 )
ae30: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
ae40: 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29  _errcode(pPager)
ae50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
ae60: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65  .  }.  if( nPage
ae70: 3e 3d 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67  >=(unsigned)pPag
ae80: 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
ae90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
aea0: 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  OK;.  }.  if( pP
aeb0: 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
aec0: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
aed0: 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 6d  e = nPage;.    m
aee0: 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50  emoryTruncate(pP
aef0: 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
af00: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
af10: 0a 20 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70  .  syncJournal(p
af20: 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 72 63 20  Pager, 0);.  rc 
af30: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
af40: 61 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ate(&pPager->fd,
af50: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
af60: 45 2a 28 6f 66 66 5f 74 29 6e 50 61 67 65 29 3b  E*(off_t)nPage);
af70: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
af80: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
af90: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61  er->dbSize = nPa
afa0: 67 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ge;.  }.  return
afb0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68   rc;.}../*.** Sh
afc0: 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20  utdown the page 
afd0: 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c  cache.  Free all
afe0: 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73   memory and clos
aff0: 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  e all files..**.
b000: 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
b010: 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72  ion was in progr
b020: 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ess when this ro
b030: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
b040: 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63   that.** transac
b050: 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
b060: 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61  ack.  All outsta
b070: 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
b080: 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61  invalidated.** a
b090: 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  nd their memory 
b0a0: 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61  is freed.  Any a
b0b0: 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
b0c0: 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a  page associated.
b0d0: 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ** with this pag
b0e0: 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  e cache after th
b0f0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
b100: 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  rns will likely.
b110: 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ** result in a c
b120: 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 69 6e 74 20  oredump..*/.int 
b130: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f  sqlite3pager_clo
b140: 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  se(Pager *pPager
b150: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c  ){.  PgHdr *pPg,
b160: 20 2a 70 4e 65 78 74 3b 0a 20 20 73 77 69 74 63   *pNext;.  switc
b170: 68 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  h( pPager->state
b180: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47   ){.    case PAG
b190: 45 52 5f 52 45 53 45 52 56 45 44 3a 0a 20 20 20  ER_RESERVED:.   
b1a0: 20 63 61 73 65 20 50 41 47 45 52 5f 45 58 43 4c   case PAGER_EXCL
b1b0: 55 53 49 56 45 3a 20 7b 0a 20 20 20 20 20 20 73  USIVE: {.      s
b1c0: 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
b1d0: 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
b1e0: 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
b1f0: 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20  >memDb ){.      
b200: 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63    sqlite3OsUnloc
b210: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  k(&pPager->fd, N
b220: 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  O_LOCK);.      }
b230: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
b240: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
b250: 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  en==0 );.      b
b260: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
b270: 63 61 73 65 20 50 41 47 45 52 5f 53 48 41 52 45  case PAGER_SHARE
b280: 44 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 21  D: {.      if( !
b290: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
b2a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b2b0: 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72  OsUnlock(&pPager
b2c0: 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  ->fd, NO_LOCK);.
b2d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
b2e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
b2f0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
b300: 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
b310: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b320: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 50    }.  }.  for(pP
b330: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
b340: 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b  pPg; pPg=pNext){
b350: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67  .    pNext = pPg
b360: 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
b370: 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b  sqliteFree(pPg);
b380: 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
b390: 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
b3a0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
b3b0: 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  &pPager->fd);.  
b3c0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
b3d0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
b3e0: 3d 30 20 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20  =0 );.  /* Temp 
b3f0: 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f 6d 61  files are automa
b400: 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
b410: 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69  by the OS.  ** i
b420: 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
b430: 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71  ile ){.  **   sq
b440: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
b450: 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
b460: 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 20 20  ;.  ** }.  */.  
b470: 43 4c 52 5f 50 41 47 45 52 28 70 50 61 67 65 72  CLR_PAGER(pPager
b480: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
b490: 3e 7a 46 69 6c 65 6e 61 6d 65 21 3d 28 63 68 61  >zFilename!=(cha
b4a0: 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 20 29 7b  r*)&pPager[1] ){
b4b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29  .    assert( 0 )
b4c0: 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 70  ;  /* Cannot hap
b4d0: 70 65 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  pen */.    sqlit
b4e0: 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 7a 46  eFree(pPager->zF
b4f0: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ilename);.    sq
b500: 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
b510: 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  >zJournal);.    
b520: 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
b530: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b 0a  r->zDirectory);.
b540: 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
b550: 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
b560: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
b570: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
b580: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
b590: 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  r the given page
b5a0: 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73   data..*/.Pgno s
b5b0: 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65  qlite3pager_page
b5c0: 6e 75 6d 62 65 72 28 76 6f 69 64 20 2a 70 44 61  number(void *pDa
b5d0: 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20  ta){.  PgHdr *p 
b5e0: 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
b5f0: 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e  pData);.  return
b600: 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a   p->pgno;.}../*.
b610: 2a 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66 28  ** The page_ref(
b620: 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65  ) function incre
b630: 6d 65 6e 74 73 20 74 68 65 20 72 65 66 65 72 65  ments the refere
b640: 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  nce count for a 
b650: 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20  page..** If the 
b660: 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c  page is currentl
b670: 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  y on the freelis
b680: 74 20 28 74 68 65 20 72 65 66 65 72 65 6e 63 65  t (the reference
b690: 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20   count is zero) 
b6a0: 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69  then.** remove i
b6b0: 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  t from the freel
b6c0: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e  ist..**.** For n
b6d0: 6f 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73 2c  on-test systems,
b6e0: 20 70 61 67 65 5f 72 65 66 28 29 20 69 73 20 61   page_ref() is a
b6f0: 20 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c 6c   macro that call
b700: 73 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a  s _page_ref().**
b710: 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20 72   online of the r
b720: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69  eference count i
b730: 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65 73  s zero.  For tes
b740: 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f  t systems, page_
b750: 72 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72 65  ref().** is a re
b760: 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74  al function so t
b770: 68 61 74 20 77 65 20 63 61 6e 20 73 65 74 20 62  hat we can set b
b780: 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74  reakpoints and t
b790: 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74  race it..*/.stat
b7a0: 69 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65  ic void _page_re
b7b0: 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  f(PgHdr *pPg){. 
b7c0: 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
b7d0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
b7e0: 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c  page is currentl
b7f0: 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  y on the freelis
b800: 74 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a  t.  Remove it. *
b810: 2f 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70  /.    if( pPg==p
b820: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72  Pg->pPager->pFir
b830: 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20  stSynced ){.    
b840: 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67    PgHdr *p = pPg
b850: 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
b860: 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70     while( p && p
b870: 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20  ->needSync ){ p 
b880: 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20  = p->pNextFree; 
b890: 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  }.      pPg->pPa
b8a0: 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
b8b0: 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20  d = p;.    }.   
b8c0: 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46   if( pPg->pPrevF
b8d0: 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67  ree ){.      pPg
b8e0: 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65  ->pPrevFree->pNe
b8f0: 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e  xtFree = pPg->pN
b900: 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c  extFree;.    }el
b910: 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  se{.      pPg->p
b920: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
b930: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
b940: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
b950: 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a  g->pNextFree ){.
b960: 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
b970: 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20  Free->pPrevFree 
b980: 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
b990: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
b9a0: 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
b9b0: 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72  pLast = pPg->pPr
b9c0: 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20  evFree;.    }.  
b9d0: 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e    pPg->pPager->n
b9e0: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67  Ref++;.  }.  pPg
b9f0: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49  ->nRef++;.  REFI
ba00: 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64  NFO(pPg);.}.#ifd
ba10: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
ba20: 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67   static void pag
ba30: 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67  e_ref(PgHdr *pPg
ba40: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  ){.    if( pPg->
ba50: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
ba60: 20 5f 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b   _page_ref(pPg);
ba70: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ba80: 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pPg->nRef++;. 
ba90: 20 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67       REFINFO(pPg
baa0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  );.    }.  }.#el
bab0: 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  se.# define page
bac0: 5f 72 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e  _ref(P)   ((P)->
bad0: 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65  nRef==0?_page_re
bae0: 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e  f(P):(void)(P)->
baf0: 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a  nRef++).#endif..
bb00: 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20  /*.** Increment 
bb10: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
bb20: 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20  unt for a page. 
bb30: 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74   The input point
bb40: 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72  er is.** a refer
bb50: 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
bb60: 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71   data..*/.int sq
bb70: 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66 28 76  lite3pager_ref(v
bb80: 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
bb90: 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41  gHdr *pPg = DATA
bba0: 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
bbb0: 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67  ;.  page_ref(pPg
bbc0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
bbd0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
bbe0: 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
bbf0: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
bc00: 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  s, make sure all
bc10: 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20   the pages that 
bc20: 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69  have.** been wri
bc30: 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
bc40: 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c  nal have actuall
bc50: 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75  y reached the su
bc60: 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20  rface of the.** 
bc70: 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74  disk.  It is not
bc80: 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20   safe to modify 
bc90: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
bca0: 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c  abase file until
bcb0: 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f   after.** the jo
bcc0: 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73  urnal has been s
bcd0: 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f  ynced.  If the o
bce0: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
bcf0: 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66   is modified bef
bd00: 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ore.** the journ
bd10: 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64  al is synced and
bd20: 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
bd30: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73   occurs, the uns
bd40: 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ynced journal.**
bd50: 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c   data would be l
bd60: 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64  ost and we would
bd70: 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f   be unable to co
bd80: 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63  mpletely rollbac
bd90: 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  k the.** databas
bda0: 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61  e changes.  Data
bdb0: 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
bdc0: 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20  would occur..** 
bdd0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
bde0: 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68   also updates th
bdf0: 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20  e nRec field in 
be00: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 74 68  the header of th
be10: 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53  e journal..** (S
be20: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74  ee comments on t
be30: 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
be40: 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  k() routine for 
be50: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
be60: 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74  mation.).** If t
be70: 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20  he sync mode is 
be80: 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20  FULL, two syncs 
be90: 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72  will occur.  Fir
bea0: 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75  st the whole jou
beb0: 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65  rnal.** is synce
bec0: 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63  d, then the nRec
bed0: 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
bee0: 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64  d, then a second
bef0: 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a   sync occurs..**
bf00: 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  .** For temporar
bf10: 79 20 64 61 74 61 62 61 73 65 73 2c 20 77 65 20  y databases, we 
bf20: 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77  do not care if w
bf30: 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f  e are able to ro
bf40: 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20  llback.** after 
bf50: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
bf60: 20 73 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e   so sync occurs.
bf70: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
bf80: 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e  ine clears the n
bf90: 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66  eedSync field of
bfa0: 20 65 76 65 72 79 20 70 61 67 65 20 63 75 72 72   every page curr
bfb0: 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d  ent held in.** m
bfc0: 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
bfd0: 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
bfe0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
bff0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
c000: 74 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ter){.  PgHdr *p
c010: 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Pg;.  int rc = S
c020: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
c030: 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
c040: 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e   before modifyin
c050: 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  g the main datab
c060: 61 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69  ase.  ** (assumi
c070: 6e 67 20 74 68 65 72 65 20 69 73 20 61 20 6a 6f  ng there is a jo
c080: 75 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65 65  urnal and it nee
c090: 64 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64 2e  ds to be synced.
c0a0: 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ).  */.  if( pPa
c0b0: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 7c 7c  ger->needSync ||
c0c0: 20 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20   zMaster ){.    
c0d0: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
c0e0: 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 61  pFile ){.      a
c0f0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
c100: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
c110: 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21      /* assert( !
c120: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
c130: 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68  ; // noSync migh
c140: 74 20 62 65 20 73 65 74 20 69 66 20 73 79 6e 63  t be set if sync
c150: 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a  hronous.      **
c160: 20 77 61 73 20 74 75 72 6e 65 64 20 6f 66 66 20   was turned off 
c170: 61 66 74 65 72 20 74 68 65 20 74 72 61 6e 73 61  after the transa
c180: 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65  ction was starte
c190: 64 2e 20 20 54 69 63 6b 65 74 20 23 36 31 35 20  d.  Ticket #615 
c1a0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
c1b0: 47 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  G.      {.      
c1c0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
c1d0: 68 65 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20  he pPager->nRec 
c1e0: 63 6f 75 6e 74 65 72 20 77 65 20 61 72 65 20 6b  counter we are k
c1f0: 65 65 70 69 6e 67 20 61 67 72 65 65 73 0a 20 20  eeping agrees.  
c200: 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68        ** with th
c210: 65 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  e nRec computed 
c220: 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66  from the size of
c230: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
c240: 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
c250: 20 20 20 20 20 20 6f 66 66 5f 74 20 68 64 72 53        off_t hdrS
c260: 7a 2c 20 70 67 53 7a 2c 20 6a 53 7a 3b 0a 20 20  z, pgSz, jSz;.  
c270: 20 20 20 20 20 20 68 64 72 53 7a 20 3d 20 4a 4f        hdrSz = JO
c280: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
c290: 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 67  ger);.        pg
c2a0: 53 7a 20 3d 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  Sz = JOURNAL_PG_
c2b0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  SZ(pPager);.    
c2c0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
c2d0: 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67  OsFileSize(&pPag
c2e0: 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a  er->jfd, &jSz);.
c2f0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
c300: 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
c310: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
c320: 50 61 67 65 72 2d 3e 6e 52 65 63 2a 70 67 53 7a  Pager->nRec*pgSz
c330: 2b 68 64 72 53 7a 3d 3d 6a 53 7a 20 29 3b 0a 20  +hdrSz==jSz );. 
c340: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
c350: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a      {.        /*
c360: 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20   Write the nRec 
c370: 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a  value into the j
c380: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64  ournal file head
c390: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66  er */.        of
c3a0: 66 5f 74 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20  f_t szJ;.       
c3b0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
c3c0: 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  lSync ){.       
c3d0: 20 20 20 54 52 41 43 45 32 28 22 53 59 4e 43 20     TRACE2("SYNC 
c3e0: 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
c3f0: 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b  , pPager->fd.h);
c400: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
c410: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 26 70  sqlite3OsSync(&p
c420: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
c430: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
c440: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
c450: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c460: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
c470: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 73 69 7a 65  Pager->jfd, size
c480: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
c490: 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
c4a0: 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50   write32bits(&pP
c4b0: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
c4c0: 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20  r->nRec);.      
c4d0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
c4e0: 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 20 2f  n rc;..        /
c4f0: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65  * Write the name
c500: 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
c510: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 6f  ournal file if o
c520: 6e 65 20 69 73 20 73 70 65 63 69 66 69 65 64 20  ne is specified 
c530: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  */.        if( z
c540: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Master ){.      
c550: 20 20 20 20 61 73 73 65 72 74 28 20 73 74 72 6c      assert( strl
c560: 65 6e 28 7a 4d 61 73 74 65 72 29 3c 70 50 61 67  en(zMaster)<pPag
c570: 65 72 2d 3e 6e 4d 61 73 74 65 72 20 29 3b 0a 20  er->nMaster );. 
c580: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
c590: 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
c5a0: 67 65 72 2d 3e 6a 66 64 2c 20 32 30 29 3b 0a 20  ger->jfd, 20);. 
c5b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
c5c0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
c5d0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
c5e0: 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67  te3OsWrite(&pPag
c5f0: 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
c600: 2c 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72  , strlen(zMaster
c610: 29 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )+1);.          
c620: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
c630: 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  rc;.        }.. 
c640: 20 20 20 20 20 20 20 73 7a 4a 20 3d 20 4a 4f 55         szJ = JOU
c650: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
c660: 65 72 29 20 2b 20 20 70 50 61 67 65 72 2d 3e 6e  er) +  pPager->n
c670: 52 65 63 2a 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  Rec*JOURNAL_PG_S
c680: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  Z(pPager);.     
c690: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b     sqlite3OsSeek
c6a0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 73  (&pPager->jfd, s
c6b0: 7a 4a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  zJ);.      }.   
c6c0: 20 20 20 54 52 41 43 45 32 28 22 53 59 4e 43 20     TRACE2("SYNC 
c6d0: 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
c6e0: 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b  , pPager->fd.h);
c6f0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
c700: 74 65 33 4f 73 53 79 6e 63 28 26 70 50 61 67 65  te3OsSync(&pPage
c710: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69  r->jfd);.      i
c720: 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72  f( rc!=0 ) retur
c730: 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61 67  n rc;.      pPag
c740: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
c750: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
c760: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
c770: 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  nc = 0;..    /* 
c780: 45 72 61 73 65 20 74 68 65 20 6e 65 65 64 53 79  Erase the needSy
c790: 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65  nc flag from eve
c7a0: 72 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  ry page..    */.
c7b0: 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
c7c0: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
c7d0: 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
c7e0: 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  ){.      pPg->ne
c7f0: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
c800: 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46  }.    pPager->pF
c810: 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61  irstSynced = pPa
c820: 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d  ger->pFirst;.  }
c830: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
c840: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 50 61 67  .  /* If the Pag
c850: 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
c860: 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 74   is clear then t
c870: 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
c880: 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74  c.  ** flag must
c890: 20 61 6c 73 6f 20 62 65 20 63 6c 65 61 72 20 66   also be clear f
c8a0: 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e 20 20 56  or all pages.  V
c8b0: 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 0a  erify that this.
c8c0: 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20 69    ** invariant i
c8d0: 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65  s true..  */.  e
c8e0: 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 50 67  lse{.    for(pPg
c8f0: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
c900: 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
c910: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73  xtAll){.      as
c920: 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53  sert( pPg->needS
c930: 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  ync==0 );.    }.
c940: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
c950: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
c960: 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ==pPager->pFirst
c970: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
c980: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
c990: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69  /*.** Given a li
c9a0: 73 74 20 6f 66 20 70 61 67 65 73 20 28 63 6f 6e  st of pages (con
c9b0: 6e 65 63 74 65 64 20 62 79 20 74 68 65 20 50 67  nected by the Pg
c9c0: 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74  Hdr.pDirty point
c9d0: 65 72 29 20 77 72 69 74 65 0a 2a 2a 20 65 76 65  er) write.** eve
c9e0: 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  ry one of those 
c9f0: 70 61 67 65 73 20 6f 75 74 20 74 6f 20 74 68 65  pages out to the
ca00: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
ca10: 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c  nd mark them all
ca20: 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f  .** as clean..*/
ca30: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
ca40: 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
ca50: 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a  (PgHdr *pList){.
ca60: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
ca70: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
ca80: 20 62 75 73 79 20 3d 20 31 3b 0a 0a 20 20 69 66   busy = 1;..  if
ca90: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
caa0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
cab0: 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d   pPager = pList-
cac0: 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41  >pPager;..  /* A
cad0: 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
cae0: 72 65 20 6d 61 79 20 62 65 20 65 69 74 68 65 72  re may be either
caf0: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
cb00: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
cb10: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
cb20: 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  se file. If ther
cb30: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20  e is already an 
cb40: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20  EXCLUSIVE lock, 
cb50: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
cb60: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
cb70: 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20  te3OsLock() are 
cb80: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a  no-ops..  **.  *
cb90: 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63  * Moving the loc
cba0: 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20  k from RESERVED 
cbb0: 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63 74  to EXCLUSIVE act
cbc0: 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67  ually involves g
cbd0: 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67  oing.  ** throug
cbe0: 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74  h an intermediat
cbf0: 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e  e state PENDING.
cc00: 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63     A PENDING loc
cc10: 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20  k prevents new. 
cc20: 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d   ** readers from
cc30: 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68   attaching to th
cc40: 65 20 64 61 74 61 62 61 73 65 20 62 75 74 20 69  e database but i
cc50: 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66  s unsufficient f
cc60: 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72  or us to.  ** wr
cc70: 69 74 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f  ite.  The idea o
cc80: 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  f a PENDING lock
cc90: 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e   is to prevent n
cca0: 65 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a  ew readers from.
ccb0: 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77    ** coming in w
ccc0: 68 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72  hile we wait for
ccd0: 20 65 78 69 73 74 69 6e 67 20 72 65 61 64 65 72   existing reader
cce0: 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a  s to clear..  **
ccf0: 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20  .  ** While the 
cd00: 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
cd10: 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
cd20: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
cd30: 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20  abase file.  ** 
cd40: 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  is unchanged and
cd50: 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b   we can rollback
cd60: 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
cd70: 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a  to playback the.
cd80: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74    ** journal int
cd90: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  o the original d
cda0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f  atabase file.  O
cdb0: 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f  nce we transitio
cdc0: 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53  n to.  ** EXCLUS
cdd0: 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  IVE, it means th
cde0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
cdf0: 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64  has been changed
ce00: 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63   and any rollbac
ce10: 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75  k.  ** will requ
ce20: 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c  ire a journal pl
ce30: 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 64  ayback..  */.  d
ce40: 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  o {.    rc = sql
ce50: 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67  ite3OsLock(&pPag
ce60: 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56  er->fd, EXCLUSIV
ce70: 45 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 77 68 69 6c  E_LOCK);.  }whil
ce80: 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
ce90: 53 59 20 26 26 20 0a 20 20 20 20 20 20 70 50 61  SY && .      pPa
cea0: 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
ceb0: 72 20 26 26 20 0a 20 20 20 20 20 20 70 50 61 67  r && .      pPag
cec0: 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
ced0: 2d 3e 78 46 75 6e 63 20 26 26 20 0a 20 20 20 20  ->xFunc && .    
cee0: 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48    pPager->pBusyH
cef0: 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 28 70 50  andler->xFunc(pP
cf00: 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
cf10: 65 72 2d 3e 70 41 72 67 2c 20 22 22 2c 20 62 75  er->pArg, "", bu
cf20: 73 79 2b 2b 29 0a 20 20 29 3b 0a 20 20 69 66 28  sy++).  );.  if(
cf30: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
cf40: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
cf50: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
cf60: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
cf70: 4c 55 53 49 56 45 3b 0a 0a 20 20 77 68 69 6c 65  LUSIVE;..  while
cf80: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 61  ( pList ){.    a
cf90: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 64 69  ssert( pList->di
cfa0: 72 74 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  rty );.    sqlit
cfb0: 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
cfc0: 2d 3e 66 64 2c 20 28 70 4c 69 73 74 2d 3e 70 67  ->fd, (pList->pg
cfd0: 6e 6f 2d 31 29 2a 28 6f 66 66 5f 74 29 53 51 4c  no-1)*(off_t)SQL
cfe0: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
cff0: 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72      CODEC(pPager
d000: 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
d010: 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70  pList), pList->p
d020: 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 54 52 41  gno, 6);.    TRA
d030: 43 45 32 28 22 53 54 4f 52 45 20 70 61 67 65 20  CE2("STORE page 
d040: 25 64 5c 6e 22 2c 20 70 4c 69 73 74 2d 3e 70 67  %d\n", pList->pg
d050: 6e 6f 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  no);.    rc = sq
d060: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50  lite3OsWrite(&pP
d070: 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f  ager->fd, PGHDR_
d080: 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20  TO_DATA(pList), 
d090: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
d0a0: 29 3b 0a 20 20 20 20 43 4f 44 45 43 28 70 50 61  );.    CODEC(pPa
d0b0: 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  ger, PGHDR_TO_DA
d0c0: 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69 73 74  TA(pList), pList
d0d0: 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20  ->pgno, 0);.    
d0e0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
d0f0: 72 63 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 64  rc;.    pList->d
d100: 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 4c  irty = 0;.    pL
d110: 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ist = pList->pDi
d120: 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rty;.  }.  retur
d130: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d140: 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76  /*.** Collect ev
d150: 65 72 79 20 64 69 72 74 79 20 70 61 67 65 20 69  ery dirty page i
d160: 6e 74 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74  nto a dirty list
d170: 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61   and.** return a
d180: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
d190: 68 65 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73  head of that lis
d1a0: 74 2e 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72  t.  All pages ar
d1b0: 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65  e.** collected e
d1c0: 76 65 6e 20 69 66 20 74 68 65 79 20 61 72 65 20  ven if they are 
d1d0: 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f  still in use..*/
d1e0: 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70  .static PgHdr *p
d1f0: 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
d200: 74 79 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a  ty_pages(Pager *
d210: 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
d220: 20 2a 70 2c 20 2a 70 4c 69 73 74 3b 0a 20 20 70   *p, *pList;.  p
d230: 4c 69 73 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28  List = 0;.  for(
d240: 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  p=pPager->pAll; 
d250: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c  p; p=p->pNextAll
d260: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 69  ){.    if( p->di
d270: 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  rty ){.      p->
d280: 70 44 69 72 74 79 20 3d 20 70 4c 69 73 74 3b 0a  pDirty = pList;.
d290: 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 3b        pList = p;
d2a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
d2b0: 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
d2c0: 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
d2d0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64  ge..**.** A read
d2e0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73   lock on the dis
d2f0: 6b 20 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e  k file is obtain
d300: 65 64 20 77 68 65 6e 20 74 68 65 20 66 69 72 73  ed when the firs
d310: 74 20 70 61 67 65 20 69 73 20 61 63 71 75 69 72  t page is acquir
d320: 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61  ed. .** This rea
d330: 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65  d lock is droppe
d340: 64 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  d when the last 
d350: 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64  page is released
d360: 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f 67 65 74 20 77  ..**.** A _get w
d370: 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70 61 67  orks for any pag
d380: 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  e number greater
d390: 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74 68 65   than 0.  If the
d3a0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
d3b0: 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  e is smaller tha
d3c0: 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
d3d0: 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63  page, then no ac
d3e0: 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61  tual disk.** rea
d3f0: 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  d occurs and the
d400: 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66   memory image of
d410: 20 74 68 65 20 70 61 67 65 20 69 73 20 69 6e 69   the page is ini
d420: 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61  tialized to.** a
d430: 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65 20 65  ll zeros.  The e
d440: 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64  xtra data append
d450: 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20  ed to a page is 
d460: 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
d470: 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74  ed.** to zeros t
d480: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 20  he first time a 
d490: 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69  page is loaded i
d4a0: 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a  nto memory..**.*
d4b0: 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f  * The acquisitio
d4c0: 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72  n might fail for
d4d0: 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73   several reasons
d4e0: 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c  .  In all cases,
d4f0: 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61  .** an appropria
d500: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
d510: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
d520: 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
d530: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  NULL..**.** See 
d540: 61 6c 73 6f 20 73 71 6c 69 74 65 33 70 61 67 65  also sqlite3page
d550: 72 5f 6c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74  r_lookup().  Bot
d560: 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  h this routine a
d570: 6e 64 20 5f 6c 6f 6f 6b 75 70 28 29 20 61 74 74  nd _lookup() att
d580: 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20  empt.** to find 
d590: 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e  a page in the in
d5a0: 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69  -memory cache fi
d5b0: 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67  rst.  If the pag
d5c0: 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
d5d0: 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74  .** in memory, t
d5e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  his routine goes
d5f0: 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64   to disk to read
d600: 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 5f   it in whereas _
d610: 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74  lookup().** just
d620: 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69   returns 0.  Thi
d630: 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72  s routine acquir
d640: 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74  es a read-lock t
d650: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74  he first time it
d660: 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f  .** has to go to
d670: 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64   disk, and could
d680: 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61   also playback a
d690: 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66  n old journal if
d6a0: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53   necessary..** S
d6b0: 69 6e 63 65 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e  ince _lookup() n
d6c0: 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73  ever goes to dis
d6d0: 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20  k, it never has 
d6e0: 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63  to deal with loc
d6f0: 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c  ks.** or journal
d700: 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
d710: 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
d720: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
d730: 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a  gno pgno, void *
d740: 2a 70 70 50 61 67 65 29 7b 0a 20 20 50 67 48 64  *ppPage){.  PgHd
d750: 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
d760: 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
d770: 65 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69  e we have not hi
d780: 74 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65  t any critical e
d790: 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61  rrors..  */ .  a
d7a0: 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
d7b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
d7c0: 6e 6f 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61  no!=0 );.  *ppPa
d7d0: 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  ge = 0;.  if( pP
d7e0: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
d7f0: 7e 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  ~(PAGER_ERR_FULL
d800: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
d810: 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
d820: 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
d830: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
d840: 66 69 72 73 74 20 70 61 67 65 20 61 63 63 65 73  first page acces
d850: 73 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20  sed, then get a 
d860: 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a  SHARED lock.  **
d870: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
d880: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
d890: 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d  ( pPager->nRef==
d8a0: 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6d 65  0 && !pPager->me
d8b0: 6d 44 62 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  mDb ){.    int b
d8c0: 75 73 79 20 3d 20 31 3b 0a 20 20 20 20 64 6f 20  usy = 1;.    do 
d8d0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
d8e0: 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67  ite3OsLock(&pPag
d8f0: 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c  er->fd, SHARED_L
d900: 4f 43 4b 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  OCK);.    }while
d910: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
d920: 59 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50  Y && .        pP
d930: 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
d940: 65 72 20 26 26 20 0a 20 20 20 20 20 20 20 20 70  er && .        p
d950: 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
d960: 6c 65 72 2d 3e 78 46 75 6e 63 20 26 26 20 0a 20  ler->xFunc && . 
d970: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
d980: 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75  BusyHandler->xFu
d990: 6e 63 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79  nc(pPager->pBusy
d9a0: 48 61 6e 64 6c 65 72 2d 3e 70 41 72 67 2c 20 22  Handler->pArg, "
d9b0: 22 2c 20 62 75 73 79 2b 2b 29 0a 20 20 20 20 29  ", busy++).    )
d9c0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
d9d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
d9e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
d9f0: 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  }.    pPager->st
da00: 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
da10: 45 44 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61  ED;..    /* If a
da20: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
da30: 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20  ists, and there 
da40: 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c  is no RESERVED l
da50: 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
da60: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
da70: 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20   then it either 
da80: 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
da90: 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74  ed back or delet
daa0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
dab0: 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  f( pPager->useJo
dac0: 75 72 6e 61 6c 20 26 26 20 0a 20 20 20 20 20 20  urnal && .      
dad0: 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45    sqlite3OsFileE
dae0: 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a  xists(pPager->zJ
daf0: 6f 75 72 6e 61 6c 29 20 26 26 0a 20 20 20 20 20  ournal) &&.     
db00: 20 20 20 21 73 71 6c 69 74 65 33 4f 73 43 68 65     !sqlite3OsChe
db10: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 26  ckReservedLock(&
db20: 70 50 61 67 65 72 2d 3e 66 64 29 20 0a 20 20 20  pPager->fd) .   
db30: 20 29 7b 0a 20 20 20 20 20 20 20 69 6e 74 20 72   ){.       int r
db40: 63 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 47 65  c;..       /* Ge
db50: 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
db60: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
db70: 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
db80: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
db90: 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  OsLock(&pPager->
dba0: 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  fd, EXCLUSIVE_LO
dbb0: 43 4b 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20  CK);.       if( 
dbc0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
dbd0: 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
dbe0: 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  3OsUnlock(&pPage
dbf0: 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
dc00: 0a 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72  .         pPager
dc10: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
dc20: 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  UNLOCK;.        
dc30: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
dc40: 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67     }.       pPag
dc50: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
dc60: 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 0a 20 20  R_EXCLUSIVE;..  
dc70: 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65       /* Open the
dc80: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61   journal for rea
dc90: 64 69 6e 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75  ding only.  Retu
dca0: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  rn SQLITE_BUSY i
dcb0: 66 0a 20 20 20 20 20 20 20 2a 2a 20 77 65 20 61  f.       ** we a
dcc0: 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  re unable to ope
dcd0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
dce0: 6c 65 2e 20 0a 20 20 20 20 20 20 20 2a 2a 0a 20  le. .       **. 
dcf0: 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75        ** The jou
dd00: 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  rnal file does n
dd10: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f  ot need to be lo
dd20: 63 6b 65 64 20 69 74 73 65 6c 66 2e 20 20 54 68  cked itself.  Th
dd30: 65 0a 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  e.       ** jour
dd40: 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65  nal file is neve
dd50: 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74 68  r open unless th
dd60: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
dd70: 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20 20  file holds.     
dd80: 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63    ** a write loc
dd90: 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e  k, so there is n
dda0: 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63 65 20  ever any chance 
ddb0: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20  of two or more. 
ddc0: 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
ddd0: 65 73 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a  es opening the j
dde0: 6f 75 72 6e 61 6c 20 61 74 20 74 68 65 20 73 61  ournal at the sa
ddf0: 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20  me time..       
de00: 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73  */.       rc = s
de10: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
de20: 4f 6e 6c 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  Only(pPager->zJo
de30: 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e  urnal, &pPager->
de40: 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 69 66 28  jfd);.       if(
de50: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
de60: 7b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  {.         sqlit
de70: 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67  e3OsUnlock(&pPag
de80: 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
de90: 3b 0a 20 20 20 20 20 20 20 20 20 70 50 61 67 65  ;.         pPage
dea0: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
deb0: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
dec0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ded0: 42 55 53 59 3b 0a 20 20 20 20 20 20 20 7d 0a 20  BUSY;.       }. 
dee0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
def0: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20  urnalOpen = 1;. 
df00: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
df10: 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
df20: 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 50 6c 61  ;..       /* Pla
df30: 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65  yback and delete
df40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44   the journal.  D
df50: 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65  rop the database
df60: 20 77 72 69 74 65 0a 20 20 20 20 20 20 20 2a 2a   write.       **
df70: 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75   lock and reacqu
df80: 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ire the read loc
df90: 6b 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  k..       */.   
dfa0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
dfb0: 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
dfc0: 30 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72  0);.       if( r
dfd0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
dfe0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
dff0: 72 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20  rc;.       }.   
e000: 20 7d 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a   }.    pPg = 0;.
e010: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
e020: 53 65 61 72 63 68 20 66 6f 72 20 70 61 67 65 20  Search for page 
e030: 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 20 20  in cache */.    
e040: 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
e050: 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
e060: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
e070: 2d 3e 6d 65 6d 44 62 20 26 26 20 70 50 61 67 65  ->memDb && pPage
e080: 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
e090: 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  UNLOCK ){.      
e0a0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
e0b0: 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
e0c0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50    }.  }.  if( pP
e0d0: 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  g==0 ){.    /* T
e0e0: 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
e0f0: 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  e is not in the 
e100: 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20  page cache. */. 
e110: 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 70 50     int h;.    pP
e120: 61 67 65 72 2d 3e 6e 4d 69 73 73 2b 2b 3b 0a 20  ager->nMiss++;. 
e130: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
e140: 50 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50  Page<pPager->mxP
e150: 61 67 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70  age || pPager->p
e160: 46 69 72 73 74 3d 3d 30 20 7c 7c 20 70 50 61 67  First==0 || pPag
e170: 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
e180: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e     /* Create a n
e190: 65 77 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ew page */.     
e1a0: 20 70 50 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c   pPg = sqliteMal
e1b0: 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a  locRaw( sizeof(*
e1c0: 70 50 67 29 20 2b 20 53 51 4c 49 54 45 5f 50 41  pPg) + SQLITE_PA
e1d0: 47 45 5f 53 49 5a 45 20 0a 20 20 20 20 20 20 20  GE_SIZE .       
e1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1f0: 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28         + sizeof(
e200: 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e  u32) + pPager->n
e210: 45 78 74 72 61 0a 20 20 20 20 20 20 20 20 20 20  Extra.          
e220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e230: 20 20 20 20 2b 20 70 50 61 67 65 72 2d 3e 6d 65      + pPager->me
e240: 6d 44 62 2a 73 69 7a 65 6f 66 28 50 67 48 69 73  mDb*sizeof(PgHis
e250: 74 6f 72 79 29 20 29 3b 0a 20 20 20 20 20 20 69  tory) );.      i
e260: 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
e270: 20 20 20 20 20 70 61 67 65 72 5f 75 6e 77 72 69       pager_unwri
e280: 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
e290: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
e2a0: 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52  errMask |= PAGER
e2b0: 5f 45 52 52 5f 4d 45 4d 3b 0a 20 20 20 20 20 20  _ERR_MEM;.      
e2c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e2d0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
e2e0: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2c       memset(pPg,
e2f0: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50 67 29   0, sizeof(*pPg)
e300: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
e310: 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
e320: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
e330: 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
e340: 70 50 61 67 65 72 29 2c 20 30 2c 20 73 69 7a 65  pPager), 0, size
e350: 6f 66 28 50 67 48 69 73 74 6f 72 79 29 29 3b 0a  of(PgHistory));.
e360: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
e370: 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  g->pPager = pPag
e380: 65 72 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  er;.      pPg->p
e390: 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72  NextAll = pPager
e3a0: 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 20 20 70 50  ->pAll;.      pP
e3b0: 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67  ager->pAll = pPg
e3c0: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
e3d0: 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 7d 65 6c  nPage++;.    }el
e3e0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e  se{.      /* Fin
e3f0: 64 20 61 20 70 61 67 65 20 74 6f 20 72 65 63 79  d a page to recy
e400: 63 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63  cle.  Try to loc
e410: 61 74 65 20 61 20 70 61 67 65 20 74 68 61 74 20  ate a page that 
e420: 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a  does not.      *
e430: 2a 20 72 65 71 75 69 72 65 20 75 73 20 74 6f 20  * require us to 
e440: 64 6f 20 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e  do an fsync() on
e450: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20   the journal..  
e460: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 67      */.      pPg
e470: 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73   = pPager->pFirs
e480: 74 53 79 6e 63 65 64 3b 0a 0a 20 20 20 20 20 20  tSynced;..      
e490: 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c 64 20 6e  /* If we could n
e4a0: 6f 74 20 66 69 6e 64 20 61 20 70 61 67 65 20 74  ot find a page t
e4b0: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  hat does not req
e4c0: 75 69 72 65 20 61 6e 20 66 73 79 6e 63 28 29 0a  uire an fsync().
e4d0: 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
e4e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
e4f0: 6e 20 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  n fsync the jour
e500: 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20  nal file.  This 
e510: 69 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 76 65  is a.      ** ve
e520: 72 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f  ry slow operatio
e530: 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61  n, so we work ha
e540: 72 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20  rd to avoid it. 
e550: 20 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20   But sometimes. 
e560: 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 27 74       ** it can't
e570: 20 62 65 20 68 65 6c 70 65 64 2e 0a 20 20 20 20   be helped..    
e580: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
e590: 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Pg==0 ){.       
e5a0: 20 69 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f   int rc = syncJo
e5b0: 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 30 29  urnal(pPager, 0)
e5c0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
e5d0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
e5e0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
e5f0: 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
e600: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
e610: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
e620: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e630: 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70   pPg = pPager->p
e640: 46 69 72 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  First;.      }. 
e650: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
e660: 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20  ->nRef==0 );..  
e670: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
e680: 20 70 61 67 65 20 74 6f 20 74 68 65 20 64 61 74   page to the dat
e690: 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 69 74  abase file if it
e6a0: 20 69 73 20 64 69 72 74 79 2e 0a 20 20 20 20 20   is dirty..     
e6b0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
e6c0: 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  g->dirty ){.    
e6d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
e6e0: 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a  >needSync==0 );.
e6f0: 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 44 69          pPg->pDi
e700: 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rty = 0;.       
e710: 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
e720: 65 5f 70 61 67 65 6c 69 73 74 28 20 70 50 67 20  e_pagelist( pPg 
e730: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
e740: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
e750: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
e760: 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
e770: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
e780: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e790: 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20  _IOERR;.        
e7a0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
e7b0: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72  assert( pPg->dir
e7c0: 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  ty==0 );..      
e7d0: 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 77  /* If the page w
e7e0: 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e 67 20  e are recycling 
e7f0: 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77  is marked as alw
e800: 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  aysRollback, the
e810: 6e 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74  n.      ** set t
e820: 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73  he global always
e830: 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74  Rollback flag, t
e840: 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20 74 68  hus disabling th
e850: 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  e.      ** sqlit
e860: 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  e_dont_rollback(
e870: 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66  ) optimization f
e880: 6f 72 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  or the rest of t
e890: 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  his transaction.
e8a0: 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20  .      ** It is 
e8b0: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 6f 20  necessary to do 
e8c0: 74 68 69 73 20 62 65 63 61 75 73 65 20 74 68 65  this because the
e8d0: 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77   page marked alw
e8e0: 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 20 20  aysRollback.    
e8f0: 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 72 65    ** might be re
e900: 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61 74 65  loaded at a late
e910: 72 20 74 69 6d 65 20 62 75 74 20 61 74 20 74 68  r time but at th
e920: 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e 27  at point we won'
e930: 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 20 20 20  t remember.     
e940: 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61 73 20   ** that is was 
e950: 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c  marked alwaysRol
e960: 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d 65 61  lback.  This mea
e970: 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  ns that all page
e980: 73 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20  s must.      ** 
e990: 62 65 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77  be marked as alw
e9a0: 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d  aysRollback from
e9b0: 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20   here on out..  
e9c0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
e9d0: 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c   pPg->alwaysRoll
e9e0: 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  back ){.        
e9f0: 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
ea00: 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20  llback = 1;.    
ea10: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55 6e    }..      /* Un
ea20: 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67  link the old pag
ea30: 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20  e from the free 
ea40: 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68 61 73  list and the has
ea50: 68 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2f  h table.      */
ea60: 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67  .      unlinkPag
ea70: 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50  e(pPg);.      pP
ea80: 61 67 65 72 2d 3e 6e 4f 76 66 6c 2b 2b 3b 0a 20  ager->nOvfl++;. 
ea90: 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 67     }.    pPg->pg
eaa0: 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 69  no = pgno;.    i
eab0: 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  f( pPager->aInJo
eac0: 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67  urnal && (int)pg
ead0: 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67  no<=pPager->orig
eae0: 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  DbSize ){.      
eaf0: 73 71 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f  sqlite3CheckMemo
eb00: 72 79 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ry(pPager->aInJo
eb10: 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a  urnal, pgno/8);.
eb20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
eb30: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
eb40: 6e 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  n );.      pPg->
eb50: 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61  inJournal = (pPa
eb60: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
eb70: 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70  pgno/8] & (1<<(p
eb80: 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20  gno&7)))!=0;.   
eb90: 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
eba0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
ebb0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
ebc0: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
ebd0: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
ebe0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
ebf0: 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
ec00: 74 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d  t && (int)pgno<=
ec10: 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
ec20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
ec30: 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d   (pPager->aInStm
ec40: 74 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c  t[pgno/8] & (1<<
ec50: 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 20 29 7b  (pgno&7)))!=0 ){
ec60: 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f  .      page_add_
ec70: 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
ec80: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
ec90: 20 20 20 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f      page_remove_
eca0: 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70  from_stmt_list(p
ecb0: 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  Pg);.    }.    p
ecc0: 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
ecd0: 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31     pPg->nRef = 1
ece0: 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50  ;.    REFINFO(pP
ecf0: 67 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  g);.    pPager->
ed00: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 68 20 3d 20  nRef++;.    h = 
ed10: 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29  pager_hash(pgno)
ed20: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
ed30: 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61  Hash = pPager->a
ed40: 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61  Hash[h];.    pPa
ed50: 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20  ger->aHash[h] = 
ed60: 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67  pPg;.    if( pPg
ed70: 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20  ->pNextHash ){. 
ed80: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
ed90: 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
eda0: 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
edb0: 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
edc0: 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  h->pPrevHash = p
edd0: 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  Pg;.    }.    if
ede0: 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  ( pPager->nExtra
edf0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  >0 ){.      mems
ee00: 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52  et(PGHDR_TO_EXTR
ee10: 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65  A(pPg), 0, pPage
ee20: 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  r->nExtra);.    
ee30: 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
ee40: 2d 3e 64 62 53 69 7a 65 3c 30 20 29 20 73 71 6c  ->dbSize<0 ) sql
ee50: 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
ee60: 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  unt(pPager);.   
ee70: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
ee80: 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20  Mask!=0 ){.     
ee90: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
eea0: 72 65 66 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  ref(PGHDR_TO_DAT
eeb0: 41 28 70 50 67 29 29 3b 0a 20 20 20 20 20 20 72  A(pPg));.      r
eec0: 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64  c = pager_errcod
eed0: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
eee0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
eef0: 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
ef00: 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 67  ->dbSize<(int)pg
ef10: 6e 6f 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  no ){.      mems
ef20: 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  et(PGHDR_TO_DATA
ef30: 28 70 50 67 29 2c 20 30 2c 20 53 51 4c 49 54 45  (pPg), 0, SQLITE
ef40: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
ef50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
ef60: 74 20 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65  t rc;.      asse
ef70: 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  rt( pPager->memD
ef80: 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  b==0 );.      sq
ef90: 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
efa0: 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31  ger->fd, (pgno-1
efb0: 29 2a 28 6f 66 66 5f 74 29 53 51 4c 49 54 45 5f  )*(off_t)SQLITE_
efc0: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
efd0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
efe0: 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e 66 64  Read(&pPager->fd
eff0: 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
f000: 70 50 67 29 2c 20 53 51 4c 49 54 45 5f 50 41 47  pPg), SQLITE_PAG
f010: 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 54  E_SIZE);.      T
f020: 52 41 43 45 32 28 22 46 45 54 43 48 20 70 61 67  RACE2("FETCH pag
f030: 65 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67  e %d\n", pPg->pg
f040: 6e 6f 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43  no);.      CODEC
f050: 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54  (pPager, PGHDR_T
f060: 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 67  O_DATA(pPg), pPg
f070: 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20  ->pgno, 3);.    
f080: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
f090: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6f  _OK ){.        o
f0a0: 66 66 5f 74 20 66 69 6c 65 53 69 7a 65 3b 0a 20  ff_t fileSize;. 
f0b0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
f0c0: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50  e3OsFileSize(&pP
f0d0: 61 67 65 72 2d 3e 66 64 2c 26 66 69 6c 65 53 69  ager->fd,&fileSi
f0e0: 7a 65 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20  ze)!=SQLITE_OK. 
f0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
f100: 20 66 69 6c 65 53 69 7a 65 3e 3d 70 67 6e 6f 2a   fileSize>=pgno*
f110: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
f120: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
f130: 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
f140: 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
f150: 50 67 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Pg));.          
f160: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
f170: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f180: 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
f190: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30  _TO_DATA(pPg), 0
f1a0: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
f1b0: 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ZE);.        }. 
f1c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
f1d0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
f1e0: 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
f1f0: 69 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  is in the page c
f200: 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61  ache. */.    pPa
f210: 67 65 72 2d 3e 6e 48 69 74 2b 2b 3b 0a 20 20 20  ger->nHit++;.   
f220: 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
f230: 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20    }.  *ppPage = 
f240: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
f250: 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  g);.  return SQL
f260: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
f270: 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20   Acquire a page 
f280: 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
f290: 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
f2a0: 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20  y cache.  Do.** 
f2b0: 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67  not read the pag
f2c0: 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65  e from disk.  Re
f2d0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
f2e0: 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f  o the page,.** o
f2f0: 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20  r 0 if the page 
f300: 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e  is not in cache.
f310: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
f320: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
f330: 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65  ().  The differe
f340: 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
f350: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20   routine.** and 
f360: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
f370: 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28  () is that _get(
f380: 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65  ) will go to the
f390: 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a   disk and read.*
f3a0: 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66  * in the page if
f3b0: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
f3c0: 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68   already in cach
f3d0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
f3e0: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  .** returns NULL
f3f0: 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
f400: 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
f410: 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72  if a disk I/O er
f420: 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72  ror .** has ever
f430: 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 76 6f   happened..*/.vo
f440: 69 64 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72  id *sqlite3pager
f450: 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  _lookup(Pager *p
f460: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
f470: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
f480: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
f490: 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
f4a0: 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20  t( pgno!=0 );.  
f4b0: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
f4c0: 61 73 6b 20 26 20 7e 28 50 41 47 45 52 5f 45 52  ask & ~(PAGER_ER
f4d0: 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20 20 20 72  R_FULL) ){.    r
f4e0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
f4f0: 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
f500: 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
f510: 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 20  .  if( pPg==0 ) 
f520: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 61 67 65  return 0;.  page
f530: 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74  _ref(pPg);.  ret
f540: 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  urn PGHDR_TO_DAT
f550: 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  A(pPg);.}../*.**
f560: 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e   Release a page.
f570: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75  .**.** If the nu
f580: 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
f590: 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  es to the page d
f5a0: 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  rop to zero, the
f5b0: 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73  n the.** page is
f5c0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
f5d0: 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c  U list.  When al
f5e0: 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  l references to 
f5f0: 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65  all pages.** are
f600: 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c   released, a rol
f610: 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64  lback occurs and
f620: 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
f630: 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20   database is.** 
f640: 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20  removed..*/.int 
f650: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
f660: 65 66 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  ef(void *pData){
f670: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
f680: 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
f690: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
f6a0: 6e 74 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  nt for this page
f6b0: 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 44 41  .  */.  pPg = DA
f6c0: 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
f6d0: 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  a);.  assert( pP
f6e0: 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70  g->nRef>0 );.  p
f6f0: 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45  Pg->nRef--;.  RE
f700: 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 2f  FINFO(pPg);..  /
f710: 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  * When the numbe
f720: 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
f730: 74 6f 20 61 20 70 61 67 65 20 72 65 61 63 68 20  to a page reach 
f740: 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a  0, call the.  **
f750: 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e 64 20   destructor and 
f760: 61 64 64 20 74 68 65 20 70 61 67 65 20 74 6f 20  add the page to 
f770: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20  the freelist..  
f780: 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  */.  if( pPg->nR
f790: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67  ef==0 ){.    Pag
f7a0: 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20  er *pPager;.    
f7b0: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
f7c0: 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70  ager;.    pPg->p
f7d0: 4e 65 78 74 46 72 65 65 20 3d 20 30 3b 0a 20 20  NextFree = 0;.  
f7e0: 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65    pPg->pPrevFree
f7f0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74   = pPager->pLast
f800: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c  ;.    pPager->pL
f810: 61 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 69  ast = pPg;.    i
f820: 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65  f( pPg->pPrevFre
f830: 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  e ){.      pPg->
f840: 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74  pPrevFree->pNext
f850: 46 72 65 65 20 3d 20 70 50 67 3b 0a 20 20 20 20  Free = pPg;.    
f860: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
f870: 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50  ger->pFirst = pP
f880: 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  g;.    }.    if(
f890: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d   pPg->needSync==
f8a0: 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46 69  0 && pPager->pFi
f8b0: 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 29 7b 0a  rstSynced==0 ){.
f8c0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46        pPager->pF
f8d0: 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 67  irstSynced = pPg
f8e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f8f0: 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
f900: 74 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61  tor ){.      pPa
f910: 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
f920: 28 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  (pData, pPager->
f930: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
f940: 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  .  .    /* When 
f950: 61 6c 6c 20 70 61 67 65 73 20 72 65 61 63 68 20  all pages reach 
f960: 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 64 72  the freelist, dr
f970: 6f 70 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  op the read lock
f980: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
f990: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
f9a0: 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
f9b0: 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61  r->nRef--;.    a
f9c0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
f9d0: 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  Ref>=0 );.    if
f9e0: 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d  ( pPager->nRef==
f9f0: 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6d 65  0 && !pPager->me
fa00: 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 70 61 67  mDb ){.      pag
fa10: 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
fa20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
fa30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
fa40: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
fa50: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  a journal file f
fa60: 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68 65 72  or pPager.  Ther
fa70: 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  e should already
fa80: 20 62 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a   be a RESERVED.*
fa90: 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  * or EXCLUSIVE l
faa0: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
fab0: 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68  ase file when th
fac0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
fad0: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lled..**.** Retu
fae0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
faf0: 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74  everything.  Ret
fb00: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
fb10: 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68  e and release th
fb20: 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20  e.** write lock 
fb30: 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
fb40: 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
fb50: 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e  c int pager_open
fb60: 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  _journal(Pager *
fb70: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
fb80: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  c;.  assert( pPa
fb90: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
fba0: 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
fbb0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
fbc0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
fbd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
fbe0: 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
fbf0: 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72  ;.  sqlite3pager
fc00: 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  _pagecount(pPage
fc10: 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49  r);.  pPager->aI
fc20: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
fc30: 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d  eMalloc( pPager-
fc40: 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b  >dbSize/8 + 1 );
fc50: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
fc60: 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a  InJournal==0 ){.
fc70: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c      sqlite3OsUnl
fc80: 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
fc90: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
fca0: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
fcb0: 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
fcc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fcd0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
fce0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
fcf0: 65 6e 45 78 63 6c 75 73 69 76 65 28 70 50 61 67  enExclusive(pPag
fd00: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70  er->zJournal, &p
fd10: 50 61 67 65 72 2d 3e 6a 66 64 2c 70 50 61 67 65  Pager->jfd,pPage
fd20: 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
fd30: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
fd40: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  K ){.    sqliteF
fd50: 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ree(pPager->aInJ
fd60: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61  ournal);.    pPa
fd70: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
fd80: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
fd90: 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72  OsUnlock(&pPager
fda0: 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
fdb0: 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  K);.    pPager->
fdc0: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
fdd0: 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  ARED;.    return
fde0: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
fdf0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f  ;.  }.  sqlite3O
fe00: 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70  sOpenDirectory(p
fe10: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
fe20: 79 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  y, &pPager->jfd)
fe30: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
fe40: 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70  nalOpen = 1;.  p
fe50: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
fe60: 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 70 50 61  arted = 0;.  pPa
fe70: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
fe80: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c 77  0;.  pPager->alw
fe90: 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b  aysRollback = 0;
fea0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20  .  pPager->nRec 
feb0: 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 0;.  if( pPage
fec0: 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b  r->errMask!=0 ){
fed0: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
fee0: 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
fef0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
ff00: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72    }.  pPager->or
ff10: 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65  igDbSize = pPage
ff20: 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 2f 2a  r->dbSize;..  /*
ff30: 20 43 72 65 61 74 65 20 74 68 65 20 68 65 61 64   Create the head
ff40: 65 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  er for the journ
ff50: 61 6c 3a 0a 20 20 2a 2a 20 2d 20 38 20 62 79 74  al:.  ** - 8 byt
ff60: 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69  es: Magic identi
ff70: 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f  fying journal fo
ff80: 72 6d 61 74 2e 0a 20 20 2a 2a 20 2d 20 34 20 62  rmat..  ** - 4 b
ff90: 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20  ytes: Number of 
ffa0: 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e  records in journ
ffb0: 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e  al, or -1 no-syn
ffc0: 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 20 20  c mode is on..  
ffd0: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4d 61  ** - 4 bytes: Ma
ffe0: 67 69 63 20 75 73 65 64 20 66 6f 72 20 70 61 67  gic used for pag
fff0: 65 20 63 68 65 63 6b 73 75 6d 73 2e 0a 20 20 2a  e checksums..  *
10000 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69  * - 4 bytes: Ini
10010 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61  tial database pa
10020 67 65 20 63 6f 75 6e 74 2e 0a 20 20 2a 2a 20 2d  ge count..  ** -
10030 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72   4 bytes: Number
10040 20 6f 66 20 62 79 74 65 73 20 72 65 73 65 72 76   of bytes reserv
10050 65 64 20 66 6f 72 20 6d 61 73 74 65 72 20 6a 6f  ed for master jo
10060 75 72 6e 61 6c 20 70 74 72 20 28 6e 4d 61 73 74  urnal ptr (nMast
10070 65 72 29 0a 20 20 2a 2a 20 2d 20 6e 4d 61 73 74  er).  ** - nMast
10080 65 72 20 62 79 74 65 73 3a 20 53 70 61 63 65 20  er bytes: Space 
10090 66 6f 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  for a master jou
100a0 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2e 0a 20 20  rnal pointer..  
100b0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
100c0 33 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72  3OsWrite(&pPager
100d0 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d  ->jfd, aJournalM
100e0 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
100f0 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
10100 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
10110 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 72  K ){.    rc = wr
10120 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65  ite32bits(&pPage
10130 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
10140 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66 66 66 66  noSync ? 0xfffff
10150 66 66 66 20 3a 20 30 29 3b 0a 20 20 7d 0a 20 20  fff : 0);.  }.  
10160 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
10170 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
10180 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  Randomness(sizeo
10190 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  f(pPager->cksumI
101a0 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63  nit), &pPager->c
101b0 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 20 20 72  ksumInit);.    r
101c0 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
101d0 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
101e0 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
101f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
10200 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10210 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
10220 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
10230 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
10240 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
10250 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10260 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
10270 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  (&pPager->jfd, p
10280 50 61 67 65 72 2d 3e 6e 4d 61 73 74 65 72 29 3b  Pager->nMaster);
10290 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
102a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
102b0 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
102c0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 32 34 20 2b  Pager->jfd, 24 +
102d0 20 70 50 61 67 65 72 2d 3e 6e 4d 61 73 74 65 72   pPager->nMaster
102e0 20 2d 20 31 29 3b 0a 20 20 20 20 72 63 20 3d 20   - 1);.    rc = 
102f0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26  sqlite3OsWrite(&
10300 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22 5c 30  pPager->jfd, "\0
10310 30 30 22 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 69  00", 1);.  }.  i
10320 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41  f( pPager->stmtA
10330 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53  utoopen && rc==S
10340 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10350 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
10360 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28 70 50 61  r_stmt_begin(pPa
10370 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
10380 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10390 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
103a0 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
103b0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  er);.    if( rc=
103c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
103d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
103e0 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  FULL;.    }.  }.
103f0 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d    return rc;  .}
10400 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
10410 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
10420 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
10430 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76  he lock is remov
10440 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61  ed when.** the a
10450 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
10460 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a  ing happen:.**.*
10470 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61  *   *  sqlite3pa
10480 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20 69 73 20  ger_commit() is 
10490 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
104a0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
104b0 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65  lback() is calle
104c0 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
104d0 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 20  e3pager_close() 
104e0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
104f0 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  *  sqlite3pager_
10500 75 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65  unref() is calle
10510 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75  d to on every ou
10520 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a  tstanding page..
10530 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
10540 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69  parameter to thi
10550 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70  s routine is a p
10560 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70  ointer to any op
10570 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a  en page of the.*
10580 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
10590 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65    Nothing change
105a0 73 20 61 62 6f 75 74 20 74 68 65 20 70 61 67 65  s about the page
105b0 20 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d 65   - it is used me
105c0 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69  rely to.** acqui
105d0 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  re a pointer to 
105e0 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
105f0 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66  ure and as proof
10600 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 2a   that there is.*
10610 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64  * already a read
10620 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74  -lock on the dat
10630 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  abase..**.** The
10640 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
10650 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20  r indicates how 
10660 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20 62 79  much space in by
10670 74 65 73 20 74 6f 20 72 65 73 65 72 76 65 20 66  tes to reserve f
10680 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a  or a.** master j
10690 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65  ournal file-name
106a0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
106b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65   the journal whe
106c0 6e 20 69 74 20 69 73 20 63 72 65 61 74 65 64 2e  n it is created.
106d0 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c  .**.** A journal
106e0 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
106f0 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  if this is not a
10700 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
10710 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a    For temporary.
10720 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70  ** files, the op
10730 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75  ening of the jou
10740 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66  rnal file is def
10750 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72  erred until ther
10760 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61  e is an.** actua
10770 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20  l need to write 
10780 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
10790 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
107a0 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79  abase is already
107b0 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 72   reserved for wr
107c0 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75 74  iting, this rout
107d0 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
107e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
107f0 67 65 72 5f 62 65 67 69 6e 28 76 6f 69 64 20 2a  ger_begin(void *
10800 70 44 61 74 61 2c 20 69 6e 74 20 6e 4d 61 73 74  pData, int nMast
10810 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
10820 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
10830 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65  R(pData);.  Page
10840 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
10850 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
10860 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
10870 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
10880 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ef>0 );.  assert
10890 28 20 6e 4d 61 73 74 65 72 3e 3d 30 20 29 3b 0a  ( nMaster>=0 );.
108a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
108b0 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
108c0 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  NLOCK );.  if( p
108d0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
108e0 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20  GER_SHARED ){.  
108f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
10900 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->aInJournal==0 
10910 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
10920 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
10930 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
10940 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
10950 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  E;.      pPager-
10960 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50  >origDbSize = pP
10970 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
10980 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
10990 6e 74 20 62 75 73 79 20 3d 20 31 3b 0a 20 20 20  nt busy = 1;.   
109a0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20     do {.        
109b0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
109c0 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ck(&pPager->fd, 
109d0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a  RESERVED_LOCK);.
109e0 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63        }while( rc
109f0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
10a00 20 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67   .          pPag
10a10 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
10a20 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 70   && .          p
10a30 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
10a40 6c 65 72 2d 3e 78 46 75 6e 63 20 26 26 20 0a 20  ler->xFunc && . 
10a50 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
10a60 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78  >pBusyHandler->x
10a70 46 75 6e 63 28 70 50 61 67 65 72 2d 3e 70 42 75  Func(pPager->pBu
10a80 73 79 48 61 6e 64 6c 65 72 2d 3e 70 41 72 67 2c  syHandler->pArg,
10a90 20 22 22 2c 20 62 75 73 79 2b 2b 29 0a 20 20 20   "", busy++).   
10aa0 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20     );.      if( 
10ab0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10ac0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
10ad0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
10ae0 20 20 70 50 61 67 65 72 2d 3e 6e 4d 61 73 74 65    pPager->nMaste
10af0 72 20 3d 20 6e 4d 61 73 74 65 72 3b 0a 20 20 20  r = nMaster;.   
10b00 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
10b10 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45   = PAGER_RESERVE
10b20 44 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  D;.      pPager-
10b30 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b  >dirtyCache = 0;
10b40 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22 54  .      TRACE3("T
10b50 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 20 6e 4d  RANSACTION %d nM
10b60 61 73 74 65 72 3d 25 64 5c 6e 22 2c 20 70 50 61  aster=%d\n", pPa
10b70 67 65 72 2d 3e 66 64 2e 68 2c 20 6e 4d 61 73 74  ger->fd.h, nMast
10b80 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  er);.      if( p
10b90 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
10ba0 6c 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  l && !pPager->te
10bb0 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
10bc0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
10bd0 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
10be0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
10bf0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
10c00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
10c10 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  a data page as w
10c20 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70  riteable.  The p
10c30 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
10c40 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
10c50 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74  .** if it is not
10c60 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20   there already. 
10c70 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   This routine mu
10c80 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66  st be called bef
10c90 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68  ore making.** ch
10ca0 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e  anges to a page.
10cb0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
10cc0 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69   time this routi
10cd0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
10ce0 65 20 70 61 67 65 72 20 63 72 65 61 74 65 73 20  e pager creates 
10cf0 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  a new.** journal
10d00 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20   and acquires a 
10d10 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
10d20 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
10d30 49 66 20 74 68 65 20 52 45 53 45 52 56 45 44 0a  If the RESERVED.
10d40 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f  ** lock could no
10d50 74 20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74  t be acquired, t
10d60 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
10d70 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  rns SQLITE_BUSY.
10d80 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
10d90 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68   routine must ch
10da0 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74  eck for that ret
10db0 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65  urn value and be
10dc0 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a   careful not to.
10dd0 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61  ** change any pa
10de0 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68  ge data until th
10df0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
10e00 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
10e10 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
10e20 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f  al file could no
10e30 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 63  t be written bec
10e40 61 75 73 65 20 74 68 65 20 64 69 73 6b 20 69 73  ause the disk is
10e50 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74   full,.** then t
10e60 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
10e70 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  rns SQLITE_FULL 
10e80 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65  and does an imme
10e90 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  diate rollback..
10ea0 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e  ** All subsequen
10eb0 74 20 77 72 69 74 65 20 61 74 74 65 6d 70 74 73  t write attempts
10ec0 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c   also return SQL
10ed0 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74  ITE_FULL until t
10ee0 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c  here.** is a cal
10ef0 6c 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65  l to sqlite3page
10f00 72 5f 63 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71  r_commit() or sq
10f10 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
10f20 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65  ack() to.** rese
10f30 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
10f40 33 70 61 67 65 72 5f 77 72 69 74 65 28 76 6f 69  3pager_write(voi
10f50 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
10f60 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54  dr *pPg = DATA_T
10f70 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
10f80 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
10f90 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
10fa0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
10fb0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  _OK;..  /* Check
10fc0 20 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f   for errors.  */
10fd0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
10fe0 72 72 4d 61 73 6b 20 29 7b 20 0a 20 20 20 20 72  rrMask ){ .    r
10ff0 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63  eturn pager_errc
11000 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ode(pPager);.  }
11010 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72  .  if( pPager->r
11020 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72  eadOnly ){.    r
11030 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
11040 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72  M;.  }..  /* Mar
11050 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69  k the page as di
11060 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67  rty.  If the pag
11070 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
11080 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20  en written.  ** 
11090 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  to the journal t
110a0 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72  hen we can retur
110b0 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  n right away..  
110c0 2a 2f 0a 20 20 70 50 67 2d 3e 64 69 72 74 79 20  */.  pPg->dirty 
110d0 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  = 1;.  if( pPg->
110e0 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50  inJournal && (pP
110f0 67 2d 3e 69 6e 53 74 6d 74 20 7c 7c 20 70 50 61  g->inStmt || pPa
11100 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d  ger->stmtInUse==
11110 30 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  0) ){.    pPager
11120 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31  ->dirtyCache = 1
11130 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
11140 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
11150 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
11160 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74   far, it means t
11170 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65  hat the page nee
11180 64 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 77 72  ds to be.  ** wr
11190 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61  itten to the tra
111a0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
111b0 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69   or the ckeckpoi
111c0 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  nt journal.  ** 
111d0 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20  or both..  **.  
111e0 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20 74  ** First check t
111f0 6f 20 73 65 65 20 74 68 61 74 20 74 68 65 20 74  o see that the t
11200 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
11210 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20  al exists and.  
11220 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69 66 20  ** create it if 
11230 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 2a  it does not..  *
11240 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
11250 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
11260 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20  _UNLOCK );.  rc 
11270 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 62  = sqlite3pager_b
11280 65 67 69 6e 28 70 44 61 74 61 2c 20 30 29 3b 0a  egin(pData, 0);.
11290 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
112a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
112b0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
112c0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
112d0 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
112e0 44 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  D );.  if( !pPag
112f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
11300 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  && pPager->useJo
11310 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20  urnal ){.    rc 
11320 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
11330 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
11340 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11350 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
11360 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
11370 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
11380 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75  en || !pPager->u
11390 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 70  seJournal );.  p
113a0 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
113b0 65 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 54 68 65  e = 1;..  /* The
113c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
113d0 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20  rnal now exists 
113e0 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52 45  and we have a RE
113f0 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 2a  SERVED or an.  *
11400 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
11410 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   on the main dat
11420 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69  abase file.  Wri
11430 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
11440 61 67 65 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  age to.  ** the 
11450 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
11460 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  nal if it is not
11470 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a   there already..
11480 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 67 2d    */.  if( !pPg-
11490 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70  >inJournal && (p
114a0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
114b0 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6d 65 6d  l || pPager->mem
114c0 44 62 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28  Db) ){.    if( (
114d0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
114e0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
114f0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ize ){.      int
11500 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 75 33 32   szPg;.      u32
11510 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20 69 66   saved;.      if
11520 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20  ( pPager->memDb 
11530 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73  ){.        PgHis
11540 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
11550 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
11560 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
11570 20 20 54 52 41 43 45 32 28 22 4a 4f 55 52 4e 41    TRACE2("JOURNA
11580 4c 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50  L page %d\n", pP
11590 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
115a0 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d    assert( pHist-
115b0 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20  >pOrig==0 );.   
115c0 20 20 20 20 20 70 48 69 73 74 2d 3e 70 4f 72 69       pHist->pOri
115d0 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  g = sqliteMalloc
115e0 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67  Raw( pPager->pag
115f0 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
11600 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69   if( pHist->pOri
11610 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  g ){.          m
11620 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 4f 72  emcpy(pHist->pOr
11630 69 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  ig, PGHDR_TO_DAT
11640 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
11650 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
11660 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 67     }.        pPg
11670 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
11680 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11690 20 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 20        u32 cksum 
116a0 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  = pager_cksum(pP
116b0 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
116c0 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20   pData);.       
116d0 20 73 61 76 65 64 20 3d 20 2a 28 75 33 32 2a 29   saved = *(u32*)
116e0 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
116f0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 73 74 6f  Pg);.        sto
11700 72 65 33 32 62 69 74 73 28 63 6b 73 75 6d 2c 20  re32bits(cksum, 
11710 70 50 67 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  pPg, SQLITE_PAGE
11720 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20  _SIZE);.        
11730 73 7a 50 67 20 3d 20 53 51 4c 49 54 45 5f 50 41  szPg = SQLITE_PA
11740 47 45 5f 53 49 5a 45 2b 38 3b 0a 20 20 20 20 20  GE_SIZE+8;.     
11750 20 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 70     store32bits(p
11760 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d  Pg->pgno, pPg, -
11770 34 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45  4);.        CODE
11780 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  C(pPager, pData,
11790 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a   pPg->pgno, 7);.
117a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
117b0 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61  ite3OsWrite(&pPa
117c0 67 65 72 2d 3e 6a 66 64 2c 20 26 28 28 63 68 61  ger->jfd, &((cha
117d0 72 2a 29 70 44 61 74 61 29 5b 2d 34 5d 2c 20 73  r*)pData)[-4], s
117e0 7a 50 67 29 3b 0a 20 20 20 20 20 20 20 20 54 52  zPg);.        TR
117f0 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20 70 61  ACE3("JOURNAL pa
11800 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
11810 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
11820 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b   pPg->needSync);
11830 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 28 70  .        CODEC(p
11840 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
11850 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20  g->pgno, 0);.   
11860 20 20 20 20 20 2a 28 75 33 32 2a 29 50 47 48 44       *(u32*)PGHD
11870 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 29 20  R_TO_EXTRA(pPg) 
11880 3d 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20 20  = saved;.       
11890 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
118a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
118b0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
118c0 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
118d0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
118e0 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45  >errMask |= PAGE
118f0 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20  R_ERR_FULL;.    
11900 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
11910 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11920 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b     pPager->nRec+
11930 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  +;.        asser
11940 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
11950 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20  urnal!=0 );.    
11960 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
11970 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f  ournal[pPg->pgno
11980 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
11990 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20  pgno&7);.       
119a0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
119b0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
119c0 3b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 69  ;.        pPg->i
119d0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
119e0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
119f0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
11a00 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
11a10 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67  >aInStmt[pPg->pg
11a20 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
11a30 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
11a40 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f       page_add_to
11a50 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b  _stmt_list(pPg);
11a60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11a70 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
11a80 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
11a90 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  c = !pPager->jou
11aa0 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20 21  rnalStarted && !
11ab0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
11ac0 20 20 20 20 20 20 54 52 41 43 45 33 28 22 41 50        TRACE3("AP
11ad0 50 45 4e 44 20 70 61 67 65 20 25 64 20 6e 65 65  PEND page %d nee
11ae0 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 20 70 50 67  dSync=%d\n", pPg
11af0 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65  ->pgno, pPg->nee
11b00 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 20 20  dSync);.    }.  
11b10 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53    if( pPg->needS
11b20 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ync ){.      pPa
11b30 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
11b40 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
11b50 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d  /* If the statem
11b60 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  ent journal is o
11b70 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
11b80 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20   is not in it,. 
11b90 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74   ** then write t
11ba0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
11bb0 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  to the statement
11bc0 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20   journal.  Note 
11bd0 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 74  that.  ** the st
11be0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
11bf0 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66  format differs f
11c00 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64  rom the standard
11c10 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a   journal format.
11c20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20    ** in that it 
11c30 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73  omits the checks
11c40 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64  ums and the head
11c50 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  er..  */.  if( p
11c60 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
11c70 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74   && !pPg->inStmt
11c80 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
11c90 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74  no<=pPager->stmt
11ca0 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Size ){.    asse
11cb0 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
11cc0 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e  al || (int)pPg->
11cd0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
11ce0 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 69  gDbSize );.    i
11cf0 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  f( pPager->memDb
11d00 20 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74   ){.      PgHist
11d10 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
11d20 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
11d30 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61  pPager);.      a
11d40 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 53  ssert( pHist->pS
11d50 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt==0 );.      
11d60 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73  pHist->pStmt = s
11d70 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
11d80 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
11d90 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48   );.      if( pH
11da0 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  ist->pStmt ){.  
11db0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69        memcpy(pHi
11dc0 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44 52  st->pStmt, PGHDR
11dd0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
11de0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
11df0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11e00 54 52 41 43 45 32 28 22 53 54 4d 54 2d 4a 4f 55  TRACE2("STMT-JOU
11e10 52 4e 41 4c 20 70 61 67 65 20 25 64 5c 6e 22 2c  RNAL page %d\n",
11e20 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
11e30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74   }else{.      st
11e40 6f 72 65 33 32 62 69 74 73 28 70 50 67 2d 3e 70  ore32bits(pPg->p
11e50 67 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20  gno, pPg, -4);. 
11e60 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65       CODEC(pPage
11e70 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
11e80 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 72  gno, 7);.      r
11e90 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
11ea0 74 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64  te(&pPager->stfd
11eb0 2c 20 28 28 63 68 61 72 2a 29 70 44 61 74 61 29  , ((char*)pData)
11ec0 2d 34 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  -4, SQLITE_PAGE_
11ed0 53 49 5a 45 2b 34 29 3b 0a 20 20 20 20 20 20 54  SIZE+4);.      T
11ee0 52 41 43 45 32 28 22 53 54 4d 54 2d 4a 4f 55 52  RACE2("STMT-JOUR
11ef0 4e 41 4c 20 70 61 67 65 20 25 64 5c 6e 22 2c 20  NAL page %d\n", 
11f00 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
11f10 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20    CODEC(pPager, 
11f20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
11f30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
11f40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11f50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11f60 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
11f70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
11f80 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
11f90 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c  |= PAGER_ERR_FUL
11fa0 4c 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  L;.        retur
11fb0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
11fc0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
11fd0 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 61 73  NRec++;.      as
11fe0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
11ff0 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20  nStmt!=0 );.    
12000 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
12010 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
12020 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
12030 37 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  7);.    }.    pa
12040 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
12050 69 73 74 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20  ist(pPg);.  }.. 
12060 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64   /* Update the d
12070 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64  atabase size and
12080 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20   return..  */.  
12090 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
120a0 7a 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  ze<(int)pPg->pgn
120b0 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
120c0 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70  >dbSize = pPg->p
120d0 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  gno;.  }.  retur
120e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
120f0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
12100 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20  e page given in 
12110 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73  the argument was
12120 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73   previously pass
12130 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ed.** to sqlite3
12140 70 61 67 65 72 5f 77 72 69 74 65 28 29 2e 20 20  pager_write().  
12150 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
12160 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  return TRUE if i
12170 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68  t is ok.** to ch
12180 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  ange the content
12190 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   of the page..*/
121a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
121b0 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28 76 6f  r_iswriteable(vo
121c0 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67  id *pData){.  Pg
121d0 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f  Hdr *pPg = DATA_
121e0 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
121f0 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 64  .  return pPg->d
12200 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  irty;.}../*.** R
12210 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65  eplace the conte
12220 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70  nt of a single p
12230 61 67 65 20 77 69 74 68 20 74 68 65 20 69 6e 66  age with the inf
12240 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
12250 74 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  third.** argumen
12260 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
12270 33 70 61 67 65 72 5f 6f 76 65 72 77 72 69 74 65  3pager_overwrite
12280 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
12290 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20  Pgno pgno, void 
122a0 2a 70 44 61 74 61 29 7b 0a 20 20 76 6f 69 64 20  *pData){.  void 
122b0 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 63  *pPage;.  int rc
122c0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
122d0 33 70 61 67 65 72 5f 67 65 74 28 70 50 61 67 65  3pager_get(pPage
122e0 72 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65 29  r, pgno, &pPage)
122f0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
12300 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
12310 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  = sqlite3pager_w
12320 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20  rite(pPage);.   
12330 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12340 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  OK ){.      memc
12350 70 79 28 70 50 61 67 65 2c 20 70 44 61 74 61 2c  py(pPage, pData,
12360 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
12370 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  E);.    }.    sq
12380 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
12390 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  (pPage);.  }.  r
123a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
123b0 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69  ** A call to thi
123c0 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20  s routine tells 
123d0 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69  the pager that i
123e0 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  t is not necessa
123f0 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74  ry to.** write t
12400 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  he information o
12410 6e 20 70 61 67 65 20 22 70 67 6e 6f 22 20 62 61  n page "pgno" ba
12420 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20  ck to the disk, 
12430 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74  even though.** t
12440 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62  hat page might b
12450 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  e marked as dirt
12460 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65  y..**.** The ove
12470 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20  rlying software 
12480 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73  layer calls this
12490 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c   routine when al
124a0 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a  l of the data.**
124b0 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
124c0 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54  ge is unused.  T
124d0 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74  he pager marks t
124e0 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
124f0 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64   so.** that it d
12500 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74  oes not get writ
12510 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ten to disk..**.
12520 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68  ** Tests show th
12530 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  at this optimiza
12540 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77  tion, together w
12550 69 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  ith the.** sqlit
12560 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c  e3pager_dont_rol
12570 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d  lback() below, m
12580 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20  ore than double 
12590 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20  the speed.** of 
125a0 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65  large INSERT ope
125b0 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64  rations and quad
125c0 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20  ruple the speed 
125d0 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73  of large DELETEs
125e0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
125f0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
12600 6c 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c 77  led, set the alw
12610 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67  aysRollback flag
12620 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62   to true..** Sub
12630 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
12640 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f   sqlite3pager_do
12650 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f  nt_rollback() fo
12660 72 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a  r the same page.
12670 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74  ** will thereaft
12680 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20  er be ignored.  
12690 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
126a0 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f  y to avoid a pro
126b0 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20  blem.** where a 
126c0 70 61 67 65 20 77 69 74 68 20 64 61 74 61 20 69  page with data i
126d0 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  s added to the f
126e0 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f  reelist during o
126f0 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20  ne part of.** a 
12700 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e  transaction then
12710 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
12720 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e  e freelist durin
12730 67 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a  g a later part.*
12740 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72  * of the same tr
12750 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65  ansaction and re
12760 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74  used for some ot
12770 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68  her purpose.  Wh
12780 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73  en it.** is firs
12790 74 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  t added to the f
127a0 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f  reelist, this ro
127b0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
127c0 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a    When reused,.*
127d0 2a 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62  * the dont_rollb
127e0 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73  ack() routine is
127f0 20 63 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65   called.  But be
12800 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 63  cause the page c
12810 6f 6e 74 61 69 6e 73 0a 2a 2a 20 63 72 69 74 69  ontains.** criti
12820 63 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69  cal data, we sti
12830 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75  ll need to be su
12840 72 65 20 69 74 20 67 65 74 73 20 72 6f 6c 6c 65  re it gets rolle
12850 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65 0a  d back in spite.
12860 2a 2a 20 6f 66 20 74 68 65 20 64 6f 6e 74 5f 72  ** of the dont_r
12870 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a  ollback() call..
12880 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70  */.void sqlite3p
12890 61 67 65 72 5f 64 6f 6e 74 5f 77 72 69 74 65 28  ager_dont_write(
128a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
128b0 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
128c0 64 72 20 2a 70 50 67 3b 0a 0a 20 20 70 50 67 20  dr *pPg;..  pPg 
128d0 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
128e0 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
128f0 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
12900 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 70  ack = 1;.  if( p
12910 50 67 20 26 26 20 70 50 67 2d 3e 64 69 72 74 79  Pg && pPg->dirty
12920 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
12930 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74  er->dbSize==(int
12940 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50  )pPg->pgno && pP
12950 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
12960 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  <pPager->dbSize 
12970 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
12980 68 69 73 20 70 61 67 65 73 20 69 73 20 74 68 65  his pages is the
12990 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68   last page in th
129a0 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
129b0 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20  ile has grown.  
129c0 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68      ** during th
129d0 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
129e0 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e  ction, then do N
129f0 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  OT mark the page
12a00 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20   as clean..     
12a10 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74   ** When the dat
12a20 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73  abase file grows
12a30 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73  , we must make s
12a40 75 72 65 20 74 68 61 74 20 74 68 65 20 6c 61 73  ure that the las
12a50 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  t page.      ** 
12a60 67 65 74 73 20 77 72 69 74 74 65 6e 20 61 74 20  gets written at 
12a70 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68  least once so th
12a80 61 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  at the disk file
12a90 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72   will be the cor
12aa0 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69  rect.      ** si
12ab0 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f  ze. If you do no
12ac0 74 20 77 72 69 74 65 20 74 68 69 73 20 70 61 67  t write this pag
12ad0 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  e and the size o
12ae0 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20  f the file.     
12af0 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20   ** on the disk 
12b00 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f  ends up being to
12b10 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61  o small, that ca
12b20 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
12b30 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  se.      ** corr
12b40 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68  uption during th
12b50 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69  e next transacti
12b60 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
12b70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52   }else{.      TR
12b80 41 43 45 33 28 22 44 4f 4e 54 5f 57 52 49 54 45  ACE3("DONT_WRITE
12b90 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e   page %d of %d\n
12ba0 22 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65 72 2d  ", pgno, pPager-
12bb0 3e 66 64 2e 68 29 3b 0a 20 20 20 20 20 20 70 50  >fd.h);.      pP
12bc0 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
12bd0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
12be0 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20   A call to this 
12bf0 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68  routine tells th
12c00 65 20 70 61 67 65 72 20 74 68 61 74 20 69 66 20  e pager that if 
12c10 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
12c20 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20  s,.** it is not 
12c30 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72 65 73  necessary to res
12c40 74 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e  tore the data on
12c50 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e   the given page.
12c60 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20    This.** means 
12c70 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 64  that the pager d
12c80 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20  oes not have to 
12c90 72 65 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e  record the given
12ca0 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20   page in the.** 
12cb0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
12cc0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
12cd0 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c  3pager_dont_roll
12ce0 62 61 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61  back(void *pData
12cf0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
12d00 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
12d10 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20  pData);.  Pager 
12d20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
12d30 50 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 70 50  Pager;..  if( pP
12d40 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
12d50 45 52 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20  ER_EXCLUSIVE || 
12d60 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
12d70 70 65 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pen==0 ) return;
12d80 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61  .  if( pPg->alwa
12d90 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50  ysRollback || pP
12da0 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
12db0 62 61 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  back || pPager->
12dc0 6d 65 6d 44 62 20 29 20 72 65 74 75 72 6e 3b 0a  memDb ) return;.
12dd0 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f    if( !pPg->inJo
12de0 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50  urnal && (int)pP
12df0 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65  g->pgno <= pPage
12e00 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
12e10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
12e20 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21  ger->aInJournal!
12e30 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
12e40 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67  ->aInJournal[pPg
12e50 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
12e60 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
12e70 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
12e80 6c 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  l = 1;.    if( p
12e90 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
12ea0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
12eb0 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70  ->aInStmt[pPg->p
12ec0 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
12ed0 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
12ee0 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
12ef0 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
12f00 20 20 7d 0a 20 20 20 20 54 52 41 43 45 33 28 22    }.    TRACE3("
12f10 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61  DONT_ROLLBACK pa
12f20 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  ge %d of %d\n", 
12f30 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 61 67 65  pPg->pgno, pPage
12f40 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 7d 0a 20 20  r->fd.h);.  }.  
12f50 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
12f60 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69  InUse && !pPg->i
12f70 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50  nStmt && (int)pP
12f80 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  g->pgno<=pPager-
12f90 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20  >stmtSize ){.   
12fa0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
12fb0 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29  Journal || (int)
12fc0 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
12fd0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a  ->origDbSize );.
12fe0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
12ff0 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29  er->aInStmt!=0 )
13000 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
13010 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
13020 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
13030 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 61 67 65  gno&7);.    page
13040 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
13050 74 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  t(pPg);.  }.}...
13060 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50 67  /*.** Clear a Pg
13070 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f  History block.*/
13080 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65  .static void cle
13090 61 72 48 69 73 74 6f 72 79 28 50 67 48 69 73 74  arHistory(PgHist
130a0 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a 20 20 73  ory *pHist){.  s
130b0 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d  qliteFree(pHist-
130c0 3e 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74  >pOrig);.  sqlit
130d0 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74  eFree(pHist->pSt
130e0 6d 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f  mt);.  pHist->pO
130f0 72 69 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74  rig = 0;.  pHist
13100 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a  ->pStmt = 0;.}..
13110 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c  /*.** Commit all
13120 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
13130 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c  database and rel
13140 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
13150 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
13160 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66  e commit fails f
13170 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61  or any reason, a
13180 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70   rollback attemp
13190 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64  t is made.** and
131a0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
131b0 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20  s returned.  If 
131c0 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65  the commit worke
131d0 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  d, SQLITE_OK.** 
131e0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
131f0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
13200 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70  _commit(Pager *p
13210 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
13220 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
13230 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
13240 72 72 4d 61 73 6b 3d 3d 50 41 47 45 52 5f 45 52  rrMask==PAGER_ER
13250 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63  R_FULL ){.    rc
13260 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
13270 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
13280 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
13290 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
132a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
132b0 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  L;.    }.    ret
132c0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
132d0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
132e0 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  k!=0 ){.    rc =
132f0 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70   pager_errcode(p
13300 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
13310 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
13320 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50   pPager->state<P
13330 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
13340 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13350 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
13360 54 52 41 43 45 32 28 22 43 4f 4d 4d 49 54 20 25  TRACE2("COMMIT %
13370 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64  d\n", pPager->fd
13380 2e 68 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  .h);.  if( pPage
13390 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
133a0 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f  pPg = pager_get_
133b0 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28  all_dirty_pages(
133c0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 77 68 69  pPager);.    whi
133d0 6c 65 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20  le( pPg ){.     
133e0 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 47   clearHistory(PG
133f0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
13400 20 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20   pPager));.     
13410 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
13420 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
13430 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
13440 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pPg->inStmt = 0
13450 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72  ;.      pPg->pPr
13460 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e  evStmt = pPg->pN
13470 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  extStmt = 0;.   
13480 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 44     pPg = pPg->pD
13490 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  irty;.    }.    
134a0 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
134b0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
134c0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
134d0 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  RED;.    return 
134e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
134f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 69 72   if( pPager->dir
13500 74 79 43 61 63 68 65 3d 3d 30 20 29 7b 0a 20 20  tyCache==0 ){.  
13510 20 20 2f 2a 20 45 78 69 74 20 65 61 72 6c 79 20    /* Exit early 
13520 28 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 74  (without doing t
13530 68 65 20 74 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e  he time-consumin
13540 67 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  g sqlite3OsSync(
13550 29 20 63 61 6c 6c 73 29 0a 20 20 20 20 2a 2a 20  ) calls).    ** 
13560 69 66 20 74 68 65 72 65 20 68 61 76 65 20 62 65  if there have be
13570 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f  en no changes to
13580 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13590 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  le. */.    asser
135a0 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
135b0 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  ync==0 );.    rc
135c0 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
135d0 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
135e0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
135f0 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72   = -1;.    retur
13600 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
13610 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
13620 6e 61 6c 4f 70 65 6e 20 29 3b 0a 23 69 66 20 30  nalOpen );.#if 0
13630 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72  .  rc = syncJour
13640 6e 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  nal(pPager, 0);.
13650 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13660 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
13670 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20  commit_abort;.  
13680 7d 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  }.  pPg = pager_
13690 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
136a0 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ges(pPager);.  i
136b0 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 72 63  f( pPg ){.    rc
136c0 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
136d0 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  agelist(pPg);.  
136e0 20 20 69 66 28 20 72 63 20 7c 7c 20 28 21 70 50    if( rc || (!pP
136f0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20  ager->noSync && 
13700 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 26 70  sqlite3OsSync(&p
13710 50 61 67 65 72 2d 3e 66 64 29 21 3d 53 51 4c 49  Pager->fd)!=SQLI
13720 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20  TE_OK) ){.      
13730 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72  goto commit_abor
13740 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  t;.    }.  }.#en
13750 64 69 66 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  dif.  rc = sqlit
13760 65 33 70 61 67 65 72 5f 73 79 6e 63 28 70 50 61  e3pager_sync(pPa
13770 67 65 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ger, 0);.  if( r
13780 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
13790 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f      goto commit_
137a0 61 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 63 20  abort;.  }.  rc 
137b0 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
137c0 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 70  ock(pPager);.  p
137d0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
137e0 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  -1;.  return rc;
137f0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
13800 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
13810 73 20 77 72 6f 6e 67 20 64 75 72 69 6e 67 20 74  s wrong during t
13820 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  he commit proces
13830 73 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61  s..  */.commit_a
13840 62 6f 72 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c  bort:.  rc = sql
13850 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
13860 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ck(pPager);.  if
13870 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13880 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
13890 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72  TE_FULL;.  }.  r
138a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
138b0 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20  ** Rollback all 
138c0 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61  changes.  The da
138d0 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63  tabase falls bac
138e0 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45  k to PAGER_SHARE
138f0 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69  D mode..** All i
13900 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70  n-memory cache p
13910 61 67 65 73 20 72 65 76 65 72 74 20 74 6f 20 74  ages revert to t
13920 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61  heir original da
13930 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20  ta contents..** 
13940 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64  The journal is d
13950 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
13960 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f  is routine canno
13970 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f  t fail unless so
13980 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
13990 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e   is not followin
139a0 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74  g.** the correct
139b0 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f   locking protoco
139c0 6c 20 28 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  l (SQLITE_PROTOC
139d0 4f 4c 29 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f  OL) or unless so
139e0 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63  me other.** proc
139f0 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 20 74  ess is writing t
13a00 72 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f  rash into the jo
13a10 75 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49  urnal file (SQLI
13a20 54 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a  TE_CORRUPT) or.*
13a30 2a 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72  * unless a prior
13a40 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64   malloc() failed
13a50 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e   (SQLITE_NOMEM).
13a60 20 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 72    Appropriate er
13a70 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65  ror.** codes are
13a80 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c   returned for al
13a90 6c 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e  l these occasion
13aa0 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  s.  Otherwise,.*
13ab0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
13ac0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
13ad0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
13ae0 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
13af0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
13b00 20 20 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41    TRACE2("ROLLBA
13b10 43 4b 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  CK %d\n", pPager
13b20 2d 3e 66 64 2e 68 29 3b 0a 20 20 69 66 28 20 70  ->fd.h);.  if( p
13b30 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
13b40 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20      PgHdr *p;.  
13b50 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e    for(p=pPager->
13b60 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  pAll; p; p=p->pN
13b70 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50  extAll){.      P
13b80 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b  gHistory *pHist;
13b90 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 64  .      if( !p->d
13ba0 69 72 74 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b  irty ) continue;
13bb0 0a 20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50  .      pHist = P
13bc0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20  GHDR_TO_HIST(p, 
13bd0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
13be0 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  f( pHist->pOrig 
13bf0 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
13c00 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
13c10 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  p), pHist->pOrig
13c20 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
13c30 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41  ze);.        TRA
13c40 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41  CE2("ROLLBACK-PA
13c50 47 45 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e  GE %d\n", p->pgn
13c60 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  o);.      }else{
13c70 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 32 28  .        TRACE2(
13c80 22 50 41 47 45 20 25 64 20 69 73 20 63 6c 65 61  "PAGE %d is clea
13c90 6e 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 29 3b 0a  n\n", p->pgno);.
13ca0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c        }.      cl
13cb0 65 61 72 48 69 73 74 6f 72 79 28 70 48 69 73 74  earHistory(pHist
13cc0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 72 74  );.      p->dirt
13cd0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  y = 0;.      p->
13ce0 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
13cf0 20 20 20 20 20 70 2d 3e 69 6e 53 74 6d 74 20 3d       p->inStmt =
13d00 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72   0;.      p->pPr
13d10 65 76 53 74 6d 74 20 3d 20 70 2d 3e 70 4e 65 78  evStmt = p->pNex
13d20 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d  tStmt = 0;.    }
13d30 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
13d40 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  mt = 0;.    pPag
13d50 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
13d60 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b  ger->origDbSize;
13d70 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63  .    memoryTrunc
13d80 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ate(pPager);.   
13d90 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
13da0 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  se = 0;.    pPag
13db0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
13dc0 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65  R_SHARED;.    re
13dd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13de0 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67    }..  if( !pPag
13df0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c  er->dirtyCache |
13e00 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  | !pPager->journ
13e10 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63  alOpen ){.    rc
13e20 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
13e30 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
13e40 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
13e50 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72   = -1;.    retur
13e60 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
13e70 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
13e80 21 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65  !=0 && pPager->e
13e90 72 72 4d 61 73 6b 21 3d 50 41 47 45 52 5f 45 52  rrMask!=PAGER_ER
13ea0 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66  R_FULL ){.    if
13eb0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
13ec0 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
13ed0 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
13ee0 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
13ef0 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   1);.    }.    r
13f00 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63  eturn pager_errc
13f10 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ode(pPager);.  }
13f20 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
13f30 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
13f40 52 56 45 44 20 29 7b 0a 20 20 20 20 69 6e 74 20  RVED ){.    int 
13f50 72 63 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rc2;.    rc = pa
13f60 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65  ger_reload_cache
13f70 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63  (pPager);.    rc
13f80 32 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74  2 = pager_unwrit
13f90 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
13fa0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13fb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
13fc0 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20   = rc2;.    }.  
13fd0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
13fe0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
13ff0 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 7d 0a 20  Pager, 1);.  }. 
14000 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14010 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  OK ){.    rc = S
14020 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
14030 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61     pPager->errMa
14040 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f  sk |= PAGER_ERR_
14050 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20 70  CORRUPT;.  }.  p
14060 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
14070 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  -1;.  return rc;
14080 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
14090 20 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74   TRUE if the dat
140a0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70  abase file is op
140b0 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20  ened read-only. 
140c0 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a   Return FALSE.**
140d0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
140e0 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20   is (in theory) 
140f0 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74  writable..*/.int
14100 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73   sqlite3pager_is
14110 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a  readonly(Pager *
14120 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
14130 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  n pPager->readOn
14140 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ly;.}../*.** Thi
14150 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
14160 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
14170 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
14180 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33  .*/.int *sqlite3
14190 70 61 67 65 72 5f 73 74 61 74 73 28 50 61 67 65  pager_stats(Page
141a0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74  r *pPager){.  st
141b0 61 74 69 63 20 69 6e 74 20 61 5b 39 5d 3b 0a 20  atic int a[9];. 
141c0 20 61 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[0] = pPager->
141d0 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70  nRef;.  a[1] = p
141e0 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20  Pager->nPage;.  
141f0 61 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d  a[2] = pPager->m
14200 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20  xPage;.  a[3] = 
14210 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
14220 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d    a[4] = pPager-
14230 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d  >state;.  a[5] =
14240 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
14250 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65  ;.  a[6] = pPage
14260 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20  r->nHit;.  a[7] 
14270 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b  = pPager->nMiss;
14280 0a 20 20 61 5b 38 5d 20 3d 20 70 50 61 67 65 72  .  a[8] = pPager
14290 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 72 65 74 75 72  ->nOvfl;.  retur
142a0 6e 20 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n a;.}../*.** Se
142b0 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
142c0 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a  rollback point..
142d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
142e0 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  ne should be cal
142f0 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 72 61  led with the tra
14300 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
14310 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e   already.** open
14320 2e 20 20 41 20 6e 65 77 20 73 74 61 74 65 6d 65  .  A new stateme
14330 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72  nt journal is cr
14340 65 61 74 65 64 20 74 68 61 74 20 63 61 6e 20 62  eated that can b
14350 65 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61  e used to rollba
14360 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66  ck.** changes of
14370 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f   a single SQL co
14380 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20 6c  mmand within a l
14390 61 72 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f  arger transactio
143a0 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
143b0 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67 69  3pager_stmt_begi
143c0 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  n(Pager *pPager)
143d0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  {.  int rc;.  ch
143e0 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f  ar zTemp[SQLITE_
143f0 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a  TEMPNAME_SIZE];.
14400 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
14410 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a  r->stmtInUse );.
14420 20 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d 42    TRACE2("STMT-B
14430 45 47 49 4e 20 25 64 5c 6e 22 2c 20 70 50 61 67  EGIN %d\n", pPag
14440 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 69 66 28  er->fd.h);.  if(
14450 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29   pPager->memDb )
14460 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  {.    pPager->st
14470 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 20  mtInUse = 1;.   
14480 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
14490 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
144a0 7a 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ze;.    return S
144b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
144c0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  if( !pPager->jou
144d0 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
144e0 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
144f0 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65  open = 1;.    re
14500 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14510 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
14520 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
14530 6e 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  n );.  pPager->a
14540 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d  InStmt = sqliteM
14550 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64  alloc( pPager->d
14560 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20  bSize/8 + 1 );. 
14570 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
14580 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Stmt==0 ){.    s
14590 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50  qlite3OsLock(&pP
145a0 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44  ager->fd, SHARED
145b0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 72 65 74 75  _LOCK);.    retu
145c0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
145d0 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45  .  }.#ifndef NDE
145e0 42 55 47 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  BUG.  rc = sqlit
145f0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50  e3OsFileSize(&pP
14600 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67  ager->jfd, &pPag
14610 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a  er->stmtJSize);.
14620 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
14630 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65  stmt_begin_faile
14640 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  d;.  assert( pPa
14650 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
14660 3d 20 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  = .    pPager->n
14670 52 65 63 2a 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  Rec*JOURNAL_PG_S
14680 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52  Z(pPager) + JOUR
14690 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
146a0 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70  r) );.#endif.  p
146b0 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
146c0 20 3d 0a 20 20 20 20 20 70 50 61 67 65 72 2d 3e   =.     pPager->
146d0 6e 52 65 63 2a 4a 4f 55 52 4e 41 4c 5f 50 47 5f  nRec*JOURNAL_PG_
146e0 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55  SZ(pPager) + JOU
146f0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
14700 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  er);.  pPager->s
14710 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72  tmtSize = pPager
14720 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 69 66 28 20  ->dbSize;.  if( 
14730 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65  !pPager->stmtOpe
14740 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  n ){.    rc = sq
14750 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74  lite3pager_opent
14760 65 6d 70 28 7a 54 65 6d 70 2c 20 26 70 50 61 67  emp(zTemp, &pPag
14770 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 69  er->stfd);.    i
14780 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d  f( rc ) goto stm
14790 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a  t_begin_failed;.
147a0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
147b0 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50  Open = 1;.    pP
147c0 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d  ager->stmtNRec =
147d0 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   0;.  }.  pPager
147e0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b  ->stmtInUse = 1;
147f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14800 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69  _OK;. .stmt_begi
14810 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  n_failed:.  if( 
14820 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
14830 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
14840 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  e(pPager->aInStm
14850 74 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  t);.    pPager->
14860 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d  aInStmt = 0;.  }
14870 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14880 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20  ./*.** Commit a 
14890 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e  statement..*/.in
148a0 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  t sqlite3pager_s
148b0 74 6d 74 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72  tmt_commit(Pager
148c0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
148d0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
148e0 73 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  se ){.    PgHdr 
148f0 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  *pPg, *pNext;.  
14900 20 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d 43    TRACE2("STMT-C
14910 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 70 50 61  OMMIT %d\n", pPa
14920 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20 20  ger->fd.h);.    
14930 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d  if( !pPager->mem
14940 44 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  Db ){.      sqli
14950 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65  te3OsSeek(&pPage
14960 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20  r->stfd, 0);.   
14970 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54     /* sqlite3OsT
14980 72 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d  runcate(&pPager-
14990 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20  >stfd, 0); */.  
149a0 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 20      sqliteFree( 
149b0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
149c0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
149d0 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  >aInStmt = 0;.  
149e0 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 50 67 3d    }.    for(pPg=
149f0 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70  pPager->pStmt; p
14a00 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a  Pg; pPg=pNext){.
14a10 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50        pNext = pP
14a20 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20  g->pNextStmt;.  
14a30 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
14a40 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20  >inStmt );.     
14a50 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pPg->inStmt = 0
14a60 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72  ;.      pPg->pPr
14a70 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e  evStmt = pPg->pN
14a80 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  extStmt = 0;.   
14a90 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d     if( pPager->m
14aa0 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20  emDb ){.        
14ab0 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
14ac0 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
14ad0 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
14ae0 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
14af0 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b  e(pHist->pStmt);
14b00 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e  .        pHist->
14b10 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  pStmt = 0;.     
14b20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61   }.    }.    pPa
14b30 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20  ger->stmtNRec = 
14b40 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
14b50 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20  tmtInUse = 0;.  
14b60 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
14b70 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 0;.  }.  pPage
14b80 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
14b90 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 0;.  return SQ
14ba0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
14bb0 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61  * Rollback a sta
14bc0 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  tement..*/.int s
14bd0 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74  qlite3pager_stmt
14be0 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  _rollback(Pager 
14bf0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
14c00 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  rc;.  if( pPager
14c10 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
14c20 20 20 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d     TRACE2("STMT-
14c30 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20  ROLLBACK %d\n", 
14c40 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20  pPager->fd.h);. 
14c50 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d     if( pPager->m
14c60 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 50 67  emDb ){.      Pg
14c70 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20  Hdr *pPg;.      
14c80 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
14c90 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d  pStmt; pPg; pPg=
14ca0 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b  pPg->pNextStmt){
14cb0 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f  .        PgHisto
14cc0 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
14cd0 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
14ce0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
14cf0 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  if( pHist->pStmt
14d00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
14d10 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41  mcpy(PGHDR_TO_DA
14d20 54 41 28 70 50 67 29 2c 20 70 48 69 73 74 2d 3e  TA(pPg), pHist->
14d30 70 53 74 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70  pStmt, pPager->p
14d40 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
14d50 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
14d60 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Hist->pStmt);.  
14d70 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
14d80 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
14d90 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
14da0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
14db0 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53   = pPager->stmtS
14dc0 69 7a 65 3b 0a 20 20 20 20 20 20 6d 65 6d 6f 72  ize;.      memor
14dd0 79 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  yTruncate(pPager
14de0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
14df0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
14e00 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
14e10 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61  ager_stmt_playba
14e20 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
14e30 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67  }.    sqlite3pag
14e40 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70  er_stmt_commit(p
14e50 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Pager);.  }else{
14e60 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
14e70 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  _OK;.  }.  pPage
14e80 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
14e90 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
14ea0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
14eb0 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
14ec0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
14ed0 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  ase file..*/.con
14ee0 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
14ef0 70 61 67 65 72 5f 66 69 6c 65 6e 61 6d 65 28 50  pager_filename(P
14f00 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
14f10 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
14f20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  zFilename;.}../*
14f30 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64 65  .** Set the code
14f40 63 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  c for this pager
14f50 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
14f60 70 61 67 65 72 5f 73 65 74 5f 63 6f 64 65 63 28  pager_set_codec(
14f70 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
14f80 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  ,.  void (*xCode
14f90 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
14fa0 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64  gno,int),.  void
14fb0 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20   *pCodecArg.){. 
14fc0 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20   pPager->xCodec 
14fd0 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67  = xCodec;.  pPag
14fe0 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d 20  er->pCodecArg = 
14ff0 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 0a 2f 2a  pCodecArg;.}../*
15000 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74  .** Sync the dat
15010 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
15020 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e  he pager pPager.
15030 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
15040 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f  to the name.** o
15050 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
15060 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
15070 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
15080 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75  nto the individu
15090 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  al.** journal fi
150a0 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  le. zMaster may 
150b0 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69  be NULL, which i
150c0 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
150d0 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f   no master.** jo
150e0 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20  urnal (a single 
150f0 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
15100 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tion)..**.** Thi
15110 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65  s routine ensure
15120 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  s that the journ
15130 61 6c 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c  al is synced, al
15140 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 77 72  l dirty pages wr
15150 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20  itten.** to the 
15160 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
15170 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
15180 69 6c 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20  ile synced. The 
15190 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a  only thing that.
151a0 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f  ** remains to co
151b0 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
151c0 74 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74  tion is to delet
151d0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
151e0 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72  le (or.** master
151f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
15200 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a   specified)..**.
15210 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20  ** Note that if 
15220 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74  zMaster==NULL, t
15230 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65  his does not ove
15240 72 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75  rwrite a previou
15250 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65  s value.** passe
15260 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 70  d to an sqlite3p
15270 61 67 65 72 5f 73 79 6e 63 28 29 20 63 61 6c 6c  ager_sync() call
15280 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15290 70 61 67 65 72 5f 73 79 6e 63 28 50 61 67 65 72  pager_sync(Pager
152a0 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
152b0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
152c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
152d0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  E_OK;..  /* If t
152e0 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  his is an in-mem
152f0 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61  ory db, or no pa
15300 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72  ges have been wr
15310 69 74 74 65 6e 20 74 6f 2c 20 74 68 69 73 0a 20  itten to, this. 
15320 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20   ** function is 
15330 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
15340 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d  if( !pPager->mem
15350 44 62 20 26 26 20 70 50 61 67 65 72 2d 3e 64 69  Db && pPager->di
15360 72 74 79 43 61 63 68 65 20 29 7b 0a 20 20 20 20  rtyCache ){.    
15370 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20  PgHdr *pPg;.    
15380 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
15390 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a  journalOpen );..
153a0 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
153b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
153c0 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75      rc = syncJou
153d0 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61  rnal(pPager, zMa
153e0 73 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ster);.    if( r
153f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
15400 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a  oto sync_exit;..
15410 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c      /* Write all
15420 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
15430 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15440 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70  e */.    pPg = p
15450 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
15460 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29  ty_pages(pPager)
15470 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
15480 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
15490 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pPg);.    if( rc
154a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
154b0 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 20  to sync_exit;.. 
154c0 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 70 61 67     /* If any pag
154d0 65 73 20 77 65 72 65 20 61 63 74 75 61 6c 6c 79  es were actually
154e0 20 77 72 69 74 74 65 6e 2c 20 73 79 6e 63 20 74   written, sync t
154f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15500 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 20   */.    if( pPg 
15510 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
15520 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nc ){.      rc =
15530 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 26   sqlite3OsSync(&
15540 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
15550 20 7d 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78 69   }.  }..sync_exi
15560 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t:.  return rc;.
15570 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
15580 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  _DEBUG./*.** Ret
15590 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
155a0 73 74 61 74 65 20 6f 66 20 74 68 65 20 66 69 6c  state of the fil
155b0 65 20 6c 6f 63 6b 20 66 6f 72 20 74 68 65 20 67  e lock for the g
155c0 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 54  iven pager..** T
155d0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
155e0 69 73 20 6f 6e 65 20 6f 66 20 4e 4f 5f 4c 4f 43  is one of NO_LOC
155f0 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20  K, SHARED_LOCK, 
15600 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 2c 0a 2a  RESERVED_LOCK,.*
15610 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 2c 20  * PENDING_LOCK, 
15620 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  or EXCLUSIVE_LOC
15630 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
15640 33 70 61 67 65 72 5f 6c 6f 63 6b 73 74 61 74 65  3pager_lockstate
15650 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
15660 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
15670 2d 3e 66 64 2e 6c 6f 63 6b 74 79 70 65 3b 0a 7d  ->fd.locktype;.}
15680 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
15690 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
156a0 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e  * Print a listin
156b0 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e  g of all referen
156c0 63 65 64 20 70 61 67 65 73 20 61 6e 64 20 74 68  ced pages and th
156d0 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a  eir ref count..*
156e0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
156f0 67 65 72 5f 72 65 66 64 75 6d 70 28 50 61 67 65  ger_refdump(Page
15700 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
15710 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28  Hdr *pPg;.  for(
15720 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
15730 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
15740 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69  pNextAll){.    i
15750 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20  f( pPg->nRef<=0 
15760 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
15770 70 72 69 6e 74 66 28 22 50 41 47 45 20 25 33 64  printf("PAGE %3d
15780 20 61 64 64 72 3d 30 78 25 30 38 78 20 6e 52 65   addr=0x%08x nRe
15790 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  f=%d\n", .      
157a0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 69 6e 74   pPg->pgno, (int
157b0 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
157c0 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b  Pg), pPg->nRef);
157d0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a        .  }.}.#endif.