/ Hex Artifact Content
Login

Artifact 778379c031daa20d134a934d5753c19b606c10db:


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: 31 20 32 30 30 34 2f 30 36 2f 31 30 20 30 34 3a  1 2004/06/10 04:
0360: 33 32 3a 31 37 20 64 61 6e 69 65 6c 6b 31 39 37  32:17 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 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69  ..  **.  ** If i
4ee0: 6e 20 45 58 43 4c 55 53 49 56 45 20 73 74 61 74  n EXCLUSIVE stat
4ef0: 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74  e, then we updat
4f00: 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  e the pager cach
4f10: 65 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 20  e if it exists. 
4f20: 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e   ** and the main
4f30: 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
4f40: 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e  is then marked n
4f50: 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20  ot dirty..  */. 
4f60: 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
4f70: 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
4f80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
4f90: 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
4fa0: 52 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70  R_EXCLUSIVE || p
4fb0: 50 67 20 29 3b 0a 20 20 54 52 41 43 45 32 28 22  Pg );.  TRACE2("
4fc0: 50 4c 41 59 42 41 43 4b 20 70 61 67 65 20 25 64  PLAYBACK page %d
4fd0: 5c 6e 22 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  \n", pgno);.  if
4fe0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
4ff0: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
5000: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
5010: 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66  sSeek(&pPager->f
5020: 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 6f 66 66  d, (pgno-1)*(off
5030: 5f 74 29 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  _t)SQLITE_PAGE_S
5040: 49 5a 45 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  IZE);.    rc = s
5050: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70  qlite3OsWrite(&p
5060: 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61 74 61  Pager->fd, aData
5070: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
5080: 5a 45 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ZE);.  }.  if( p
5090: 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  Pg ){.    /* No 
50a0: 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72  page should ever
50b0: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
50c0: 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20  that is in use, 
50d0: 65 78 63 65 70 74 20 66 6f 72 20 70 61 67 65 0a  except for page.
50e0: 20 20 20 20 2a 2a 20 31 20 77 68 69 63 68 20 69      ** 1 which i
50f0: 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e  s held in use in
5100: 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
5110: 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  he lock on the d
5120: 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 61  atabase.    ** a
5130: 63 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ctive..    */.  
5140: 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20    void *pData;. 
5150: 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
5160: 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e  nRef==0 || pPg->
5170: 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 70  pgno==1 );.    p
5180: 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Data = PGHDR_TO_
5190: 44 41 54 41 28 70 50 67 29 3b 0a 20 20 20 20 6d  DATA(pPg);.    m
51a0: 65 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44 61  emcpy(pData, aDa
51b0: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
51c0: 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Size);.    if( p
51d0: 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
51e0: 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  or ){.      pPag
51f0: 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28  er->xDestructor(
5200: 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
5210: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
5220: 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
5230: 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65   0;.    pPg->nee
5240: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 43  dSync = 0;.    C
5250: 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61  ODEC(pPager, pDa
5260: 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  ta, pPg->pgno, 3
5270: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
5280: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  rc;.}../*.** Par
5290: 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69  ameter zMaster i
52a0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
52b0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
52c0: 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f  ile. A single jo
52d0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68  urnal.** file th
52e0: 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74  at referred to t
52f0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
5300: 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20  l file has just 
5310: 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
5320: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
5330: 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69  e checks if it i
5340: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
5350: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
5360: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a  journal file,.**
5370: 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20   and does so if 
5380: 69 74 20 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  it is..*/.static
5390: 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61   int pager_delma
53a0: 73 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20  ster(const char 
53b0: 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
53c0: 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65   rc;.  int maste
53d0: 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f 73  r_open = 0;.  Os
53e0: 46 69 6c 65 20 6d 61 73 74 65 72 3b 0a 20 20 63  File master;.  c
53f0: 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72  har *zMasterJour
5400: 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74  nal = 0; /* Cont
5410: 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a  ents of master j
5420: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
5430: 20 6f 66 66 5f 74 20 6e 4d 61 73 74 65 72 4a 6f   off_t nMasterJo
5440: 75 72 6e 61 6c 3b 20 20 20 20 20 2f 2a 20 53 69  urnal;     /* Si
5450: 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ze of master jou
5460: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  rnal file */..  
5470: 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74  /* Open the mast
5480: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
5490: 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63  exclusively in c
54a0: 61 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  ase some other p
54b0: 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72  rocess.  ** is r
54c0: 75 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74  unning this rout
54d0: 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68  ine also. Not th
54e0: 61 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20  at it makes too 
54f0: 6d 75 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e  much difference.
5500: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
5510: 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73  ite3OsOpenExclus
5520: 69 76 65 28 7a 4d 61 73 74 65 72 2c 20 26 6d 61  ive(zMaster, &ma
5530: 73 74 65 72 2c 20 30 29 3b 0a 20 20 69 66 28 20  ster, 0);.  if( 
5540: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
5550: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
5560: 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65  ut;.  master_ope
5570: 6e 20 3d 20 31 3b 0a 0a 20 20 72 63 20 3d 20 73  n = 1;..  rc = s
5580: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
5590: 28 26 6d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74  (&master, &nMast
55a0: 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  erJournal);.  if
55b0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
55c0: 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
55d0: 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61  _out;..  if( nMa
55e0: 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b  sterJournal>0 ){
55f0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62 3b 0a  .    char *zDb;.
5600: 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e      zMasterJourn
5610: 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  al = (char *)sql
5620: 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65  iteMalloc(nMaste
5630: 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69  rJournal);.    i
5640: 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  f( !zMasterJourn
5650: 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  al ){.      rc =
5660: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
5670: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
5680: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ter_out;.    }. 
5690: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
56a0: 73 52 65 61 64 28 26 6d 61 73 74 65 72 2c 20 7a  sRead(&master, z
56b0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e  MasterJournal, n
56c0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
56d0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
56e0: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
56f0: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20  master_out;..   
5700: 20 7a 44 62 20 3d 20 7a 4d 61 73 74 65 72 4a 6f   zDb = zMasterJo
5710: 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65  urnal;.    while
5720: 28 20 28 7a 44 62 2d 7a 4d 61 73 74 65 72 4a 6f  ( (zDb-zMasterJo
5730: 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f  urnal)<nMasterJo
5740: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 63  urnal ){.      c
5750: 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 20 3d 20  har *zJournal = 
5760: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
5770: 53 65 74 53 74 72 69 6e 67 28 26 7a 4a 6f 75 72  SetString(&zJour
5780: 6e 61 6c 2c 20 7a 44 62 2c 20 22 2d 6a 6f 75 72  nal, zDb, "-jour
5790: 6e 61 6c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  nal", 0);.      
57a0: 69 66 28 20 21 7a 4a 6f 75 72 6e 61 6c 20 29 7b  if( !zJournal ){
57b0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
57c0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
57d0: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
57e0: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
57f0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
5800: 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4a  3OsFileExists(zJ
5810: 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20  ournal) ){.     
5820: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
5830: 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65   journals pointe
5840: 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74  d to by the mast
5850: 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  er journal exist
5860: 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70  s..        ** Op
5870: 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20  en it and check 
5880: 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  if it points at 
5890: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
58a0: 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a  al. If.        *
58b0: 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74  * so, return wit
58c0: 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68  hout deleting th
58d0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
58e0: 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
58f0: 2f 0a 20 20 20 20 20 20 20 20 4f 73 46 69 6c 65  /.        OsFile
5900: 20 6a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 20 20   journal;.      
5910: 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b 0a 20    int nMaster;. 
5920: 20 20 20 20 20 20 20 6f 66 66 5f 74 20 6a 73 7a         off_t jsz
5930: 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ;..        rc = 
5940: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
5950: 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61 6c 2c 20  dOnly(zJournal, 
5960: 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  &journal);.     
5970: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4a     sqliteFree(zJ
5980: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  ournal);.       
5990: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
59a0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
59b0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
59c0: 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  journal);.      
59d0: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
59e0: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
59f0: 7d 0a 0a 09 2f 2a 20 43 68 65 63 6b 20 69 66 20  }.../* Check if 
5a00: 74 68 65 20 66 69 6c 65 20 69 73 20 62 69 67 20  the file is big 
5a10: 65 6e 6f 75 67 68 20 74 6f 20 62 65 20 61 20 6a  enough to be a j
5a20: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20  ournal file.    
5a30: 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20      ** with the 
5a40: 72 65 71 75 69 72 65 64 20 6d 61 73 74 65 72 20  required master 
5a50: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 49 66  journal name. If
5a60: 20 6e 6f 74 2c 20 69 67 6e 6f 72 65 20 69 74 2e   not, ignore it.
5a70: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
5a80: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
5a90: 4f 73 46 69 6c 65 53 69 7a 65 28 26 6a 6f 75 72  OsFileSize(&jour
5aa0: 6e 61 6c 2c 20 26 6a 73 7a 29 3b 0a 20 20 20 20  nal, &jsz);.    
5ab0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
5ac0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
5ad0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
5ae0: 65 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  e(&journal);.   
5af0: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
5b00: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
5b10: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
5b20: 20 6a 73 7a 3c 28 32 35 2b 73 74 72 6c 65 6e 28   jsz<(25+strlen(
5b30: 7a 4d 61 73 74 65 72 29 29 20 29 7b 0a 20 20 20  zMaster)) ){.   
5b40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
5b50: 43 6c 6f 73 65 28 26 6a 6f 75 72 6e 61 6c 29 3b  Close(&journal);
5b60: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
5b70: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
5b80: 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
5b90: 2f 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 70  /* Seek to the p
5ba0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  oint in the jour
5bb0: 6e 61 6c 20 77 68 65 72 65 20 74 68 65 20 6d 61  nal where the ma
5bc0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
5bd0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  e.        ** is 
5be0: 73 74 6f 72 65 64 2e 20 52 65 61 64 20 74 68 65  stored. Read the
5bf0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5c00: 6e 61 6d 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  name into memory
5c10: 20 6f 62 74 61 69 6e 65 64 0a 20 20 20 20 20 20   obtained.      
5c20: 20 20 2a 2a 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63    ** from malloc
5c30: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
5c40: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
5c50: 33 4f 73 53 65 65 6b 28 26 6a 6f 75 72 6e 61 6c  3OsSeek(&journal
5c60: 2c 20 32 30 29 3b 0a 20 20 20 20 20 20 20 20 69  , 20);.        i
5c70: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
5c80: 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
5c90: 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 72  r_out;.        r
5ca0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 26  c = read32bits(&
5cb0: 6a 6f 75 72 6e 61 6c 2c 20 28 75 33 32 2a 29 26  journal, (u32*)&
5cc0: 6e 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  nMaster);.      
5cd0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5ce0: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
5cf0: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
5d00: 20 20 69 66 28 20 6e 4d 61 73 74 65 72 3e 30 20    if( nMaster>0 
5d10: 26 26 20 6e 4d 61 73 74 65 72 3e 3d 73 74 72 6c  && nMaster>=strl
5d20: 65 6e 28 7a 4d 61 73 74 65 72 29 2b 31 20 29 7b  en(zMaster)+1 ){
5d30: 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
5d40: 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 28 63  *zMasterPtr = (c
5d50: 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c  har *)sqliteMall
5d60: 6f 63 28 6e 4d 61 73 74 65 72 29 3b 0a 20 20 20  oc(nMaster);.   
5d70: 20 20 20 20 20 20 20 69 66 28 20 21 7a 4d 61 73         if( !zMas
5d80: 74 65 72 50 74 72 20 29 7b 0a 20 20 20 20 20 20  terPtr ){.      
5d90: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
5da0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
5db0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
5dc0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
5dd0: 64 28 26 6a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73  d(&journal, zMas
5de0: 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 29  terPtr, nMaster)
5df0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
5e00: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
5e10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
5e20: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 50  iteFree(zMasterP
5e30: 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  tr);.           
5e40: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
5e50: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  out;.          }
5e60: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 30  .          if( 0
5e70: 3d 3d 73 74 72 6e 63 6d 70 28 7a 4d 61 73 74 65  ==strncmp(zMaste
5e80: 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  rPtr, zMaster, n
5e90: 4d 61 73 74 65 72 29 20 29 7b 0a 20 20 20 20 20  Master) ){.     
5ea0: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
5eb0: 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
5ec0: 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
5ed0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
5ee0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
5ef0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73   sqliteFree(zMas
5f00: 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20  terPtr);.       
5f10: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
5f20: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
5f30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
5f40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 44 62       }.      zDb
5f50: 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 44 62 29   += (strlen(zDb)
5f60: 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  +1);.    }.  }. 
5f70: 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c   .  sqlite3OsDel
5f80: 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64  ete(zMaster);..d
5f90: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20  elmaster_out:.  
5fa0: 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  if( zMasterJourn
5fb0: 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
5fc0: 46 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72  Free(zMasterJour
5fd0: 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66  nal);.  }  .  if
5fe0: 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b  ( master_open ){
5ff0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
6000: 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20  ose(&master);.  
6010: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6020: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 65 76 65  ../*.** Make eve
6030: 72 79 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  ry page in the c
6040: 61 63 68 65 20 61 67 72 65 65 20 77 69 74 68 20  ache agree with 
6050: 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e  what is on disk.
6060: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
6070: 2c 0a 2a 2a 20 72 65 72 65 61 64 20 74 68 65 20  ,.** reread the 
6080: 64 69 73 6b 20 74 6f 20 72 65 73 65 74 20 74 68  disk to reset th
6090: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63  e state of the c
60a0: 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ache..**.** This
60b0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
60c0: 65 64 20 61 66 74 65 72 20 61 20 72 6f 6c 6c 62  ed after a rollb
60d0: 61 63 6b 20 69 6e 20 77 68 69 63 68 20 73 6f 6d  ack in which som
60e0: 65 20 6f 66 20 74 68 65 20 64 69 72 74 79 20 63  e of the dirty c
60f0: 61 63 68 65 0a 2a 2a 20 70 61 67 65 73 20 68 61  ache.** pages ha
6100: 64 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69  d never been wri
6110: 74 74 65 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b  tten out to disk
6120: 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f  .  We need to ro
6130: 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 63  ll back the.** c
6140: 61 63 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64  ache content and
6150: 20 74 68 65 20 65 61 73 69 65 73 74 20 77 61 79   the easiest way
6160: 20 74 6f 20 64 6f 20 74 68 61 74 20 69 73 20 74   to do that is t
6170: 6f 20 72 65 72 65 61 64 20 74 68 65 20 6f 6c 64  o reread the old
6180: 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62 61 63 6b   content.** back
6190: 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 2e 0a   from the disk..
61a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
61b0: 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65  ger_reload_cache
61c0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
61d0: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
61e0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
61f0: 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70  _OK;.  for(pPg=p
6200: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
6210: 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
6220: 41 6c 6c 29 7b 0a 20 20 20 20 63 68 61 72 20 7a  All){.    char z
6230: 42 75 66 5b 53 51 4c 49 54 45 5f 50 41 47 45 5f  Buf[SQLITE_PAGE_
6240: 53 49 5a 45 5d 3b 0a 20 20 20 20 69 66 28 20 21  SIZE];.    if( !
6250: 70 50 67 2d 3e 64 69 72 74 79 20 29 20 63 6f 6e  pPg->dirty ) con
6260: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
6270: 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
6280: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
6290: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ize ){.      sql
62a0: 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67  ite3OsSeek(&pPag
62b0: 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 50  er->fd, SQLITE_P
62c0: 41 47 45 5f 53 49 5a 45 2a 28 6f 66 66 5f 74 29  AGE_SIZE*(off_t)
62d0: 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 29 3b 0a  (pPg->pgno-1));.
62e0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
62f0: 65 33 4f 73 52 65 61 64 28 26 70 50 61 67 65 72  e3OsRead(&pPager
6300: 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 53 51 4c 49  ->fd, zBuf, SQLI
6310: 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  TE_PAGE_SIZE);. 
6320: 20 20 20 20 20 54 52 41 43 45 32 28 22 52 45 46       TRACE2("REF
6330: 45 54 43 48 20 70 61 67 65 20 25 64 5c 6e 22 2c  ETCH page %d\n",
6340: 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
6350: 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
6360: 20 7a 42 75 66 2c 20 70 50 67 2d 3e 70 67 6e 6f   zBuf, pPg->pgno
6370: 2c 20 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 2);.      if( 
6380: 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
6390: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
63a0: 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 53 51 4c  set(zBuf, 0, SQL
63b0: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
63c0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
63d0: 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 6d 65  g->nRef==0 || me
63e0: 6d 63 6d 70 28 7a 42 75 66 2c 20 50 47 48 44 52  mcmp(zBuf, PGHDR
63f0: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 53  _TO_DATA(pPg), S
6400: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
6410: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
6420: 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
6430: 50 67 29 2c 20 7a 42 75 66 2c 20 53 51 4c 49 54  Pg), zBuf, SQLIT
6440: 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  E_PAGE_SIZE);.  
6450: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
6460: 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20  xReiniter ){.   
6470: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
6480: 69 6e 69 74 65 72 28 50 47 48 44 52 5f 54 4f 5f  initer(PGHDR_TO_
6490: 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65  DATA(pPg), pPage
64a0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
64b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
64c0: 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
64d0: 54 4f 5f 45 58 54 52 41 28 70 50 67 29 2c 20 30  TO_EXTRA(pPg), 0
64e0: 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  , pPager->nExtra
64f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
6500: 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79  .    pPg->needSy
6510: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d  nc = 0;.    pPg-
6520: 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a  >dirty = 0;.  }.
6530: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
6540: 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
6550: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
6560: 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65  thus restore the
6570: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
6580: 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69  o.** the state i
6590: 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20  t was in before 
65a0: 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e  we started makin
65b0: 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a  g changes.  .**.
65c0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
65d0: 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73  ile format is as
65e0: 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a   follows: .**.**
65f0: 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72    (1)  8 byte pr
6600: 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66  efix.  A copy of
6610: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
6620: 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74  ..**  (2)  4 byt
6630: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
6640: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
6650: 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69  e number of vali
6660: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a  d page records.*
6670: 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a  *       in the j
6680: 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73  ournal.  If this
6690: 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
66a0: 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75  ffff, then compu
66b0: 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
66c0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
66d0: 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
66e0: 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a  journal size..**
66f0: 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69    (3)  4 byte bi
6700: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
6710: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
6720: 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20  itial value for 
6730: 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61  the .**       sa
6740: 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  nity checksum..*
6750: 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69  *  (4)  4 byte i
6760: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
6770: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
6780: 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20  ges to truncate 
6790: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74  the.**       dat
67a0: 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20  abase to during 
67b0: 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20  a rollback..**  
67c0: 28 35 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (5)  4 byte inte
67d0: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
67e0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
67f0: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a   in the master j
6800: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
6810: 6e 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65  name.  The value
6820: 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e   may be zero (in
6830: 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 72  dicate that ther
6840: 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a  e is no master.*
6850: 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e  *       journal.
6860: 29 0a 2a 2a 20 20 28 36 29 20 20 4e 20 62 79 74  ).**  (6)  N byt
6870: 65 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  es of the master
6880: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20   journal name.  
6890: 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65  The name will be
68a0: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a   nul-terminated.
68b0: 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67  **       and mig
68c0: 68 74 20 62 65 20 73 68 6f 72 74 65 72 20 74 68  ht be shorter th
68d0: 61 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  an the value rea
68e0: 64 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20  d from (5).  If 
68f0: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a  the first byte.*
6900: 2a 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e  *       of the n
6910: 61 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e  ame is \000 then
6920: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73   there is no mas
6930: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ter journal.  Th
6940: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20  e master.**     
6950: 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69    journal name i
6960: 73 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d  s stored in UTF-
6970: 38 2e 0a 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f  8..**  (7)  Zero
6980: 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69   or more pages i
6990: 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61  nstances, each a
69a0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20  s follows:.**   
69b0: 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70       +  4 byte p
69c0: 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20  age number..**  
69d0: 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d        +  pPager-
69e0: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
69f0: 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20  of data..**     
6a00: 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65     +  4 byte che
6a10: 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  cksum.**.** When
6a20: 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65   we speak of the
6a30: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c   journal header,
6a40: 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72   we mean the fir
6a50: 73 74 20 36 20 69 74 65 6d 73 20 61 62 6f 76 65  st 6 items above
6a60: 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20  ..** Each entry 
6a70: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
6a80: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
6a90: 20 74 68 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a   the 7th item..*
6aa0: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61  *.** Call the va
6ab0: 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63  lue from the sec
6ac0: 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63  ond bullet "nRec
6ad0: 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20  ".  nRec is the 
6ae0: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c  number of.** val
6af0: 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20  id page entries 
6b00: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
6b10: 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20   In most cases, 
6b20: 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20  you can compute 
6b30: 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
6b40: 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69  nRec from the si
6b50: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
6b60: 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20  l file.  But if 
6b70: 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  a power.** failu
6b80: 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
6b90: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  e the journal wa
6ba0: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
6bb0: 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65   it could be the
6bc0: 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68  .** case that th
6bd0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
6be0: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61  urnal file had a
6bf0: 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
6c00: 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65  eased but.** the
6c10: 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68   extra entries h
6c20: 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20  ad not yet made 
6c30: 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73  it safely to dis
6c40: 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61  k.  In such a ca
6c50: 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  se,.** the value
6c60: 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65   of nRec compute
6c70: 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  d from the file 
6c80: 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  size would be to
6c90: 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a  o large.  For.**
6ca0: 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65   that reason, we
6cb0: 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
6cc0: 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68  nRec value in th
6cd0: 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  e header..**.** 
6ce0: 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  If the nRec valu
6cf0: 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20  e is 0xffffffff 
6d00: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52  it means that nR
6d10: 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ec should be com
6d20: 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68  puted.** from th
6d30: 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68  e file size.  Th
6d40: 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64  is value is used
6d50: 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73   when the user s
6d60: 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f  elects the.** no
6d70: 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72  -sync option for
6d80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
6d90: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
6da0: 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72  ould lead to cor
6db0: 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  ruption.** in th
6dc0: 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f  is case.  But fo
6dd0: 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65  r things like te
6de0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77  mporary table (w
6df0: 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  hich will be.** 
6e00: 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
6e10: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
6e20: 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72  ed) we don't car
6e30: 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e.  .**.** If th
6e40: 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73  e file opened as
6e50: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6e60: 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d  e is not a well-
6e70: 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61  formed.** journa
6e80: 6c 20 66 69 6c 65 20 74 68 65 6e 20 74 68 65 20  l file then the 
6e90: 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 6c 69  database will li
6ea0: 6b 65 6c 79 20 61 6c 72 65 61 64 79 20 62 65 0a  kely already be.
6eb0: 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20 73 6f  ** corrupted, so
6ec0: 20 74 68 65 20 50 41 47 45 52 5f 45 52 52 5f 43   the PAGER_ERR_C
6ed0: 4f 52 52 55 50 54 20 62 69 74 20 69 73 20 73 65  ORRUPT bit is se
6ee0: 74 20 69 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  t in pPager->err
6ef0: 4d 61 73 6b 0a 2a 2a 20 61 6e 64 20 53 51 4c 49  Mask.** and SQLI
6f00: 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65  TE_CORRUPT is re
6f10: 74 75 72 6e 65 64 2e 20 20 49 66 20 69 74 20 61  turned.  If it a
6f20: 6c 6c 20 77 6f 72 6b 73 2c 20 74 68 65 6e 20 74  ll works, then t
6f30: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
6f40: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
6f50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6f60: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50  pager_playback(P
6f70: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
6f80: 74 20 75 73 65 4a 6f 75 72 6e 61 6c 53 69 7a 65  t useJournalSize
6f90: 29 7b 0a 20 20 6f 66 66 5f 74 20 73 7a 4a 3b 20  ){.  off_t szJ; 
6fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6fb0: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   Size of the jou
6fc0: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
6fd0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63  es */.  int nRec
6fe0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6ff0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65   /* Number of Re
7000: 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75  cords in the jou
7010: 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  rnal */.  int i;
7020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7030: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
7040: 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  er */.  Pgno mxP
7050: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
7060: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
7070: 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e  original file in
7080: 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 6e 73 69   pages */.  unsi
7090: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
70a0: 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72  [8]; /* A buffer
70b0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
70c0: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ic header */.  i
70d0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
70e0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
70f0: 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
7100: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
7110: 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20  nMaster;        
7120: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7130: 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6e  f bytes in the n
7140: 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ame of master jo
7150: 75 72 6e 61 6c 20 2a 2f 0a 20 20 63 68 61 72 20  urnal */.  char 
7160: 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20  *zMaster = 0;   
7170: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d      /* Name of m
7180: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
7190: 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20  le if any */..  
71a0: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
71b0: 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
71c0: 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
71d0: 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20  l.  Abort early 
71e0: 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  if.  ** the jour
71f0: 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20  nal is empty..  
7200: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
7210: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
7220: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 53   );.  sqlite3OsS
7230: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
7240: 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  , 0);.  rc = sql
7250: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26  ite3OsFileSize(&
7260: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
7270: 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  J);.  if( rc!=SQ
7280: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
7290: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
72a0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
72b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
72c0: 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 74 6f 20  is too small to 
72d0: 63 6f 6e 74 61 69 6e 20 61 20 63 6f 6d 70 6c 65  contain a comple
72e0: 74 65 20 68 65 61 64 65 72 2c 0a 20 20 2a 2a 20  te header,.  ** 
72f0: 69 74 20 6d 75 73 74 20 6d 65 61 6e 20 74 68 61  it must mean tha
7300: 74 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  t the process th
7310: 61 74 20 63 72 65 61 74 65 64 20 74 68 65 20 6a  at created the j
7320: 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74 0a  ournal was just.
7330: 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 74    ** beginning t
7340: 6f 20 77 72 69 74 65 20 74 68 65 20 6a 6f 75 72  o write the jour
7350: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74  nal file when it
7360: 20 64 69 65 64 2e 20 20 49 6e 20 74 68 61 74 20   died.  In that 
7370: 63 61 73 65 2c 0a 20 20 2a 2a 20 74 68 65 20 64  case,.  ** the d
7380: 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
7390: 75 6c 64 20 68 61 76 65 20 73 74 69 6c 6c 20 62  uld have still b
73a0: 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75  een completely u
73b0: 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 20 4e  nchanged..  ** N
73c0: 6f 74 68 69 6e 67 20 6e 65 65 64 73 20 74 6f 20  othing needs to 
73d0: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  be rolled back. 
73e0: 20 57 65 20 63 61 6e 20 73 61 66 65 6c 79 20 69   We can safely i
73f0: 67 6e 6f 72 65 20 74 68 69 73 20 6a 6f 75 72 6e  gnore this journ
7400: 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  al..  */.  if( s
7410: 7a 4a 20 3c 20 32 34 20 29 7b 0a 20 20 20 20 67  zJ < 24 ){.    g
7420: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
7430: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 28 31 29 20  ;.  }..  /* (1) 
7440: 52 65 61 64 20 74 68 65 20 62 65 67 69 6e 6e 69  Read the beginni
7450: 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ng of the journa
7460: 6c 20 61 6e 64 20 76 65 72 69 66 79 20 74 68 65  l and verify the
7470: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 0a 20 20   magic string.  
7480: 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ** at the beginn
7490: 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ing of the journ
74a0: 61 6c 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  al. */.  rc = sq
74b0: 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70 50 61  lite3OsRead(&pPa
74c0: 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63  ger->jfd, aMagic
74d0: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
74e0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
74f0: 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70  ITE_OK || memcmp
7500: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
7510: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
7520: 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20  Magic))!=0 ){.  
7530: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 52    rc = SQLITE_PR
7540: 4f 54 4f 43 4f 4c 3b 0a 20 20 20 20 67 6f 74 6f  OTOCOL;.    goto
7550: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
7560: 20 7d 0a 0a 20 20 2f 2a 20 28 32 29 20 52 65 61   }..  /* (2) Rea
7570: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
7580: 70 61 67 65 73 20 73 74 6f 72 65 64 20 69 6e 20  pages stored in 
7590: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 2a 2f  the journal.  */
75a0: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
75b0: 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
75c0: 20 28 75 33 32 2a 29 26 6e 52 65 63 29 3b 0a 20   (u32*)&nRec);. 
75d0: 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
75e0: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 69  nd_playback;.  i
75f0: 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66  f( nRec==0xfffff
7600: 66 66 66 20 7c 7c 20 75 73 65 4a 6f 75 72 6e 61  fff || useJourna
7610: 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 6e 52 65  lSize ){.    nRe
7620: 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e  c = (szJ - JOURN
7630: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
7640: 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ))/JOURNAL_PG_SZ
7650: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
7660: 20 2f 2a 20 28 33 29 20 52 65 61 64 20 74 68 65   /* (3) Read the
7670: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66   initial value f
7680: 6f 72 20 74 68 65 20 73 61 6e 69 74 79 20 63 68  or the sanity ch
7690: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 72 63 20 3d  ecksum */.  rc =
76a0: 20 72 65 61 64 33 32 62 69 74 73 28 26 70 50 61   read32bits(&pPa
76b0: 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65  ger->jfd, &pPage
76c0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
76d0: 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
76e0: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 0a 20 20  nd_playback;..  
76f0: 2f 2a 20 28 34 29 20 52 65 61 64 20 74 68 65 20  /* (4) Read the 
7700: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
7710: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7720: 66 69 6c 65 20 70 72 69 6f 72 20 74 6f 20 74 68  file prior to th
7730: 65 0a 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20  e.  ** start of 
7740: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
7750: 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  */.  rc = read32
7760: 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66  bits(&pPager->jf
7770: 64 2c 20 26 6d 78 50 67 29 3b 0a 20 20 69 66 28  d, &mxPg);.  if(
7780: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
7790: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
77a0: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
77b0: 2f 2a 20 28 35 29 20 61 6e 64 20 28 36 29 3a 20  /* (5) and (6): 
77c0: 43 68 65 63 6b 20 69 66 20 61 20 6d 61 73 74 65  Check if a maste
77d0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
77e0: 73 20 73 70 65 63 69 66 69 65 64 2e 20 49 66 20  s specified. If 
77f0: 6f 6e 65 20 69 73 0a 20 20 2a 2a 20 73 70 65 63  one is.  ** spec
7800: 69 66 69 65 64 2c 20 6f 6e 6c 79 20 70 72 6f 63  ified, only proc
7810: 65 65 64 20 77 69 74 68 20 74 68 65 20 70 6c 61  eed with the pla
7820: 79 62 61 63 6b 20 69 66 20 69 74 20 73 74 69 6c  yback if it stil
7830: 6c 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20 72  l exists. */.  r
7840: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 26  c = read32bits(&
7850: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6e 4d  pPager->jfd, &nM
7860: 61 73 74 65 72 29 3b 0a 20 20 69 66 28 20 72 63  aster);.  if( rc
7870: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79   ) goto end_play
7880: 62 61 63 6b 3b 0a 20 20 69 66 28 20 6e 4d 61 73  back;.  if( nMas
7890: 74 65 72 3e 30 20 29 7b 0a 20 20 20 20 7a 4d 61  ter>0 ){.    zMa
78a0: 73 74 65 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c  ster = sqliteMal
78b0: 6c 6f 63 28 6e 4d 61 73 74 65 72 29 3b 0a 20 20  loc(nMaster);.  
78c0: 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 29    if( !zMaster )
78d0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
78e0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
78f0: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
7900: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ck;.    }.    rc
7910: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
7920: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  (&pPager->jfd, z
7930: 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29  Master, nMaster)
7940: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
7950: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73  LITE_OK || (zMas
7960: 74 65 72 5b 30 5d 20 26 26 20 21 73 71 6c 69 74  ter[0] && !sqlit
7970: 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a  e3OsFileExists(z
7980: 4d 61 73 74 65 72 29 29 20 29 7b 0a 20 20 20 20  Master)) ){.    
7990: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
79a0: 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ack;.    }.  }..
79b0: 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68    /* Truncate th
79c0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
79d0: 62 61 63 6b 20 74 6f 20 69 74 27 73 20 6f 72 69  back to it's ori
79e0: 67 69 6e 61 6c 20 73 69 7a 65 20 2a 2f 0a 20 20  ginal size */.  
79f0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
7a00: 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 7c 7c  origDbSize==0 ||
7a10: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
7a20: 69 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20 20 72  ize==mxPg );.  r
7a30: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
7a40: 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e 66  ncate(&pPager->f
7a50: 64 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  d, SQLITE_PAGE_S
7a60: 49 5a 45 2a 28 6f 66 66 5f 74 29 6d 78 50 67 29  IZE*(off_t)mxPg)
7a70: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
7a80: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
7a90: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
7aa0: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62    }.  pPager->db
7ab0: 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 0a  Size = mxPg;.  .
7ac0: 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e    /* Copy origin
7ad0: 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20  al pages out of 
7ae0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
7af0: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
7b00: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a  tabase file..  *
7b10: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  /.  for(i=0; i<n
7b20: 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  Rec; i++){.    r
7b30: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
7b40: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
7b50: 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  er, &pPager->jfd
7b60: 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 1);.    if( rc
7b70: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
7b80: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
7b90: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
7ba0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
7bb0: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
7bc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7bd0: 20 7d 0a 0a 20 20 2f 2a 20 50 61 67 65 73 20 74   }..  /* Pages t
7be0: 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 77 72  hat have been wr
7bf0: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
7c00: 72 6e 61 6c 20 62 75 74 20 6e 65 76 65 72 20 73  rnal but never s
7c10: 79 6e 63 65 64 0a 20 20 2a 2a 20 77 68 65 72 65  ynced.  ** where
7c20: 20 6e 6f 74 20 72 65 73 74 6f 72 65 64 20 62 79   not restored by
7c30: 20 74 68 65 20 6c 6f 6f 70 20 61 62 6f 76 65 2e   the loop above.
7c40: 20 20 57 65 20 68 61 76 65 20 74 6f 20 72 65 73    We have to res
7c50: 74 6f 72 65 20 74 68 6f 73 65 0a 20 20 2a 2a 20  tore those.  ** 
7c60: 70 61 67 65 73 20 62 79 20 72 65 61 64 69 6e 67  pages by reading
7c70: 20 74 68 65 6d 20 62 61 63 6b 20 66 72 6f 6d 20   them back from 
7c80: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
7c90: 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  abase..  */.  if
7ca0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7cb0: 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 6c  ){.    pager_rel
7cc0: 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65 72  oad_cache(pPager
7cd0: 29 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 70 6c 61 79  );.  }..end_play
7ce0: 62 61 63 6b 3a 0a 20 20 69 66 28 20 7a 4d 61 73  back:.  if( zMas
7cf0: 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ter ){.    /* If
7d00: 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73   there was a mas
7d10: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ter journal and 
7d20: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
7d30: 6c 20 72 65 74 75 72 6e 20 74 72 75 65 2c 0a 20  l return true,. 
7d40: 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
7d50: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
7d60: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
7d70: 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 65 72 72   journal. If err
7d80: 6f 72 73 20 0a 20 20 20 20 2a 2a 20 6f 63 63 75  ors .    ** occu
7d90: 72 20 64 75 72 69 6e 67 20 74 68 69 73 20 70 72  r during this pr
7da0: 6f 63 65 73 73 2c 20 69 67 6e 6f 72 65 20 74 68  ocess, ignore th
7db0: 65 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  em..    */.    i
7dc0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7dd0: 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
7de0: 64 65 6c 6d 61 73 74 65 72 28 7a 4d 61 73 74 65  delmaster(zMaste
7df0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
7e00: 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72  liteFree(zMaster
7e10: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
7e20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7e30: 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 57 65 20    /* FIX ME: We 
7e40: 73 68 6f 75 6c 64 6e 27 74 20 64 65 6c 65 74 65  shouldn't delete
7e50: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20   the journal if 
7e60: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  an error occured
7e70: 20 64 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20 72   during.    ** r
7e80: 6f 6c 6c 62 61 63 6b 2e 20 49 74 20 6d 61 79 20  ollback. It may 
7e90: 68 61 76 65 20 62 65 65 6e 20 61 20 74 72 61 6e  have been a tran
7ea0: 73 69 65 6e 74 20 65 72 72 6f 72 20 61 6e 64 20  sient error and 
7eb0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79  the rollback may
7ec0: 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 65 64 20  .    ** succeed 
7ed0: 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73 20  next time it is 
7ee0: 61 74 74 65 6d 70 74 65 64 2e 0a 20 20 20 20 2a  attempted..    *
7ef0: 2f 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 77 72  /.    pager_unwr
7f00: 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
7f10: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
7f20: 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52  Mask |= PAGER_ER
7f30: 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72  R_CORRUPT;.    r
7f40: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
7f50: 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  PT;.  }else{.   
7f60: 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
7f70: 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
7f80: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
7f90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  ;.}../*.** Playb
7fa0: 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ack the statemen
7fb0: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
7fc0: 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72   This is similar
7fd0: 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   to playing back
7fe0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
7ff0: 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74   journal but wit
8000: 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61  h.** a few extra
8010: 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20   twists..**.**  
8020: 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65    (1)  The numbe
8030: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
8040: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
8050: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a  at the start of.
8060: 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 73  **         the s
8070: 74 61 74 65 6d 65 6e 74 20 69 73 20 73 74 6f 72  tatement is stor
8080: 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 73 74  ed in pPager->st
8090: 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74  mtSize, not in t
80a0: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f  he.**         jo
80b0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c  urnal file itsel
80c0: 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  f..**.**    (2) 
80d0: 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20   In addition to 
80e0: 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65  playing back the
80f0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
8100: 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20  al, also.**     
8110: 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c      playback all
8120: 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 74 72   pages of the tr
8130: 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
8140: 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20  l beginning.**  
8150: 20 20 20 20 20 20 20 61 74 20 6f 66 66 73 65 74         at offset
8160: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
8170: 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
8180: 74 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61  t pager_stmt_pla
8190: 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
81a0: 67 65 72 29 7b 0a 20 20 6f 66 66 5f 74 20 73 7a  ger){.  off_t sz
81b0: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
81c0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
81d0: 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  full journal */.
81e0: 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20    int nRec;     
81f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8200: 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
8210: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
8220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8230: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
8240: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
8250: 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 64 61   Truncate the da
8260: 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f 20 69  tabase back to i
8270: 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
8280: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
8290: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
82a0: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  &pPager->fd, SQL
82b0: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2a 28 6f  ITE_PAGE_SIZE*(o
82c0: 66 66 5f 74 29 70 50 61 67 65 72 2d 3e 73 74 6d  ff_t)pPager->stm
82d0: 74 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72  tSize);.  pPager
82e0: 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
82f0: 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 0a 20 20  r->stmtSize;..  
8300: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
8310: 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
8320: 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  re in the statem
8330: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  ent journal..  *
8340: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
8350: 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26  er->stmtInUse &&
8360: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8370: 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65  Open );.  sqlite
8380: 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
8390: 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52 65  >stfd, 0);.  nRe
83a0: 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  c = pPager->stmt
83b0: 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f  NRec;.  .  /* Co
83c0: 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  py original page
83d0: 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74 61  s out of the sta
83e0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61  tement journal a
83f0: 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
8400: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
8410: 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  ile.  Note that 
8420: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
8430: 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65 63  urnal omits chec
8440: 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  ksums from.  ** 
8450: 65 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e 63  each record sinc
8460: 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20  e power-failure 
8470: 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20  recovery is not 
8480: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74 61  important to sta
8490: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72  tement.  ** jour
84a0: 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  nals..  */.  for
84b0: 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b  (i=nRec-1; i>=0;
84c0: 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20   i--){.    rc = 
84d0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
84e0: 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
84f0: 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30  &pPager->stfd, 0
8500: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
8510: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
8520: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
8530: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
8540: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
8550: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75  ;.  }..  /* Figu
8560: 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
8570: 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65  pages need to be
8580: 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66 20 74   copied out of t
8590: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  he transaction. 
85a0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a   ** journal..  *
85b0: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
85c0: 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
85d0: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d  jfd, pPager->stm
85e0: 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  tJSize);.  if( r
85f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
8600: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d      goto end_stm
8610: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  t_playback;.  }.
8620: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
8630: 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72  FileSize(&pPager
8640: 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20  ->jfd, &szJ);.  
8650: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
8660: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
8670: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
8680: 0a 20 20 7d 0a 20 20 6e 52 65 63 20 3d 20 28 73  .  }.  nRec = (s
8690: 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 73 74 6d  zJ - pPager->stm
86a0: 74 4a 53 69 7a 65 29 2f 4a 4f 55 52 4e 41 4c 5f  tJSize)/JOURNAL_
86b0: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  PG_SZ(pPager);. 
86c0: 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69   for(i=nRec-1; i
86d0: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72  >=0; i--){.    r
86e0: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
86f0: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
8700: 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  er, &pPager->jfd
8710: 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 1);.    if( rc
8720: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
8730: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
8740: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
8750: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73        goto end_s
8760: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
8770: 20 20 7d 0a 20 20 7d 0a 20 20 0a 65 6e 64 5f 73    }.  }.  .end_s
8780: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  tmt_playback:.  
8790: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
87a0: 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
87b0: 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45  >errMask |= PAGE
87c0: 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20  R_ERR_CORRUPT;. 
87d0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
87e0: 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20 72 65  ORRUPT;.  }.  re
87f0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
8800: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78  * Change the max
8810: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69  imum number of i
8820: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74  n-memory pages t
8830: 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e  hat are allowed.
8840: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  .**.** The maxim
8850: 75 6d 20 6e 75 6d 62 65 72 20 69 73 20 74 68 65  um number is the
8860: 20 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20   absolute value 
8870: 6f 66 20 74 68 65 20 6d 78 50 61 67 65 20 70 61  of the mxPage pa
8880: 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 49 66 20 6d  rameter..** If m
8890: 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76  xPage is negativ
88a0: 65 2c 20 74 68 65 20 6e 6f 53 79 6e 63 20 66 6c  e, the noSync fl
88b0: 61 67 20 69 73 20 61 6c 73 6f 20 73 65 74 2e 20  ag is also set. 
88c0: 20 6e 6f 53 79 6e 63 20 62 79 70 61 73 73 65 73   noSync bypasses
88d0: 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  .** calls to sql
88e0: 69 74 65 33 4f 73 53 79 6e 63 28 29 2e 20 20 54  ite3OsSync().  T
88f0: 68 65 20 70 61 67 65 72 20 72 75 6e 73 20 6d 75  he pager runs mu
8900: 63 68 20 66 61 73 74 65 72 20 77 69 74 68 20 6e  ch faster with n
8910: 6f 53 79 6e 63 20 6f 6e 2c 0a 2a 2a 20 62 75 74  oSync on,.** but
8920: 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e   if the operatin
8930: 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73  g system crashes
8940: 20 6f 72 20 74 68 65 72 65 20 69 73 20 61 6e 20   or there is an 
8950: 61 62 72 75 70 74 20 70 6f 77 65 72 20 0a 2a 2a  abrupt power .**
8960: 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64 61   failure, the da
8970: 74 61 62 61 73 65 20 66 69 6c 65 20 6d 69 67 68  tabase file migh
8980: 74 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20  t be left in an 
8990: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64  inconsistent and
89a0: 0a 2a 2a 20 75 6e 72 65 70 61 69 72 61 62 6c 65  .** unrepairable
89b0: 20 73 74 61 74 65 2e 20 20 0a 2a 2f 0a 76 6f 69   state.  .*/.voi
89c0: 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  d sqlite3pager_s
89d0: 65 74 5f 63 61 63 68 65 73 69 7a 65 28 50 61 67  et_cachesize(Pag
89e0: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
89f0: 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d  mxPage){.  if( m
8a00: 78 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20  xPage>=0 ){.    
8a10: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
8a20: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
8a30: 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  e;.    if( pPage
8a40: 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67  r->noSync ) pPag
8a50: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
8a60: 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ; .  }else{.    
8a70: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
8a80: 20 31 3b 0a 20 20 20 20 6d 78 50 61 67 65 20 3d   1;.    mxPage =
8a90: 20 2d 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20   -mxPage;.  }.  
8aa0: 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20 29 7b  if( mxPage>10 ){
8ab0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
8ac0: 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20  age = mxPage;.  
8ad0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73  }.}../*.** Adjus
8ae0: 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73  t the robustness
8af0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
8b00: 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74   to damage due t
8b10: 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20  o OS crashes.** 
8b20: 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  or power failure
8b30: 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68  s by changing th
8b40: 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63  e number of sync
8b50: 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e  s()s when writin
8b60: 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  g.** the rollbac
8b70: 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72  k journal.  Ther
8b80: 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65  e are three leve
8b90: 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46  ls:.**.**    OFF
8ba0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
8bb0: 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Sync() is never 
8bc0: 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73  called.  This is
8bd0: 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20   the default.** 
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
8bf0: 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74   temporary and t
8c00: 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a  ransient files..
8c10: 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20  **.**    NORMAL 
8c20: 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
8c30: 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65  s synced once be
8c40: 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
8c50: 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
8c60: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
8c70: 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
8c80: 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72  ally adequate pr
8c90: 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a  otection, but.**
8ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74                it
8cb0: 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c   is theoreticall
8cc0: 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75  y possible, thou
8cd0: 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79  gh very unlikely
8ce0: 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
8cf0: 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72    that an inoper
8d00: 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75  tune power failu
8d10: 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74  re could leave t
8d20: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  he journal.**   
8d30: 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20             in a 
8d40: 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c  state which woul
8d50: 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74  d cause damage t
8d60: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  o the database.*
8d70: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  *              w
8d80: 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64  hen it is rolled
8d90: 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   back..**.**    
8da0: 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f  FULL      The jo
8db0: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
8dc0: 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69  twice before wri
8dd0: 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
8de0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
8df0: 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20   database (with 
8e00: 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  some additional 
8e10: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68  information - th
8e20: 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20  e nRec field.** 
8e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
8e40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
8e50: 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74  er - being writt
8e60: 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  en in between th
8e70: 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20  e two.**        
8e80: 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49        syncs).  I
8e90: 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74  f we assume that
8ea0: 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20   writing a.**   
8eb0: 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c             singl
8ec0: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73  e disk sector is
8ed0: 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68   atomic, then th
8ee0: 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73  is mode provides
8ef0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
8f00: 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20   assurance that 
8f10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c  the journal will
8f20: 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65   not be corrupte
8f30: 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20  d to the.**     
8f40: 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f           point o
8f50: 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65  f causing damage
8f60: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
8f70: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
8f80: 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20  ..**.** Numeric 
8f90: 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65  values associate
8fa0: 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61  d with these sta
8fb0: 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20  tes are OFF==1, 
8fc0: 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64  NORMAL=2,.** and
8fd0: 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 76 6f 69 64   FULL=3..*/.void
8fe0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
8ff0: 74 5f 73 61 66 65 74 79 5f 6c 65 76 65 6c 28 50  t_safety_level(P
9000: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
9010: 74 20 6c 65 76 65 6c 29 7b 0a 20 20 70 50 61 67  t level){.  pPag
9020: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65  er->noSync =  le
9030: 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72  vel==1 || pPager
9040: 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
9050: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
9060: 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50   level==3 && !pP
9070: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
9080: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
9090: 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e  Sync ) pPager->n
90a0: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 0a  eedSync = 0;.}..
90b0: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d  /*.** Open a tem
90c0: 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 57 72  porary file.  Wr
90d0: 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ite the name of 
90e0: 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 7a 4e  the file into zN
90f0: 61 6d 65 0a 2a 2a 20 28 7a 4e 61 6d 65 20 6d 75  ame.** (zName mu
9100: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 53  st be at least S
9110: 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
9120: 49 5a 45 20 62 79 74 65 73 20 6c 6f 6e 67 2e 29  IZE bytes long.)
9130: 20 20 57 72 69 74 65 0a 2a 2a 20 74 68 65 20 66    Write.** the f
9140: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
9150: 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e  nto *fd.  Return
9160: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
9170: 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a  ccess or some.**
9180: 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
9190: 65 20 69 66 20 77 65 20 66 61 69 6c 2e 0a 2a 2a  e if we fail..**
91a0: 0a 2a 2a 20 54 68 65 20 4f 53 20 77 69 6c 6c 20  .** The OS will 
91b0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
91c0: 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61  lete the tempora
91d0: 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20  ry file when it 
91e0: 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f  is.** closed..*/
91f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
9200: 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d  te3pager_opentem
9210: 70 28 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 4f  p(char *zFile, O
9220: 73 46 69 6c 65 20 2a 66 64 29 7b 0a 20 20 69 6e  sFile *fd){.  in
9230: 74 20 63 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74  t cnt = 8;.  int
9240: 20 72 63 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 63   rc;.  do{.    c
9250: 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nt--;.    sqlite
9260: 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28  3OsTempFileName(
9270: 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d  zFile);.    rc =
9280: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78   sqlite3OsOpenEx
9290: 63 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c 20 66  clusive(zFile, f
92a0: 64 2c 20 31 29 3b 0a 20 20 7d 77 68 69 6c 65 28  d, 1);.  }while(
92b0: 20 63 6e 74 3e 30 20 26 26 20 72 63 21 3d 53 51   cnt>0 && rc!=SQ
92c0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74  LITE_OK );.  ret
92d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
92e0: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   Create a new pa
92f0: 67 65 20 63 61 63 68 65 20 61 6e 64 20 70 75 74  ge cache and put
9300: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
9310: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 6e 20  e page cache in 
9320: 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65  *ppPager..** The
9330: 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
9340: 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73  ed need not exis
9350: 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73 20  t.  The file is 
9360: 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c  not locked until
9370: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 61  .** the first ca
9380: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67  ll to sqlite3pag
9390: 65 72 5f 67 65 74 28 29 20 61 6e 64 20 69 73 20  er_get() and is 
93a0: 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75  only held open u
93b0: 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74  ntil the.** last
93c0: 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65   page is release
93d0: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 70  d using sqlite3p
93e0: 61 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2a  ager_unref()..**
93f0: 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
9400: 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20   is NULL then a 
9410: 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74  randomly-named t
9420: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
9430: 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
9440: 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65  used as the file
9450: 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20   to be cached.  
9460: 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  The file will be
9470: 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f   deleted.** auto
9480: 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69  matically when i
9490: 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  t is closed..*/.
94a0: 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
94b0: 5f 6f 70 65 6e 28 0a 20 20 50 61 67 65 72 20 2a  _open(.  Pager *
94c0: 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
94d0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
94e0: 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
94f0: 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
9500: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
9510: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
9520: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
9530: 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
9540: 20 6d 78 50 61 67 65 2c 20 20 20 20 20 20 20 20   mxPage,        
9550: 20 20 20 20 20 20 2f 2a 20 4d 61 78 20 6e 75 6d        /* Max num
9560: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
9570: 20 63 61 63 68 65 20 70 61 67 65 73 20 2a 2f 0a   cache pages */.
9580: 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
9590: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
95a0: 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64  tra bytes append
95b0: 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
95c0: 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
95d0: 20 75 73 65 4a 6f 75 72 6e 61 6c 2c 20 20 20 20   useJournal,    
95e0: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 74 6f        /* TRUE to
95f0: 20 75 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   use a rollback 
9600: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
9610: 66 69 6c 65 20 2a 2f 0a 20 20 76 6f 69 64 20 20  file */.  void  
9620: 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 20 20 20  *pBusyHandler   
9630: 20 20 20 2f 2a 20 42 75 73 79 20 63 61 6c 6c 62     /* Busy callb
9640: 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65  ack */.){.  Page
9650: 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 63 68 61  r *pPager;.  cha
9660: 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  r *zFullPathname
9670: 3b 0a 20 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b  ;.  int nameLen;
9680: 0a 20 20 4f 73 46 69 6c 65 20 66 64 3b 0a 20 20  .  OsFile fd;.  
9690: 69 6e 74 20 72 63 2c 20 69 3b 0a 20 20 69 6e 74  int rc, i;.  int
96a0: 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 6e 74   tempFile;.  int
96b0: 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e   memDb = 0;.  in
96c0: 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a  t readOnly = 0;.
96d0: 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c    char zTemp[SQL
96e0: 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a  ITE_TEMPNAME_SIZ
96f0: 45 5d 3b 0a 0a 20 20 2a 70 70 50 61 67 65 72 20  E];..  *ppPager 
9700: 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  = 0;.  if( sqlit
9710: 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
9720: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
9730: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
9740: 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
9750: 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
9760: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63   ){.    if( strc
9770: 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d  mp(zFilename,":m
9780: 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20  emory:")==0 ){. 
9790: 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a       memDb = 1;.
97a0: 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e        zFullPathn
97b0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ame = sqliteMall
97c0: 6f 63 28 34 29 3b 0a 20 20 20 20 20 20 69 66 28  oc(4);.      if(
97d0: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29   zFullPathname )
97e0: 20 73 74 72 63 70 79 28 7a 46 75 6c 6c 50 61 74   strcpy(zFullPat
97f0: 68 6e 61 6d 65 2c 20 22 22 29 3b 0a 20 20 20 20  hname, "");.    
9800: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
9810: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9820: 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65     zFullPathname
9830: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
9840: 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Pathname(zFilena
9850: 6d 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  me);.      rc = 
9860: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
9870: 64 57 72 69 74 65 28 7a 46 75 6c 6c 50 61 74 68  dWrite(zFullPath
9880: 6e 61 6d 65 2c 20 26 66 64 2c 20 26 72 65 61 64  name, &fd, &read
9890: 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 74 65 6d  Only);.      tem
98a0: 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 7d  pFile = 0;.    }
98b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
98c0: 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
98d0: 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20  opentemp(zTemp, 
98e0: 26 66 64 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e  &fd);.    zFilen
98f0: 61 6d 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20  ame = zTemp;.   
9900: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d   zFullPathname =
9910: 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
9920: 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65  thname(zFilename
9930: 29 3b 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20  );.    tempFile 
9940: 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  = 1;.  }.  if( s
9950: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
9960: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
9970: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
9980: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
9990: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
99a0: 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c  sqliteFree(zFull
99b0: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72  Pathname);.    r
99c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
99d0: 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 6e 61 6d  TOPEN;.  }.  nam
99e0: 65 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46  eLen = strlen(zF
99f0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
9a00: 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 4d  pPager = sqliteM
9a10: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
9a20: 50 61 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65 6e  Pager) + nameLen
9a30: 2a 33 20 2b 20 33 30 20 29 3b 0a 20 20 69 66 28  *3 + 30 );.  if(
9a40: 20 70 50 61 67 65 72 3d 3d 30 20 29 7b 0a 20 20   pPager==0 ){.  
9a50: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
9a60: 28 26 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  (&fd);.    sqlit
9a70: 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  eFree(zFullPathn
9a80: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
9a90: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
9aa0: 20 7d 0a 20 20 53 45 54 5f 50 41 47 45 52 28 70   }.  SET_PAGER(p
9ab0: 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72  Pager);.  pPager
9ac0: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63  ->zFilename = (c
9ad0: 68 61 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b  har*)&pPager[1];
9ae0: 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  .  pPager->zDire
9af0: 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65 72 2d  ctory = &pPager-
9b00: 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c  >zFilename[nameL
9b10: 65 6e 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d  en+1];.  pPager-
9b20: 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61  >zJournal = &pPa
9b30: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b  ger->zDirectory[
9b40: 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74  nameLen+1];.  st
9b50: 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69  rcpy(pPager->zFi
9b60: 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74  lename, zFullPat
9b70: 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79  hname);.  strcpy
9b80: 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  (pPager->zDirect
9b90: 6f 72 79 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  ory, zFullPathna
9ba0: 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 61 6d  me);.  for(i=nam
9bb0: 65 4c 65 6e 3b 20 69 3e 30 20 26 26 20 70 50 61  eLen; i>0 && pPa
9bc0: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b  ger->zDirectory[
9bd0: 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b  i-1]!='/'; i--){
9be0: 7d 0a 20 20 69 66 28 20 69 3e 30 20 29 20 70 50  }.  if( i>0 ) pP
9bf0: 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
9c00: 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20 20 73 74 72  [i-1] = 0;.  str
9c10: 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  cpy(pPager->zJou
9c20: 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  rnal, zFullPathn
9c30: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ame);.  sqliteFr
9c40: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
9c50: 29 3b 0a 20 20 73 74 72 63 70 79 28 26 70 50 61  );.  strcpy(&pPa
9c60: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61  ger->zJournal[na
9c70: 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61  meLen], "-journa
9c80: 6c 22 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  l");.  pPager->f
9c90: 64 20 3d 20 66 64 3b 0a 20 20 70 50 61 67 65 72  d = fd;.  pPager
9ca0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
9cb0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65  0;.  pPager->use
9cc0: 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75  Journal = useJou
9cd0: 72 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a  rnal && !memDb;.
9ce0: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70    pPager->stmtOp
9cf0: 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  en = 0;.  pPager
9d00: 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
9d10: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  .  pPager->nRef 
9d20: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  = 0;.  pPager->d
9d30: 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b  bSize = memDb-1;
9d40: 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  .  pPager->pageS
9d50: 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 50 41 47  ize = SQLITE_PAG
9d60: 45 5f 53 49 5a 45 3b 0a 20 20 70 50 61 67 65 72  E_SIZE;.  pPager
9d70: 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 0a  ->stmtSize = 0;.
9d80: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53    pPager->stmtJS
9d90: 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ize = 0;.  pPage
9da0: 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  r->nPage = 0;.  
9db0: 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d  pPager->mxPage =
9dc0: 20 6d 78 50 61 67 65 3e 35 20 3f 20 6d 78 50 61   mxPage>5 ? mxPa
9dd0: 67 65 20 3a 20 31 30 3b 0a 20 20 70 50 61 67 65  ge : 10;.  pPage
9de0: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
9df0: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65  _UNLOCK;.  pPage
9e00: 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 0a  r->errMask = 0;.
9e10: 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
9e20: 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20  le = tempFile;. 
9e30: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d   pPager->memDb =
9e40: 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72   memDb;.  pPager
9e50: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61  ->readOnly = rea
9e60: 64 4f 6e 6c 79 3b 0a 20 20 70 50 61 67 65 72 2d  dOnly;.  pPager-
9e70: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
9e80: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
9e90: 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
9ea0: 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61  le || !useJourna
9eb0: 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69  l;.  pPager->pFi
9ec0: 72 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  rst = 0;.  pPage
9ed0: 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
9ee0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
9ef0: 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  Last = 0;.  pPag
9f00: 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 6e 45 78  er->nExtra = nEx
9f10: 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  tra;.  pPager->p
9f20: 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 28 42  BusyHandler = (B
9f30: 75 73 79 48 61 6e 64 6c 65 72 20 2a 29 70 42 75  usyHandler *)pBu
9f40: 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 6d 65 6d  syHandler;.  mem
9f50: 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73  set(pPager->aHas
9f60: 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61  h, 0, sizeof(pPa
9f70: 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20  ger->aHash));.  
9f80: 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  *ppPager = pPage
9f90: 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  r;.  return SQLI
9fa0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
9fb0: 53 65 74 20 74 68 65 20 64 65 73 74 72 75 63 74  Set the destruct
9fc0: 6f 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  or for this page
9fd0: 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c  r.  If not NULL,
9fe0: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
9ff0: 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65  is called.** whe
a000: 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  n the reference 
a010: 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68 20 70 61  count on each pa
a020: 67 65 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e  ge reaches zero.
a030: 20 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72    The destructor
a040: 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20   can.** be used 
a050: 74 6f 20 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f  to clean up info
a060: 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 65  rmation in the e
a070: 78 74 72 61 20 73 65 67 6d 65 6e 74 20 61 70 70  xtra segment app
a080: 65 6e 64 65 64 20 74 6f 20 65 61 63 68 20 70 61  ended to each pa
a090: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  ge..**.** The de
a0a0: 73 74 72 75 63 74 6f 72 20 69 73 20 6e 6f 74 20  structor is not 
a0b0: 63 61 6c 6c 65 64 20 61 73 20 61 20 72 65 73 75  called as a resu
a0c0: 6c 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  lt sqlite3pager_
a0d0: 63 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65  close().  .** De
a0e0: 73 74 72 75 63 74 6f 72 73 20 61 72 65 20 6f 6e  structors are on
a0f0: 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c  ly called by sql
a100: 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
a110: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
a120: 65 33 70 61 67 65 72 5f 73 65 74 5f 64 65 73 74  e3pager_set_dest
a130: 72 75 63 74 6f 72 28 50 61 67 65 72 20 2a 70 50  ructor(Pager *pP
a140: 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 44 65  ager, void (*xDe
a150: 73 63 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29 7b  sc)(void*,int)){
a160: 0a 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74  .  pPager->xDest
a170: 72 75 63 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a  ructor = xDesc;.
a180: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
a190: 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66   reinitializer f
a1a0: 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20  or this pager.  
a1b0: 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  If not NULL, the
a1c0: 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a   reinitializer.*
a1d0: 2a 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  * is called when
a1e0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
a1f0: 61 20 70 61 67 65 20 69 6e 20 63 61 63 68 65 20  a page in cache 
a200: 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  is restored to i
a210: 74 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76  ts original.** v
a220: 61 6c 75 65 20 61 73 20 61 20 72 65 73 75 6c 74  alue as a result
a230: 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20   of a rollback. 
a240: 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 67 69   The callback gi
a250: 76 65 73 20 68 69 67 68 65 72 2d 6c 65 76 65 6c  ves higher-level
a260: 20 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f   code.** an oppo
a270: 72 74 75 6e 69 74 79 20 74 6f 20 72 65 73 74 6f  rtunity to resto
a280: 72 65 20 74 68 65 20 45 58 54 52 41 20 73 65 63  re the EXTRA sec
a290: 74 69 6f 6e 20 74 6f 20 61 67 72 65 65 20 77 69  tion to agree wi
a2a0: 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 0a  th the restored.
a2b0: 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f  ** page data..*/
a2c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
a2d0: 65 72 5f 73 65 74 5f 72 65 69 6e 69 74 65 72 28  er_set_reiniter(
a2e0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76  Pager *pPager, v
a2f0: 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 76  oid (*xReinit)(v
a300: 6f 69 64 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50  oid*,int)){.  pP
a310: 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
a320: 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a  = xReinit;.}../*
a330: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
a340: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
a350: 61 67 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b  ages in the disk
a360: 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64   file associated
a370: 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e   with.** pPager.
a380: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
a390: 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 50  ager_pagecount(P
a3a0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
a3b0: 20 6f 66 66 5f 74 20 6e 3b 0a 20 20 61 73 73 65   off_t n;.  asse
a3c0: 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
a3d0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
a3e0: 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20  bSize>=0 ){.    
a3f0: 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 64  return pPager->d
a400: 62 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28  bSize;.  }.  if(
a410: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
a420: 7a 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ze(&pPager->fd, 
a430: 26 6e 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  &n)!=SQLITE_OK )
a440: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
a450: 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
a460: 52 52 5f 44 49 53 4b 3b 0a 20 20 20 20 72 65 74  RR_DISK;.    ret
a470: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 20 2f  urn 0;.  }.  n /
a480: 3d 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  = SQLITE_PAGE_SI
a490: 5a 45 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  ZE;.  if( pPager
a4a0: 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
a4b0: 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 50 61  NLOCK ){.    pPa
a4c0: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b  ger->dbSize = n;
a4d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
a4e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72  .}../*.** Forwar
a4f0: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f  d declaration.*/
a500: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
a510: 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 2c 20  Journal(Pager*, 
a520: 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 0a 0a  const char*);...
a530: 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70  /*.** Unlink a p
a540: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65  age from the fre
a550: 65 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74  e list (the list
a560: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 77 68   of all pages wh
a570: 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20  ere nRef==0).** 
a580: 61 6e 64 20 66 72 6f 6d 20 69 74 73 20 68 61 73  and from its has
a590: 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69  h collision chai
a5a0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
a5b0: 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48  d unlinkPage(PgH
a5c0: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
a5d0: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
a5e0: 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b  >pPager;..  /* K
a5f0: 65 65 70 20 74 68 65 20 70 46 69 72 73 74 53 79  eep the pFirstSy
a600: 6e 63 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69  nced pointer poi
a610: 6e 74 69 6e 67 20 61 74 20 74 68 65 20 66 69 72  nting at the fir
a620: 73 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20  st synchronized 
a630: 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70 50  page */.  if( pP
a640: 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g==pPager->pFirs
a650: 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 50  tSynced ){.    P
a660: 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70  gHdr *p = pPg->p
a670: 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 77 68  NextFree;.    wh
a680: 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65  ile( p && p->nee
a690: 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e  dSync ){ p = p->
a6a0: 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20  pNextFree; }.   
a6b0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
a6c0: 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a  ynced = p;.  }..
a6d0: 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d    /* Unlink from
a6e0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
a6f0: 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65  .  if( pPg->pPre
a700: 76 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67  vFree ){.    pPg
a710: 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65  ->pPrevFree->pNe
a720: 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e  xtFree = pPg->pN
a730: 65 78 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65  extFree;.  }else
a740: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
a750: 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50  ager->pFirst==pP
a760: 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  g );.    pPager-
a770: 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70  >pFirst = pPg->p
a780: 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20 20  NextFree;.  }.  
a790: 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  if( pPg->pNextFr
a7a0: 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70  ee ){.    pPg->p
a7b0: 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46  NextFree->pPrevF
a7c0: 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ree = pPg->pPrev
a7d0: 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Free;.  }else{. 
a7e0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a7f0: 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b  r->pLast==pPg );
a800: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61  .    pPager->pLa
a810: 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  st = pPg->pPrevF
a820: 72 65 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  ree;.  }.  pPg->
a830: 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d  pNextFree = pPg-
a840: 3e 70 50 72 65 76 46 72 65 65 20 3d 20 30 3b 0a  >pPrevFree = 0;.
a850: 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f  .  /* Unlink fro
a860: 6d 20 74 68 65 20 70 67 6e 6f 20 68 61 73 68 20  m the pgno hash 
a870: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  table */.  if( p
a880: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b  Pg->pNextHash ){
a890: 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  .    pPg->pNextH
a8a0: 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  ash->pPrevHash =
a8b0: 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b   pPg->pPrevHash;
a8c0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e  .  }.  if( pPg->
a8d0: 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20  pPrevHash ){.   
a8e0: 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 2d   pPg->pPrevHash-
a8f0: 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67  >pNextHash = pPg
a900: 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d  ->pNextHash;.  }
a910: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 68 20  else{.    int h 
a920: 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70 50 67  = pager_hash(pPg
a930: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73  ->pgno);.    ass
a940: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61  ert( pPager->aHa
a950: 73 68 5b 68 5d 3d 3d 70 50 67 20 29 3b 0a 20 20  sh[h]==pPg );.  
a960: 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b    pPager->aHash[
a970: 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48  h] = pPg->pNextH
a980: 61 73 68 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  ash;.  }.  pPg->
a990: 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d  pNextHash = pPg-
a9a0: 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a  >pPrevHash = 0;.
a9b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
a9c0: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
a9d0: 20 74 72 75 6e 63 61 74 65 20 61 6e 20 69 6e 2d   truncate an in-
a9e0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
a9f0: 20 20 44 65 6c 65 74 65 0a 2a 2a 20 65 76 65 72    Delete.** ever
aa00: 79 20 70 61 67 65 73 20 77 68 6f 73 65 20 70 67  y pages whose pg
aa10: 6e 6f 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  no is larger tha
aa20: 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  n pPager->dbSize
aa30: 20 61 6e 64 20 69 73 20 75 6e 72 65 66 65 72 65   and is unrefere
aa40: 6e 63 65 64 2e 0a 2a 2a 20 52 65 66 65 72 65 6e  nced..** Referen
aa50: 63 65 64 20 70 61 67 65 73 20 6c 61 72 67 65 72  ced pages larger
aa60: 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62   than pPager->db
aa70: 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e  Size are zeroed.
aa80: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
aa90: 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 50  memoryTruncate(P
aaa0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
aab0: 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 50   PgHdr *pPg;.  P
aac0: 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69  gHdr **ppPg;.  i
aad0: 6e 74 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67  nt dbSize = pPag
aae0: 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70  er->dbSize;..  p
aaf0: 70 50 67 20 3d 20 26 70 50 61 67 65 72 2d 3e 70  pPg = &pPager->p
ab00: 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 70  All;.  while( (p
ab10: 50 67 20 3d 20 2a 70 70 50 67 29 21 3d 30 20 29  Pg = *ppPg)!=0 )
ab20: 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  {.    if( pPg->p
ab30: 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20  gno<=dbSize ){. 
ab40: 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67       ppPg = &pPg
ab50: 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
ab60: 7d 65 6c 73 65 20 69 66 28 20 70 50 67 2d 3e 6e  }else if( pPg->n
ab70: 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d  Ref>0 ){.      m
ab80: 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44  emset(PGHDR_TO_D
ab90: 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61  ATA(pPg), 0, pPa
aba0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
abb0: 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50        ppPg = &pP
abc0: 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
abd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70   }else{.      *p
abe0: 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  pPg = pPg->pNext
abf0: 41 6c 6c 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e  All;.      unlin
ac00: 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  kPage(pPg);.    
ac10: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67    sqliteFree(pPg
ac20: 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
ac30: 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a  >nPage--;.    }.
ac40: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75    }.}../*.** Tru
ac50: 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74  ncate the file t
ac60: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
ac70: 70 61 67 65 73 20 73 70 65 63 69 66 69 65 64 2e  pages specified.
ac80: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
ac90: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
aca0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
acb0: 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  o nPage){.  int 
acc0: 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  rc;.  if( pPager
acd0: 2d 3e 64 62 53 69 7a 65 3c 30 20 29 7b 0a 20 20  ->dbSize<0 ){.  
ace0: 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70    sqlite3pager_p
acf0: 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
ad00: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
ad10: 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29  er->errMask!=0 )
ad20: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
ad30: 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29  _errcode(pPager)
ad40: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
ad50: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65  .  }.  if( nPage
ad60: 3e 3d 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67  >=(unsigned)pPag
ad70: 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
ad80: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ad90: 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  OK;.  }.  if( pP
ada0: 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
adb0: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
adc0: 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 6d  e = nPage;.    m
add0: 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50  emoryTruncate(pP
ade0: 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
adf0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
ae00: 0a 20 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70  .  syncJournal(p
ae10: 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 72 63 20  Pager, 0);.  rc 
ae20: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
ae30: 61 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ate(&pPager->fd,
ae40: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
ae50: 45 2a 28 6f 66 66 5f 74 29 6e 50 61 67 65 29 3b  E*(off_t)nPage);
ae60: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
ae70: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
ae80: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61  er->dbSize = nPa
ae90: 67 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ge;.  }.  return
aea0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68   rc;.}../*.** Sh
aeb0: 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20  utdown the page 
aec0: 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c  cache.  Free all
aed0: 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73   memory and clos
aee0: 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  e all files..**.
aef0: 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
af00: 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72  ion was in progr
af10: 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ess when this ro
af20: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
af30: 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63   that.** transac
af40: 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
af50: 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61  ack.  All outsta
af60: 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
af70: 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61  invalidated.** a
af80: 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  nd their memory 
af90: 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61  is freed.  Any a
afa0: 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
afb0: 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a  page associated.
afc0: 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ** with this pag
afd0: 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  e cache after th
afe0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
aff0: 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  rns will likely.
b000: 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ** result in a c
b010: 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 69 6e 74 20  oredump..*/.int 
b020: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f  sqlite3pager_clo
b030: 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  se(Pager *pPager
b040: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c  ){.  PgHdr *pPg,
b050: 20 2a 70 4e 65 78 74 3b 0a 20 20 73 77 69 74 63   *pNext;.  switc
b060: 68 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  h( pPager->state
b070: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47   ){.    case PAG
b080: 45 52 5f 52 45 53 45 52 56 45 44 3a 0a 20 20 20  ER_RESERVED:.   
b090: 20 63 61 73 65 20 50 41 47 45 52 5f 45 58 43 4c   case PAGER_EXCL
b0a0: 55 53 49 56 45 3a 20 7b 0a 20 20 20 20 20 20 73  USIVE: {.      s
b0b0: 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
b0c0: 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
b0d0: 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
b0e0: 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20  >memDb ){.      
b0f0: 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63    sqlite3OsUnloc
b100: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  k(&pPager->fd, N
b110: 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  O_LOCK);.      }
b120: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
b130: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
b140: 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  en==0 );.      b
b150: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
b160: 63 61 73 65 20 50 41 47 45 52 5f 53 48 41 52 45  case PAGER_SHARE
b170: 44 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 21  D: {.      if( !
b180: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
b190: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b1a0: 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72  OsUnlock(&pPager
b1b0: 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  ->fd, NO_LOCK);.
b1c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
b1d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
b1e0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
b1f0: 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
b200: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b210: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 50    }.  }.  for(pP
b220: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
b230: 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b  pPg; pPg=pNext){
b240: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67  .    pNext = pPg
b250: 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
b260: 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b  sqliteFree(pPg);
b270: 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
b280: 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
b290: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
b2a0: 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  &pPager->fd);.  
b2b0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
b2c0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
b2d0: 3d 30 20 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20  =0 );.  /* Temp 
b2e0: 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f 6d 61  files are automa
b2f0: 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
b300: 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69  by the OS.  ** i
b310: 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
b320: 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71  ile ){.  **   sq
b330: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
b340: 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
b350: 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 20 20  ;.  ** }.  */.  
b360: 43 4c 52 5f 50 41 47 45 52 28 70 50 61 67 65 72  CLR_PAGER(pPager
b370: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
b380: 3e 7a 46 69 6c 65 6e 61 6d 65 21 3d 28 63 68 61  >zFilename!=(cha
b390: 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 20 29 7b  r*)&pPager[1] ){
b3a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29  .    assert( 0 )
b3b0: 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 70  ;  /* Cannot hap
b3c0: 70 65 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  pen */.    sqlit
b3d0: 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 7a 46  eFree(pPager->zF
b3e0: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ilename);.    sq
b3f0: 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
b400: 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  >zJournal);.    
b410: 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
b420: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b 0a  r->zDirectory);.
b430: 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
b440: 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
b450: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
b460: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
b470: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
b480: 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  r the given page
b490: 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73   data..*/.Pgno s
b4a0: 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65  qlite3pager_page
b4b0: 6e 75 6d 62 65 72 28 76 6f 69 64 20 2a 70 44 61  number(void *pDa
b4c0: 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20  ta){.  PgHdr *p 
b4d0: 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
b4e0: 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e  pData);.  return
b4f0: 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a   p->pgno;.}../*.
b500: 2a 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66 28  ** The page_ref(
b510: 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65  ) function incre
b520: 6d 65 6e 74 73 20 74 68 65 20 72 65 66 65 72 65  ments the refere
b530: 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  nce count for a 
b540: 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20  page..** If the 
b550: 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c  page is currentl
b560: 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  y on the freelis
b570: 74 20 28 74 68 65 20 72 65 66 65 72 65 6e 63 65  t (the reference
b580: 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20   count is zero) 
b590: 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69  then.** remove i
b5a0: 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  t from the freel
b5b0: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e  ist..**.** For n
b5c0: 6f 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73 2c  on-test systems,
b5d0: 20 70 61 67 65 5f 72 65 66 28 29 20 69 73 20 61   page_ref() is a
b5e0: 20 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c 6c   macro that call
b5f0: 73 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a  s _page_ref().**
b600: 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20 72   online of the r
b610: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69  eference count i
b620: 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65 73  s zero.  For tes
b630: 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f  t systems, page_
b640: 72 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72 65  ref().** is a re
b650: 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74  al function so t
b660: 68 61 74 20 77 65 20 63 61 6e 20 73 65 74 20 62  hat we can set b
b670: 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74  reakpoints and t
b680: 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74  race it..*/.stat
b690: 69 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65  ic void _page_re
b6a0: 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  f(PgHdr *pPg){. 
b6b0: 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
b6c0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
b6d0: 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c  page is currentl
b6e0: 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  y on the freelis
b6f0: 74 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a  t.  Remove it. *
b700: 2f 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70  /.    if( pPg==p
b710: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72  Pg->pPager->pFir
b720: 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20  stSynced ){.    
b730: 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67    PgHdr *p = pPg
b740: 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
b750: 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70     while( p && p
b760: 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20  ->needSync ){ p 
b770: 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20  = p->pNextFree; 
b780: 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  }.      pPg->pPa
b790: 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
b7a0: 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20  d = p;.    }.   
b7b0: 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46   if( pPg->pPrevF
b7c0: 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67  ree ){.      pPg
b7d0: 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65  ->pPrevFree->pNe
b7e0: 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e  xtFree = pPg->pN
b7f0: 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c  extFree;.    }el
b800: 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  se{.      pPg->p
b810: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
b820: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
b830: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
b840: 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a  g->pNextFree ){.
b850: 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
b860: 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20  Free->pPrevFree 
b870: 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
b880: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
b890: 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
b8a0: 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72  pLast = pPg->pPr
b8b0: 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20  evFree;.    }.  
b8c0: 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e    pPg->pPager->n
b8d0: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67  Ref++;.  }.  pPg
b8e0: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49  ->nRef++;.  REFI
b8f0: 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64  NFO(pPg);.}.#ifd
b900: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
b910: 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67   static void pag
b920: 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67  e_ref(PgHdr *pPg
b930: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  ){.    if( pPg->
b940: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
b950: 20 5f 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b   _page_ref(pPg);
b960: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b970: 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pPg->nRef++;. 
b980: 20 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67       REFINFO(pPg
b990: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  );.    }.  }.#el
b9a0: 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  se.# define page
b9b0: 5f 72 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e  _ref(P)   ((P)->
b9c0: 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65  nRef==0?_page_re
b9d0: 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e  f(P):(void)(P)->
b9e0: 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a  nRef++).#endif..
b9f0: 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20  /*.** Increment 
ba00: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
ba10: 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20  unt for a page. 
ba20: 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74   The input point
ba30: 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72  er is.** a refer
ba40: 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
ba50: 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71   data..*/.int sq
ba60: 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66 28 76  lite3pager_ref(v
ba70: 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
ba80: 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41  gHdr *pPg = DATA
ba90: 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
baa0: 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67  ;.  page_ref(pPg
bab0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
bac0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
bad0: 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
bae0: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
baf0: 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  s, make sure all
bb00: 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20   the pages that 
bb10: 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69  have.** been wri
bb20: 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
bb30: 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c  nal have actuall
bb40: 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75  y reached the su
bb50: 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20  rface of the.** 
bb60: 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74  disk.  It is not
bb70: 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20   safe to modify 
bb80: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
bb90: 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c  abase file until
bba0: 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f   after.** the jo
bbb0: 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73  urnal has been s
bbc0: 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f  ynced.  If the o
bbd0: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
bbe0: 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66   is modified bef
bbf0: 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ore.** the journ
bc00: 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64  al is synced and
bc10: 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
bc20: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73   occurs, the uns
bc30: 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ynced journal.**
bc40: 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c   data would be l
bc50: 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64  ost and we would
bc60: 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f   be unable to co
bc70: 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63  mpletely rollbac
bc80: 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  k the.** databas
bc90: 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61  e changes.  Data
bca0: 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
bcb0: 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20  would occur..** 
bcc0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
bcd0: 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68   also updates th
bce0: 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20  e nRec field in 
bcf0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 74 68  the header of th
bd00: 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53  e journal..** (S
bd10: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74  ee comments on t
bd20: 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
bd30: 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  k() routine for 
bd40: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
bd50: 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74  mation.).** If t
bd60: 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20  he sync mode is 
bd70: 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20  FULL, two syncs 
bd80: 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72  will occur.  Fir
bd90: 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75  st the whole jou
bda0: 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65  rnal.** is synce
bdb0: 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63  d, then the nRec
bdc0: 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
bdd0: 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64  d, then a second
bde0: 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a   sync occurs..**
bdf0: 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  .** For temporar
be00: 79 20 64 61 74 61 62 61 73 65 73 2c 20 77 65 20  y databases, we 
be10: 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77  do not care if w
be20: 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f  e are able to ro
be30: 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20  llback.** after 
be40: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
be50: 20 73 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e   so sync occurs.
be60: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
be70: 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e  ine clears the n
be80: 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66  eedSync field of
be90: 20 65 76 65 72 79 20 70 61 67 65 20 63 75 72 72   every page curr
bea0: 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d  ent held in.** m
beb0: 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
bec0: 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
bed0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
bee0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
bef0: 74 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ter){.  PgHdr *p
bf00: 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Pg;.  int rc = S
bf10: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
bf20: 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
bf30: 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e   before modifyin
bf40: 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  g the main datab
bf50: 61 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69  ase.  ** (assumi
bf60: 6e 67 20 74 68 65 72 65 20 69 73 20 61 20 6a 6f  ng there is a jo
bf70: 75 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65 65  urnal and it nee
bf80: 64 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64 2e  ds to be synced.
bf90: 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ).  */.  if( pPa
bfa0: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 7c 7c  ger->needSync ||
bfb0: 20 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20   zMaster ){.    
bfc0: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
bfd0: 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 61  pFile ){.      a
bfe0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
bff0: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
c000: 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21      /* assert( !
c010: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
c020: 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68  ; // noSync migh
c030: 74 20 62 65 20 73 65 74 20 69 66 20 73 79 6e 63  t be set if sync
c040: 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a  hronous.      **
c050: 20 77 61 73 20 74 75 72 6e 65 64 20 6f 66 66 20   was turned off 
c060: 61 66 74 65 72 20 74 68 65 20 74 72 61 6e 73 61  after the transa
c070: 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65  ction was starte
c080: 64 2e 20 20 54 69 63 6b 65 74 20 23 36 31 35 20  d.  Ticket #615 
c090: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
c0a0: 47 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  G.      {.      
c0b0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
c0c0: 68 65 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20  he pPager->nRec 
c0d0: 63 6f 75 6e 74 65 72 20 77 65 20 61 72 65 20 6b  counter we are k
c0e0: 65 65 70 69 6e 67 20 61 67 72 65 65 73 0a 20 20  eeping agrees.  
c0f0: 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68        ** with th
c100: 65 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  e nRec computed 
c110: 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66  from the size of
c120: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
c130: 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
c140: 20 20 20 20 20 20 6f 66 66 5f 74 20 68 64 72 53        off_t hdrS
c150: 7a 2c 20 70 67 53 7a 2c 20 6a 53 7a 3b 0a 20 20  z, pgSz, jSz;.  
c160: 20 20 20 20 20 20 68 64 72 53 7a 20 3d 20 4a 4f        hdrSz = JO
c170: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
c180: 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 67  ger);.        pg
c190: 53 7a 20 3d 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  Sz = JOURNAL_PG_
c1a0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  SZ(pPager);.    
c1b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
c1c0: 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67  OsFileSize(&pPag
c1d0: 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a  er->jfd, &jSz);.
c1e0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
c1f0: 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
c200: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
c210: 50 61 67 65 72 2d 3e 6e 52 65 63 2a 70 67 53 7a  Pager->nRec*pgSz
c220: 2b 68 64 72 53 7a 3d 3d 6a 53 7a 20 29 3b 0a 20  +hdrSz==jSz );. 
c230: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
c240: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a      {.        /*
c250: 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20   Write the nRec 
c260: 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a  value into the j
c270: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64  ournal file head
c280: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66  er */.        of
c290: 66 5f 74 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20  f_t szJ;.       
c2a0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
c2b0: 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  lSync ){.       
c2c0: 20 20 20 54 52 41 43 45 32 28 22 53 59 4e 43 20     TRACE2("SYNC 
c2d0: 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
c2e0: 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b  , pPager->fd.h);
c2f0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
c300: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 26 70  sqlite3OsSync(&p
c310: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
c320: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
c330: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
c340: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c350: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
c360: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 73 69 7a 65  Pager->jfd, size
c370: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
c380: 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
c390: 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50   write32bits(&pP
c3a0: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
c3b0: 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20  r->nRec);.      
c3c0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
c3d0: 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 20 2f  n rc;..        /
c3e0: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65  * Write the name
c3f0: 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
c400: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 6f  ournal file if o
c410: 6e 65 20 69 73 20 73 70 65 63 69 66 69 65 64 20  ne is specified 
c420: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  */.        if( z
c430: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Master ){.      
c440: 20 20 20 20 61 73 73 65 72 74 28 20 73 74 72 6c      assert( strl
c450: 65 6e 28 7a 4d 61 73 74 65 72 29 3c 70 50 61 67  en(zMaster)<pPag
c460: 65 72 2d 3e 6e 4d 61 73 74 65 72 20 29 3b 0a 20  er->nMaster );. 
c470: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
c480: 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
c490: 67 65 72 2d 3e 6a 66 64 2c 20 32 30 29 3b 0a 20  ger->jfd, 20);. 
c4a0: 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
c4b0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
c4c0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
c4d0: 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67  te3OsWrite(&pPag
c4e0: 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
c4f0: 2c 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72  , strlen(zMaster
c500: 29 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )+1);.          
c510: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
c520: 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  rc;.        }.. 
c530: 20 20 20 20 20 20 20 73 7a 4a 20 3d 20 4a 4f 55         szJ = JOU
c540: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
c550: 65 72 29 20 2b 20 20 70 50 61 67 65 72 2d 3e 6e  er) +  pPager->n
c560: 52 65 63 2a 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  Rec*JOURNAL_PG_S
c570: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  Z(pPager);.     
c580: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b     sqlite3OsSeek
c590: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 73  (&pPager->jfd, s
c5a0: 7a 4a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  zJ);.      }.   
c5b0: 20 20 20 54 52 41 43 45 32 28 22 53 59 4e 43 20     TRACE2("SYNC 
c5c0: 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
c5d0: 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b  , pPager->fd.h);
c5e0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
c5f0: 74 65 33 4f 73 53 79 6e 63 28 26 70 50 61 67 65  te3OsSync(&pPage
c600: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69  r->jfd);.      i
c610: 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72  f( rc!=0 ) retur
c620: 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61 67  n rc;.      pPag
c630: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
c640: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
c650: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
c660: 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  nc = 0;..    /* 
c670: 45 72 61 73 65 20 74 68 65 20 6e 65 65 64 53 79  Erase the needSy
c680: 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65  nc flag from eve
c690: 72 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  ry page..    */.
c6a0: 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
c6b0: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
c6c0: 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
c6d0: 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  ){.      pPg->ne
c6e0: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
c6f0: 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46  }.    pPager->pF
c700: 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61  irstSynced = pPa
c710: 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d  ger->pFirst;.  }
c720: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
c730: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 50 61 67  .  /* If the Pag
c740: 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
c750: 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 74   is clear then t
c760: 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
c770: 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74  c.  ** flag must
c780: 20 61 6c 73 6f 20 62 65 20 63 6c 65 61 72 20 66   also be clear f
c790: 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e 20 20 56  or all pages.  V
c7a0: 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 0a  erify that this.
c7b0: 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20 69    ** invariant i
c7c0: 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65  s true..  */.  e
c7d0: 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 50 67  lse{.    for(pPg
c7e0: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
c7f0: 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
c800: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73  xtAll){.      as
c810: 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53  sert( pPg->needS
c820: 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  ync==0 );.    }.
c830: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
c840: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
c850: 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ==pPager->pFirst
c860: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
c870: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
c880: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69  /*.** Given a li
c890: 73 74 20 6f 66 20 70 61 67 65 73 20 28 63 6f 6e  st of pages (con
c8a0: 6e 65 63 74 65 64 20 62 79 20 74 68 65 20 50 67  nected by the Pg
c8b0: 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74  Hdr.pDirty point
c8c0: 65 72 29 20 77 72 69 74 65 0a 2a 2a 20 65 76 65  er) write.** eve
c8d0: 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  ry one of those 
c8e0: 70 61 67 65 73 20 6f 75 74 20 74 6f 20 74 68 65  pages out to the
c8f0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
c900: 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c  nd mark them all
c910: 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f  .** as clean..*/
c920: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
c930: 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
c940: 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a  (PgHdr *pList){.
c950: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
c960: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
c970: 20 62 75 73 79 20 3d 20 31 3b 0a 0a 20 20 69 66   busy = 1;..  if
c980: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
c990: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
c9a0: 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d   pPager = pList-
c9b0: 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41  >pPager;..  /* A
c9c0: 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
c9d0: 72 65 20 6d 61 79 20 62 65 20 65 69 74 68 65 72  re may be either
c9e0: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
c9f0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
ca00: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
ca10: 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  se file. If ther
ca20: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20  e is already an 
ca30: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20  EXCLUSIVE lock, 
ca40: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
ca50: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
ca60: 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20  te3OsLock() are 
ca70: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a  no-ops..  **.  *
ca80: 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63  * Moving the loc
ca90: 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20  k from RESERVED 
caa0: 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63 74  to EXCLUSIVE act
cab0: 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67  ually involves g
cac0: 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67  oing.  ** throug
cad0: 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74  h an intermediat
cae0: 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e  e state PENDING.
caf0: 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63     A PENDING loc
cb00: 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20  k prevents new. 
cb10: 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d   ** readers from
cb20: 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68   attaching to th
cb30: 65 20 64 61 74 61 62 61 73 65 20 62 75 74 20 69  e database but i
cb40: 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66  s unsufficient f
cb50: 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72  or us to.  ** wr
cb60: 69 74 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f  ite.  The idea o
cb70: 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  f a PENDING lock
cb80: 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e   is to prevent n
cb90: 65 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a  ew readers from.
cba0: 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77    ** coming in w
cbb0: 68 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72  hile we wait for
cbc0: 20 65 78 69 73 74 69 6e 67 20 72 65 61 64 65 72   existing reader
cbd0: 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a  s to clear..  **
cbe0: 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20  .  ** While the 
cbf0: 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
cc00: 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
cc10: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
cc20: 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20  abase file.  ** 
cc30: 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  is unchanged and
cc40: 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b   we can rollback
cc50: 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
cc60: 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a  to playback the.
cc70: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74    ** journal int
cc80: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  o the original d
cc90: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f  atabase file.  O
cca0: 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f  nce we transitio
ccb0: 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53  n to.  ** EXCLUS
ccc0: 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  IVE, it means th
ccd0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
cce0: 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64  has been changed
ccf0: 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63   and any rollbac
cd00: 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75  k.  ** will requ
cd10: 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c  ire a journal pl
cd20: 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 64  ayback..  */.  d
cd30: 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  o {.    rc = sql
cd40: 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67  ite3OsLock(&pPag
cd50: 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56  er->fd, EXCLUSIV
cd60: 45 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 77 68 69 6c  E_LOCK);.  }whil
cd70: 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
cd80: 53 59 20 26 26 20 0a 20 20 20 20 20 20 70 50 61  SY && .      pPa
cd90: 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
cda0: 72 20 26 26 20 0a 20 20 20 20 20 20 70 50 61 67  r && .      pPag
cdb0: 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
cdc0: 2d 3e 78 46 75 6e 63 20 26 26 20 0a 20 20 20 20  ->xFunc && .    
cdd0: 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48    pPager->pBusyH
cde0: 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 28 70 50  andler->xFunc(pP
cdf0: 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
ce00: 65 72 2d 3e 70 41 72 67 2c 20 22 22 2c 20 62 75  er->pArg, "", bu
ce10: 73 79 2b 2b 29 0a 20 20 29 3b 0a 20 20 69 66 28  sy++).  );.  if(
ce20: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
ce30: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
ce40: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
ce50: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
ce60: 4c 55 53 49 56 45 3b 0a 0a 20 20 77 68 69 6c 65  LUSIVE;..  while
ce70: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 61  ( pList ){.    a
ce80: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 64 69  ssert( pList->di
ce90: 72 74 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  rty );.    sqlit
cea0: 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
ceb0: 2d 3e 66 64 2c 20 28 70 4c 69 73 74 2d 3e 70 67  ->fd, (pList->pg
cec0: 6e 6f 2d 31 29 2a 28 6f 66 66 5f 74 29 53 51 4c  no-1)*(off_t)SQL
ced0: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
cee0: 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72      CODEC(pPager
cef0: 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
cf00: 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70  pList), pList->p
cf10: 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 54 52 41  gno, 6);.    TRA
cf20: 43 45 32 28 22 53 54 4f 52 45 20 70 61 67 65 20  CE2("STORE page 
cf30: 25 64 5c 6e 22 2c 20 70 4c 69 73 74 2d 3e 70 67  %d\n", pList->pg
cf40: 6e 6f 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  no);.    rc = sq
cf50: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50  lite3OsWrite(&pP
cf60: 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f  ager->fd, PGHDR_
cf70: 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20  TO_DATA(pList), 
cf80: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
cf90: 29 3b 0a 20 20 20 20 43 4f 44 45 43 28 70 50 61  );.    CODEC(pPa
cfa0: 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  ger, PGHDR_TO_DA
cfb0: 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69 73 74  TA(pList), pList
cfc0: 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20  ->pgno, 0);.    
cfd0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
cfe0: 72 63 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 64  rc;.    pList->d
cff0: 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 4c  irty = 0;.    pL
d000: 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ist = pList->pDi
d010: 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rty;.  }.  retur
d020: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d030: 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76  /*.** Collect ev
d040: 65 72 79 20 64 69 72 74 79 20 70 61 67 65 20 69  ery dirty page i
d050: 6e 74 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74  nto a dirty list
d060: 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61   and.** return a
d070: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
d080: 68 65 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73  head of that lis
d090: 74 2e 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72  t.  All pages ar
d0a0: 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65  e.** collected e
d0b0: 76 65 6e 20 69 66 20 74 68 65 79 20 61 72 65 20  ven if they are 
d0c0: 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f  still in use..*/
d0d0: 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70  .static PgHdr *p
d0e0: 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
d0f0: 74 79 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a  ty_pages(Pager *
d100: 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
d110: 20 2a 70 2c 20 2a 70 4c 69 73 74 3b 0a 20 20 70   *p, *pList;.  p
d120: 4c 69 73 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28  List = 0;.  for(
d130: 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  p=pPager->pAll; 
d140: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c  p; p=p->pNextAll
d150: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 69  ){.    if( p->di
d160: 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  rty ){.      p->
d170: 70 44 69 72 74 79 20 3d 20 70 4c 69 73 74 3b 0a  pDirty = pList;.
d180: 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 3b        pList = p;
d190: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
d1a0: 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
d1b0: 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
d1c0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64  ge..**.** A read
d1d0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73   lock on the dis
d1e0: 6b 20 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e  k file is obtain
d1f0: 65 64 20 77 68 65 6e 20 74 68 65 20 66 69 72 73  ed when the firs
d200: 74 20 70 61 67 65 20 69 73 20 61 63 71 75 69 72  t page is acquir
d210: 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61  ed. .** This rea
d220: 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65  d lock is droppe
d230: 64 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  d when the last 
d240: 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64  page is released
d250: 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f 67 65 74 20 77  ..**.** A _get w
d260: 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70 61 67  orks for any pag
d270: 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  e number greater
d280: 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74 68 65   than 0.  If the
d290: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
d2a0: 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  e is smaller tha
d2b0: 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
d2c0: 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63  page, then no ac
d2d0: 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61  tual disk.** rea
d2e0: 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  d occurs and the
d2f0: 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66   memory image of
d300: 20 74 68 65 20 70 61 67 65 20 69 73 20 69 6e 69   the page is ini
d310: 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61  tialized to.** a
d320: 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65 20 65  ll zeros.  The e
d330: 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64  xtra data append
d340: 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20  ed to a page is 
d350: 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
d360: 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74  ed.** to zeros t
d370: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 20  he first time a 
d380: 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69  page is loaded i
d390: 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a  nto memory..**.*
d3a0: 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f  * The acquisitio
d3b0: 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72  n might fail for
d3c0: 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73   several reasons
d3d0: 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c  .  In all cases,
d3e0: 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61  .** an appropria
d3f0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
d400: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
d410: 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
d420: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  NULL..**.** See 
d430: 61 6c 73 6f 20 73 71 6c 69 74 65 33 70 61 67 65  also sqlite3page
d440: 72 5f 6c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74  r_lookup().  Bot
d450: 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  h this routine a
d460: 6e 64 20 5f 6c 6f 6f 6b 75 70 28 29 20 61 74 74  nd _lookup() att
d470: 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20  empt.** to find 
d480: 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e  a page in the in
d490: 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69  -memory cache fi
d4a0: 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67  rst.  If the pag
d4b0: 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
d4c0: 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74  .** in memory, t
d4d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  his routine goes
d4e0: 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64   to disk to read
d4f0: 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 5f   it in whereas _
d500: 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74  lookup().** just
d510: 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69   returns 0.  Thi
d520: 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72  s routine acquir
d530: 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74  es a read-lock t
d540: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74  he first time it
d550: 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f  .** has to go to
d560: 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64   disk, and could
d570: 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61   also playback a
d580: 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66  n old journal if
d590: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53   necessary..** S
d5a0: 69 6e 63 65 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e  ince _lookup() n
d5b0: 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73  ever goes to dis
d5c0: 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20  k, it never has 
d5d0: 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63  to deal with loc
d5e0: 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c  ks.** or journal
d5f0: 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
d600: 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
d610: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
d620: 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a  gno pgno, void *
d630: 2a 70 70 50 61 67 65 29 7b 0a 20 20 50 67 48 64  *ppPage){.  PgHd
d640: 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
d650: 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
d660: 65 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69  e we have not hi
d670: 74 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65  t any critical e
d680: 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61  rrors..  */ .  a
d690: 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
d6a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
d6b0: 6e 6f 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61  no!=0 );.  *ppPa
d6c0: 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  ge = 0;.  if( pP
d6d0: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
d6e0: 7e 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  ~(PAGER_ERR_FULL
d6f0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
d700: 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
d710: 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
d720: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
d730: 66 69 72 73 74 20 70 61 67 65 20 61 63 63 65 73  first page acces
d740: 73 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20  sed, then get a 
d750: 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a  SHARED lock.  **
d760: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
d770: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
d780: 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d  ( pPager->nRef==
d790: 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6d 65  0 && !pPager->me
d7a0: 6d 44 62 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  mDb ){.    int b
d7b0: 75 73 79 20 3d 20 31 3b 0a 20 20 20 20 64 6f 20  usy = 1;.    do 
d7c0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
d7d0: 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67  ite3OsLock(&pPag
d7e0: 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c  er->fd, SHARED_L
d7f0: 4f 43 4b 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  OCK);.    }while
d800: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
d810: 59 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50  Y && .        pP
d820: 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
d830: 65 72 20 26 26 20 0a 20 20 20 20 20 20 20 20 70  er && .        p
d840: 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
d850: 6c 65 72 2d 3e 78 46 75 6e 63 20 26 26 20 0a 20  ler->xFunc && . 
d860: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
d870: 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75  BusyHandler->xFu
d880: 6e 63 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79  nc(pPager->pBusy
d890: 48 61 6e 64 6c 65 72 2d 3e 70 41 72 67 2c 20 22  Handler->pArg, "
d8a0: 22 2c 20 62 75 73 79 2b 2b 29 0a 20 20 20 20 29  ", busy++).    )
d8b0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
d8c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
d8d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
d8e0: 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  }.    pPager->st
d8f0: 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
d900: 45 44 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61  ED;..    /* If a
d910: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
d920: 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20  ists, and there 
d930: 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c  is no RESERVED l
d940: 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
d950: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
d960: 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20   then it either 
d970: 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
d980: 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74  ed back or delet
d990: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
d9a0: 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  f( pPager->useJo
d9b0: 75 72 6e 61 6c 20 26 26 20 0a 20 20 20 20 20 20  urnal && .      
d9c0: 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45    sqlite3OsFileE
d9d0: 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a  xists(pPager->zJ
d9e0: 6f 75 72 6e 61 6c 29 20 26 26 0a 20 20 20 20 20  ournal) &&.     
d9f0: 20 20 20 21 73 71 6c 69 74 65 33 4f 73 43 68 65     !sqlite3OsChe
da00: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 26  ckReservedLock(&
da10: 70 50 61 67 65 72 2d 3e 66 64 29 20 0a 20 20 20  pPager->fd) .   
da20: 20 29 7b 0a 20 20 20 20 20 20 20 69 6e 74 20 72   ){.       int r
da30: 63 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 47 65  c;..       /* Ge
da40: 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
da50: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
da60: 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
da70: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
da80: 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  OsLock(&pPager->
da90: 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  fd, EXCLUSIVE_LO
daa0: 43 4b 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20  CK);.       if( 
dab0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
dac0: 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
dad0: 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  3OsUnlock(&pPage
dae0: 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
daf0: 0a 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72  .         pPager
db00: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
db10: 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  UNLOCK;.        
db20: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
db30: 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67     }.       pPag
db40: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
db50: 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 0a 20 20  R_EXCLUSIVE;..  
db60: 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65       /* Open the
db70: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61   journal for rea
db80: 64 69 6e 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75  ding only.  Retu
db90: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  rn SQLITE_BUSY i
dba0: 66 0a 20 20 20 20 20 20 20 2a 2a 20 77 65 20 61  f.       ** we a
dbb0: 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  re unable to ope
dbc0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
dbd0: 6c 65 2e 20 0a 20 20 20 20 20 20 20 2a 2a 0a 20  le. .       **. 
dbe0: 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75        ** The jou
dbf0: 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  rnal file does n
dc00: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f  ot need to be lo
dc10: 63 6b 65 64 20 69 74 73 65 6c 66 2e 20 20 54 68  cked itself.  Th
dc20: 65 0a 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  e.       ** jour
dc30: 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65  nal file is neve
dc40: 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74 68  r open unless th
dc50: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
dc60: 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20 20  file holds.     
dc70: 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63    ** a write loc
dc80: 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e  k, so there is n
dc90: 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63 65 20  ever any chance 
dca0: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20  of two or more. 
dcb0: 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
dcc0: 65 73 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a  es opening the j
dcd0: 6f 75 72 6e 61 6c 20 61 74 20 74 68 65 20 73 61  ournal at the sa
dce0: 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20  me time..       
dcf0: 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73  */.       rc = s
dd00: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
dd10: 4f 6e 6c 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  Only(pPager->zJo
dd20: 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e  urnal, &pPager->
dd30: 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 69 66 28  jfd);.       if(
dd40: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
dd50: 7b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  {.         sqlit
dd60: 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67  e3OsUnlock(&pPag
dd70: 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
dd80: 3b 0a 20 20 20 20 20 20 20 20 20 70 50 61 67 65  ;.         pPage
dd90: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
dda0: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
ddb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ddc0: 42 55 53 59 3b 0a 20 20 20 20 20 20 20 7d 0a 20  BUSY;.       }. 
ddd0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
dde0: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20  urnalOpen = 1;. 
ddf0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
de00: 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
de10: 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 50 6c 61  ;..       /* Pla
de20: 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65  yback and delete
de30: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44   the journal.  D
de40: 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65  rop the database
de50: 20 77 72 69 74 65 0a 20 20 20 20 20 20 20 2a 2a   write.       **
de60: 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75   lock and reacqu
de70: 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ire the read loc
de80: 6b 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  k..       */.   
de90: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
dea0: 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
deb0: 30 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72  0);.       if( r
dec0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
ded0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
dee0: 72 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20  rc;.       }.   
def0: 20 7d 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a   }.    pPg = 0;.
df00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
df10: 53 65 61 72 63 68 20 66 6f 72 20 70 61 67 65 20  Search for page 
df20: 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 20 20  in cache */.    
df30: 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
df40: 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
df50: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
df60: 2d 3e 6d 65 6d 44 62 20 26 26 20 70 50 61 67 65  ->memDb && pPage
df70: 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
df80: 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  UNLOCK ){.      
df90: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
dfa0: 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
dfb0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50    }.  }.  if( pP
dfc0: 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  g==0 ){.    /* T
dfd0: 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
dfe0: 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  e is not in the 
dff0: 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20  page cache. */. 
e000: 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 70 50     int h;.    pP
e010: 61 67 65 72 2d 3e 6e 4d 69 73 73 2b 2b 3b 0a 20  ager->nMiss++;. 
e020: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
e030: 50 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50  Page<pPager->mxP
e040: 61 67 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70  age || pPager->p
e050: 46 69 72 73 74 3d 3d 30 20 7c 7c 20 70 50 61 67  First==0 || pPag
e060: 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
e070: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e     /* Create a n
e080: 65 77 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ew page */.     
e090: 20 70 50 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c   pPg = sqliteMal
e0a0: 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a  locRaw( sizeof(*
e0b0: 70 50 67 29 20 2b 20 53 51 4c 49 54 45 5f 50 41  pPg) + SQLITE_PA
e0c0: 47 45 5f 53 49 5a 45 20 0a 20 20 20 20 20 20 20  GE_SIZE .       
e0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0e0: 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28         + sizeof(
e0f0: 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e  u32) + pPager->n
e100: 45 78 74 72 61 0a 20 20 20 20 20 20 20 20 20 20  Extra.          
e110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e120: 20 20 20 20 2b 20 70 50 61 67 65 72 2d 3e 6d 65      + pPager->me
e130: 6d 44 62 2a 73 69 7a 65 6f 66 28 50 67 48 69 73  mDb*sizeof(PgHis
e140: 74 6f 72 79 29 20 29 3b 0a 20 20 20 20 20 20 69  tory) );.      i
e150: 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
e160: 20 20 20 20 20 70 61 67 65 72 5f 75 6e 77 72 69       pager_unwri
e170: 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
e180: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
e190: 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52  errMask |= PAGER
e1a0: 5f 45 52 52 5f 4d 45 4d 3b 0a 20 20 20 20 20 20  _ERR_MEM;.      
e1b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e1c0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
e1d0: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2c       memset(pPg,
e1e0: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50 67 29   0, sizeof(*pPg)
e1f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
e200: 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
e210: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
e220: 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
e230: 70 50 61 67 65 72 29 2c 20 30 2c 20 73 69 7a 65  pPager), 0, size
e240: 6f 66 28 50 67 48 69 73 74 6f 72 79 29 29 3b 0a  of(PgHistory));.
e250: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
e260: 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  g->pPager = pPag
e270: 65 72 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  er;.      pPg->p
e280: 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72  NextAll = pPager
e290: 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 20 20 70 50  ->pAll;.      pP
e2a0: 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67  ager->pAll = pPg
e2b0: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
e2c0: 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 7d 65 6c  nPage++;.    }el
e2d0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e  se{.      /* Fin
e2e0: 64 20 61 20 70 61 67 65 20 74 6f 20 72 65 63 79  d a page to recy
e2f0: 63 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63  cle.  Try to loc
e300: 61 74 65 20 61 20 70 61 67 65 20 74 68 61 74 20  ate a page that 
e310: 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a  does not.      *
e320: 2a 20 72 65 71 75 69 72 65 20 75 73 20 74 6f 20  * require us to 
e330: 64 6f 20 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e  do an fsync() on
e340: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20   the journal..  
e350: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 67      */.      pPg
e360: 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73   = pPager->pFirs
e370: 74 53 79 6e 63 65 64 3b 0a 0a 20 20 20 20 20 20  tSynced;..      
e380: 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c 64 20 6e  /* If we could n
e390: 6f 74 20 66 69 6e 64 20 61 20 70 61 67 65 20 74  ot find a page t
e3a0: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  hat does not req
e3b0: 75 69 72 65 20 61 6e 20 66 73 79 6e 63 28 29 0a  uire an fsync().
e3c0: 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
e3d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
e3e0: 6e 20 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  n fsync the jour
e3f0: 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20  nal file.  This 
e400: 69 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 76 65  is a.      ** ve
e410: 72 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f  ry slow operatio
e420: 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61  n, so we work ha
e430: 72 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20  rd to avoid it. 
e440: 20 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20   But sometimes. 
e450: 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 27 74       ** it can't
e460: 20 62 65 20 68 65 6c 70 65 64 2e 0a 20 20 20 20   be helped..    
e470: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
e480: 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Pg==0 ){.       
e490: 20 69 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f   int rc = syncJo
e4a0: 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 30 29  urnal(pPager, 0)
e4b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
e4c0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
e4d0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
e4e0: 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
e4f0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
e500: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
e510: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e520: 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70   pPg = pPager->p
e530: 46 69 72 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  First;.      }. 
e540: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
e550: 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20  ->nRef==0 );..  
e560: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
e570: 20 70 61 67 65 20 74 6f 20 74 68 65 20 64 61 74   page to the dat
e580: 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 69 74  abase file if it
e590: 20 69 73 20 64 69 72 74 79 2e 0a 20 20 20 20 20   is dirty..     
e5a0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
e5b0: 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  g->dirty ){.    
e5c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
e5d0: 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a  >needSync==0 );.
e5e0: 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 44 69          pPg->pDi
e5f0: 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rty = 0;.       
e600: 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
e610: 65 5f 70 61 67 65 6c 69 73 74 28 20 70 50 67 20  e_pagelist( pPg 
e620: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
e630: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
e640: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
e650: 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
e660: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
e670: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e680: 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20  _IOERR;.        
e690: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
e6a0: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72  assert( pPg->dir
e6b0: 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  ty==0 );..      
e6c0: 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 77  /* If the page w
e6d0: 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e 67 20  e are recycling 
e6e0: 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77  is marked as alw
e6f0: 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  aysRollback, the
e700: 6e 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74  n.      ** set t
e710: 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73  he global always
e720: 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74  Rollback flag, t
e730: 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20 74 68  hus disabling th
e740: 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  e.      ** sqlit
e750: 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  e_dont_rollback(
e760: 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66  ) optimization f
e770: 6f 72 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  or the rest of t
e780: 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  his transaction.
e790: 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20  .      ** It is 
e7a0: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 6f 20  necessary to do 
e7b0: 74 68 69 73 20 62 65 63 61 75 73 65 20 74 68 65  this because the
e7c0: 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77   page marked alw
e7d0: 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 20 20  aysRollback.    
e7e0: 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 72 65    ** might be re
e7f0: 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61 74 65  loaded at a late
e800: 72 20 74 69 6d 65 20 62 75 74 20 61 74 20 74 68  r time but at th
e810: 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e 27  at point we won'
e820: 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 20 20 20  t remember.     
e830: 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61 73 20   ** that is was 
e840: 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c  marked alwaysRol
e850: 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d 65 61  lback.  This mea
e860: 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  ns that all page
e870: 73 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20  s must.      ** 
e880: 62 65 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77  be marked as alw
e890: 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d  aysRollback from
e8a0: 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20   here on out..  
e8b0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
e8c0: 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c   pPg->alwaysRoll
e8d0: 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  back ){.        
e8e0: 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
e8f0: 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20  llback = 1;.    
e900: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55 6e    }..      /* Un
e910: 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67  link the old pag
e920: 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20  e from the free 
e930: 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68 61 73  list and the has
e940: 68 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2f  h table.      */
e950: 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67  .      unlinkPag
e960: 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50  e(pPg);.      pP
e970: 61 67 65 72 2d 3e 6e 4f 76 66 6c 2b 2b 3b 0a 20  ager->nOvfl++;. 
e980: 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 67     }.    pPg->pg
e990: 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 69  no = pgno;.    i
e9a0: 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  f( pPager->aInJo
e9b0: 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67  urnal && (int)pg
e9c0: 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67  no<=pPager->orig
e9d0: 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  DbSize ){.      
e9e0: 73 71 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f  sqlite3CheckMemo
e9f0: 72 79 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ry(pPager->aInJo
ea00: 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a  urnal, pgno/8);.
ea10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
ea20: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
ea30: 6e 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  n );.      pPg->
ea40: 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61  inJournal = (pPa
ea50: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
ea60: 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70  pgno/8] & (1<<(p
ea70: 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20  gno&7)))!=0;.   
ea80: 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
ea90: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
eaa0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
eab0: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
eac0: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
ead0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
eae0: 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
eaf0: 74 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d  t && (int)pgno<=
eb00: 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
eb10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
eb20: 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d   (pPager->aInStm
eb30: 74 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c  t[pgno/8] & (1<<
eb40: 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 20 29 7b  (pgno&7)))!=0 ){
eb50: 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f  .      page_add_
eb60: 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
eb70: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
eb80: 20 20 20 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f      page_remove_
eb90: 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70  from_stmt_list(p
eba0: 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  Pg);.    }.    p
ebb0: 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
ebc0: 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31     pPg->nRef = 1
ebd0: 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50  ;.    REFINFO(pP
ebe0: 67 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  g);.    pPager->
ebf0: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 68 20 3d 20  nRef++;.    h = 
ec00: 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29  pager_hash(pgno)
ec10: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
ec20: 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61  Hash = pPager->a
ec30: 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61  Hash[h];.    pPa
ec40: 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20  ger->aHash[h] = 
ec50: 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67  pPg;.    if( pPg
ec60: 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20  ->pNextHash ){. 
ec70: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
ec80: 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
ec90: 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
eca0: 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
ecb0: 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  h->pPrevHash = p
ecc0: 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  Pg;.    }.    if
ecd0: 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  ( pPager->nExtra
ece0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  >0 ){.      mems
ecf0: 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52  et(PGHDR_TO_EXTR
ed00: 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65  A(pPg), 0, pPage
ed10: 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  r->nExtra);.    
ed20: 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
ed30: 2d 3e 64 62 53 69 7a 65 3c 30 20 29 20 73 71 6c  ->dbSize<0 ) sql
ed40: 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
ed50: 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  unt(pPager);.   
ed60: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
ed70: 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20  Mask!=0 ){.     
ed80: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
ed90: 72 65 66 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  ref(PGHDR_TO_DAT
eda0: 41 28 70 50 67 29 29 3b 0a 20 20 20 20 20 20 72  A(pPg));.      r
edb0: 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64  c = pager_errcod
edc0: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
edd0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
ede0: 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
edf0: 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 67  ->dbSize<(int)pg
ee00: 6e 6f 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  no ){.      mems
ee10: 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  et(PGHDR_TO_DATA
ee20: 28 70 50 67 29 2c 20 30 2c 20 53 51 4c 49 54 45  (pPg), 0, SQLITE
ee30: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
ee40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
ee50: 74 20 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65  t rc;.      asse
ee60: 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  rt( pPager->memD
ee70: 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  b==0 );.      sq
ee80: 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
ee90: 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31  ger->fd, (pgno-1
eea0: 29 2a 28 6f 66 66 5f 74 29 53 51 4c 49 54 45 5f  )*(off_t)SQLITE_
eeb0: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
eec0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
eed0: 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e 66 64  Read(&pPager->fd
eee0: 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
eef0: 70 50 67 29 2c 20 53 51 4c 49 54 45 5f 50 41 47  pPg), SQLITE_PAG
ef00: 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 54  E_SIZE);.      T
ef10: 52 41 43 45 32 28 22 46 45 54 43 48 20 70 61 67  RACE2("FETCH pag
ef20: 65 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67  e %d\n", pPg->pg
ef30: 6e 6f 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43  no);.      CODEC
ef40: 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54  (pPager, PGHDR_T
ef50: 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 67  O_DATA(pPg), pPg
ef60: 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20  ->pgno, 3);.    
ef70: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
ef80: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6f  _OK ){.        o
ef90: 66 66 5f 74 20 66 69 6c 65 53 69 7a 65 3b 0a 20  ff_t fileSize;. 
efa0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
efb0: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50  e3OsFileSize(&pP
efc0: 61 67 65 72 2d 3e 66 64 2c 26 66 69 6c 65 53 69  ager->fd,&fileSi
efd0: 7a 65 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20  ze)!=SQLITE_OK. 
efe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
eff0: 20 66 69 6c 65 53 69 7a 65 3e 3d 70 67 6e 6f 2a   fileSize>=pgno*
f000: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
f010: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
f020: 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
f030: 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
f040: 50 67 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Pg));.          
f050: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
f060: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f070: 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
f080: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30  _TO_DATA(pPg), 0
f090: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
f0a0: 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ZE);.        }. 
f0b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
f0c0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
f0d0: 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
f0e0: 69 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  is in the page c
f0f0: 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61  ache. */.    pPa
f100: 67 65 72 2d 3e 6e 48 69 74 2b 2b 3b 0a 20 20 20  ger->nHit++;.   
f110: 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
f120: 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20    }.  *ppPage = 
f130: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
f140: 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  g);.  return SQL
f150: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
f160: 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20   Acquire a page 
f170: 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
f180: 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
f190: 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20  y cache.  Do.** 
f1a0: 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67  not read the pag
f1b0: 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65  e from disk.  Re
f1c0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
f1d0: 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f  o the page,.** o
f1e0: 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20  r 0 if the page 
f1f0: 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e  is not in cache.
f200: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
f210: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
f220: 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65  ().  The differe
f230: 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
f240: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20   routine.** and 
f250: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
f260: 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28  () is that _get(
f270: 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65  ) will go to the
f280: 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a   disk and read.*
f290: 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66  * in the page if
f2a0: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
f2b0: 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68   already in cach
f2c0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
f2d0: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  .** returns NULL
f2e0: 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
f2f0: 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
f300: 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72  if a disk I/O er
f310: 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72  ror .** has ever
f320: 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 76 6f   happened..*/.vo
f330: 69 64 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72  id *sqlite3pager
f340: 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  _lookup(Pager *p
f350: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
f360: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
f370: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
f380: 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
f390: 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20  t( pgno!=0 );.  
f3a0: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
f3b0: 61 73 6b 20 26 20 7e 28 50 41 47 45 52 5f 45 52  ask & ~(PAGER_ER
f3c0: 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20 20 20 72  R_FULL) ){.    r
f3d0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
f3e0: 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
f3f0: 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
f400: 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 20  .  if( pPg==0 ) 
f410: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 61 67 65  return 0;.  page
f420: 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74  _ref(pPg);.  ret
f430: 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  urn PGHDR_TO_DAT
f440: 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  A(pPg);.}../*.**
f450: 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e   Release a page.
f460: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75  .**.** If the nu
f470: 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
f480: 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  es to the page d
f490: 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  rop to zero, the
f4a0: 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73  n the.** page is
f4b0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
f4c0: 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c  U list.  When al
f4d0: 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  l references to 
f4e0: 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65  all pages.** are
f4f0: 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c   released, a rol
f500: 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64  lback occurs and
f510: 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
f520: 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20   database is.** 
f530: 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20  removed..*/.int 
f540: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
f550: 65 66 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  ef(void *pData){
f560: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
f570: 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
f580: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
f590: 6e 74 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  nt for this page
f5a0: 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 44 41  .  */.  pPg = DA
f5b0: 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
f5c0: 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  a);.  assert( pP
f5d0: 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70  g->nRef>0 );.  p
f5e0: 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45  Pg->nRef--;.  RE
f5f0: 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 2f  FINFO(pPg);..  /
f600: 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  * When the numbe
f610: 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
f620: 74 6f 20 61 20 70 61 67 65 20 72 65 61 63 68 20  to a page reach 
f630: 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a  0, call the.  **
f640: 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e 64 20   destructor and 
f650: 61 64 64 20 74 68 65 20 70 61 67 65 20 74 6f 20  add the page to 
f660: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20  the freelist..  
f670: 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  */.  if( pPg->nR
f680: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67  ef==0 ){.    Pag
f690: 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20  er *pPager;.    
f6a0: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
f6b0: 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70  ager;.    pPg->p
f6c0: 4e 65 78 74 46 72 65 65 20 3d 20 30 3b 0a 20 20  NextFree = 0;.  
f6d0: 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65    pPg->pPrevFree
f6e0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74   = pPager->pLast
f6f0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c  ;.    pPager->pL
f700: 61 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 69  ast = pPg;.    i
f710: 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65  f( pPg->pPrevFre
f720: 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  e ){.      pPg->
f730: 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74  pPrevFree->pNext
f740: 46 72 65 65 20 3d 20 70 50 67 3b 0a 20 20 20 20  Free = pPg;.    
f750: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
f760: 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50  ger->pFirst = pP
f770: 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  g;.    }.    if(
f780: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d   pPg->needSync==
f790: 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46 69  0 && pPager->pFi
f7a0: 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 29 7b 0a  rstSynced==0 ){.
f7b0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46        pPager->pF
f7c0: 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 67  irstSynced = pPg
f7d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f7e0: 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
f7f0: 74 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61  tor ){.      pPa
f800: 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
f810: 28 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  (pData, pPager->
f820: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
f830: 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  .  .    /* When 
f840: 61 6c 6c 20 70 61 67 65 73 20 72 65 61 63 68 20  all pages reach 
f850: 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 64 72  the freelist, dr
f860: 6f 70 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  op the read lock
f870: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
f880: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
f890: 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
f8a0: 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61  r->nRef--;.    a
f8b0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
f8c0: 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  Ref>=0 );.    if
f8d0: 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d  ( pPager->nRef==
f8e0: 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6d 65  0 && !pPager->me
f8f0: 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 70 61 67  mDb ){.      pag
f900: 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
f910: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
f920: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f930: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
f940: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  a journal file f
f950: 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68 65 72  or pPager.  Ther
f960: 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  e should already
f970: 20 62 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a   be a RESERVED.*
f980: 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  * or EXCLUSIVE l
f990: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
f9a0: 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68  ase file when th
f9b0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
f9c0: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lled..**.** Retu
f9d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
f9e0: 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74  everything.  Ret
f9f0: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
fa00: 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68  e and release th
fa10: 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20  e.** write lock 
fa20: 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
fa30: 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
fa40: 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e  c int pager_open
fa50: 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  _journal(Pager *
fa60: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
fa70: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  c;.  assert( pPa
fa80: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
fa90: 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
faa0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
fab0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
fac0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
fad0: 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
fae0: 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72  ;.  sqlite3pager
faf0: 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  _pagecount(pPage
fb00: 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49  r);.  pPager->aI
fb10: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
fb20: 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d  eMalloc( pPager-
fb30: 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b  >dbSize/8 + 1 );
fb40: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
fb50: 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a  InJournal==0 ){.
fb60: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c      sqlite3OsUnl
fb70: 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
fb80: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
fb90: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
fba0: 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
fbb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fbc0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
fbd0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
fbe0: 65 6e 45 78 63 6c 75 73 69 76 65 28 70 50 61 67  enExclusive(pPag
fbf0: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70  er->zJournal, &p
fc00: 50 61 67 65 72 2d 3e 6a 66 64 2c 70 50 61 67 65  Pager->jfd,pPage
fc10: 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
fc20: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
fc30: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  K ){.    sqliteF
fc40: 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ree(pPager->aInJ
fc50: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61  ournal);.    pPa
fc60: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
fc70: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
fc80: 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72  OsUnlock(&pPager
fc90: 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
fca0: 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  K);.    pPager->
fcb0: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
fcc0: 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  ARED;.    return
fcd0: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
fce0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f  ;.  }.  sqlite3O
fcf0: 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70  sOpenDirectory(p
fd00: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
fd10: 79 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  y, &pPager->jfd)
fd20: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
fd30: 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70  nalOpen = 1;.  p
fd40: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
fd50: 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 70 50 61  arted = 0;.  pPa
fd60: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
fd70: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c 77  0;.  pPager->alw
fd80: 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b  aysRollback = 0;
fd90: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20  .  pPager->nRec 
fda0: 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 0;.  if( pPage
fdb0: 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b  r->errMask!=0 ){
fdc0: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
fdd0: 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
fde0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
fdf0: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72    }.  pPager->or
fe00: 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65  igDbSize = pPage
fe10: 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 2f 2a  r->dbSize;..  /*
fe20: 20 43 72 65 61 74 65 20 74 68 65 20 68 65 61 64   Create the head
fe30: 65 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  er for the journ
fe40: 61 6c 3a 0a 20 20 2a 2a 20 2d 20 38 20 62 79 74  al:.  ** - 8 byt
fe50: 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69  es: Magic identi
fe60: 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f  fying journal fo
fe70: 72 6d 61 74 2e 0a 20 20 2a 2a 20 2d 20 34 20 62  rmat..  ** - 4 b
fe80: 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20  ytes: Number of 
fe90: 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e  records in journ
fea0: 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e  al, or -1 no-syn
feb0: 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 20 20  c mode is on..  
fec0: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4d 61  ** - 4 bytes: Ma
fed0: 67 69 63 20 75 73 65 64 20 66 6f 72 20 70 61 67  gic used for pag
fee0: 65 20 63 68 65 63 6b 73 75 6d 73 2e 0a 20 20 2a  e checksums..  *
fef0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69  * - 4 bytes: Ini
ff00: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61  tial database pa
ff10: 67 65 20 63 6f 75 6e 74 2e 0a 20 20 2a 2a 20 2d  ge count..  ** -
ff20: 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72   4 bytes: Number
ff30: 20 6f 66 20 62 79 74 65 73 20 72 65 73 65 72 76   of bytes reserv
ff40: 65 64 20 66 6f 72 20 6d 61 73 74 65 72 20 6a 6f  ed for master jo
ff50: 75 72 6e 61 6c 20 70 74 72 20 28 6e 4d 61 73 74  urnal ptr (nMast
ff60: 65 72 29 0a 20 20 2a 2a 20 2d 20 6e 4d 61 73 74  er).  ** - nMast
ff70: 65 72 20 62 79 74 65 73 3a 20 53 70 61 63 65 20  er bytes: Space 
ff80: 66 6f 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  for a master jou
ff90: 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2e 0a 20 20  rnal pointer..  
ffa0: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
ffb0: 33 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72  3OsWrite(&pPager
ffc0: 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d  ->jfd, aJournalM
ffd0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
ffe0: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
fff0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
10000 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 72  K ){.    rc = wr
10010 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65  ite32bits(&pPage
10020 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
10030 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66 66 66 66  noSync ? 0xfffff
10040 66 66 66 20 3a 20 30 29 3b 0a 20 20 7d 0a 20 20  fff : 0);.  }.  
10050 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
10060 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
10070 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  Randomness(sizeo
10080 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  f(pPager->cksumI
10090 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63  nit), &pPager->c
100a0 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 20 20 72  ksumInit);.    r
100b0 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
100c0 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
100d0 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
100e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
100f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10100 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
10110 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
10120 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
10130 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
10140 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10150 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
10160 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  (&pPager->jfd, p
10170 50 61 67 65 72 2d 3e 6e 4d 61 73 74 65 72 29 3b  Pager->nMaster);
10180 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
10190 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
101a0 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
101b0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 32 34 20 2b  Pager->jfd, 24 +
101c0 20 70 50 61 67 65 72 2d 3e 6e 4d 61 73 74 65 72   pPager->nMaster
101d0 20 2d 20 31 29 3b 0a 20 20 20 20 72 63 20 3d 20   - 1);.    rc = 
101e0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26  sqlite3OsWrite(&
101f0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22 5c 30  pPager->jfd, "\0
10200 30 30 22 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 69  00", 1);.  }.  i
10210 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41  f( pPager->stmtA
10220 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53  utoopen && rc==S
10230 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10240 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
10250 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28 70 50 61  r_stmt_begin(pPa
10260 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
10270 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10280 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
10290 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
102a0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  er);.    if( rc=
102b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
102c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
102d0 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  FULL;.    }.  }.
102e0 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d    return rc;  .}
102f0 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
10300 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
10310 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
10320 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76  he lock is remov
10330 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61  ed when.** the a
10340 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
10350 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a  ing happen:.**.*
10360 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61  *   *  sqlite3pa
10370 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20 69 73 20  ger_commit() is 
10380 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
10390 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
103a0 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65  lback() is calle
103b0 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
103c0 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 20  e3pager_close() 
103d0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
103e0 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  *  sqlite3pager_
103f0 75 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65  unref() is calle
10400 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75  d to on every ou
10410 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a  tstanding page..
10420 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
10430 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69  parameter to thi
10440 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70  s routine is a p
10450 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70  ointer to any op
10460 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a  en page of the.*
10470 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
10480 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65    Nothing change
10490 73 20 61 62 6f 75 74 20 74 68 65 20 70 61 67 65  s about the page
104a0 20 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d 65   - it is used me
104b0 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69  rely to.** acqui
104c0 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  re a pointer to 
104d0 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
104e0 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66  ure and as proof
104f0 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 2a   that there is.*
10500 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64  * already a read
10510 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74  -lock on the dat
10520 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  abase..**.** The
10530 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
10540 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20  r indicates how 
10550 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20 62 79  much space in by
10560 74 65 73 20 74 6f 20 72 65 73 65 72 76 65 20 66  tes to reserve f
10570 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a  or a.** master j
10580 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65  ournal file-name
10590 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
105a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65   the journal whe
105b0 6e 20 69 74 20 69 73 20 63 72 65 61 74 65 64 2e  n it is created.
105c0 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c  .**.** A journal
105d0 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
105e0 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  if this is not a
105f0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
10600 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a    For temporary.
10610 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70  ** files, the op
10620 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75  ening of the jou
10630 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66  rnal file is def
10640 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72  erred until ther
10650 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61  e is an.** actua
10660 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20  l need to write 
10670 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
10680 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
10690 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79  abase is already
106a0 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 72   reserved for wr
106b0 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75 74  iting, this rout
106c0 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
106d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
106e0 67 65 72 5f 62 65 67 69 6e 28 76 6f 69 64 20 2a  ger_begin(void *
106f0 70 44 61 74 61 2c 20 69 6e 74 20 6e 4d 61 73 74  pData, int nMast
10700 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
10710 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
10720 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65  R(pData);.  Page
10730 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
10740 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
10750 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
10760 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
10770 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ef>0 );.  assert
10780 28 20 6e 4d 61 73 74 65 72 3e 3d 30 20 29 3b 0a  ( nMaster>=0 );.
10790 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
107a0 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
107b0 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  NLOCK );.  if( p
107c0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
107d0 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20  GER_SHARED ){.  
107e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
107f0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->aInJournal==0 
10800 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
10810 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
10820 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
10830 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
10840 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  E;.      pPager-
10850 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50  >origDbSize = pP
10860 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
10870 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
10880 6e 74 20 62 75 73 79 20 3d 20 31 3b 0a 20 20 20  nt busy = 1;.   
10890 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20     do {.        
108a0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
108b0 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ck(&pPager->fd, 
108c0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a  RESERVED_LOCK);.
108d0 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63        }while( rc
108e0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
108f0 20 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67   .          pPag
10900 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
10910 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 70   && .          p
10920 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
10930 6c 65 72 2d 3e 78 46 75 6e 63 20 26 26 20 0a 20  ler->xFunc && . 
10940 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
10950 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78  >pBusyHandler->x
10960 46 75 6e 63 28 70 50 61 67 65 72 2d 3e 70 42 75  Func(pPager->pBu
10970 73 79 48 61 6e 64 6c 65 72 2d 3e 70 41 72 67 2c  syHandler->pArg,
10980 20 22 22 2c 20 62 75 73 79 2b 2b 29 0a 20 20 20   "", busy++).   
10990 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20     );.      if( 
109a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
109b0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
109c0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
109d0 20 20 70 50 61 67 65 72 2d 3e 6e 4d 61 73 74 65    pPager->nMaste
109e0 72 20 3d 20 6e 4d 61 73 74 65 72 3b 0a 20 20 20  r = nMaster;.   
109f0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
10a00 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45   = PAGER_RESERVE
10a10 44 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  D;.      pPager-
10a20 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b  >dirtyCache = 0;
10a30 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22 54  .      TRACE3("T
10a40 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 20 6e 4d  RANSACTION %d nM
10a50 61 73 74 65 72 3d 25 64 5c 6e 22 2c 20 70 50 61  aster=%d\n", pPa
10a60 67 65 72 2d 3e 66 64 2e 68 2c 20 6e 4d 61 73 74  ger->fd.h, nMast
10a70 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  er);.      if( p
10a80 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
10a90 6c 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  l && !pPager->te
10aa0 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
10ab0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
10ac0 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
10ad0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
10ae0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
10af0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
10b00 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  a data page as w
10b10 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70  riteable.  The p
10b20 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
10b30 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
10b40 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74  .** if it is not
10b50 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20   there already. 
10b60 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   This routine mu
10b70 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66  st be called bef
10b80 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68  ore making.** ch
10b90 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e  anges to a page.
10ba0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
10bb0 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69   time this routi
10bc0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
10bd0 65 20 70 61 67 65 72 20 63 72 65 61 74 65 73 20  e pager creates 
10be0 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  a new.** journal
10bf0 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20   and acquires a 
10c00 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
10c10 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
10c20 49 66 20 74 68 65 20 52 45 53 45 52 56 45 44 0a  If the RESERVED.
10c30 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f  ** lock could no
10c40 74 20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74  t be acquired, t
10c50 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
10c60 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  rns SQLITE_BUSY.
10c70 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
10c80 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68   routine must ch
10c90 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74  eck for that ret
10ca0 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65  urn value and be
10cb0 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a   careful not to.
10cc0 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61  ** change any pa
10cd0 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68  ge data until th
10ce0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
10cf0 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
10d00 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
10d10 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f  al file could no
10d20 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 63  t be written bec
10d30 61 75 73 65 20 74 68 65 20 64 69 73 6b 20 69 73  ause the disk is
10d40 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74   full,.** then t
10d50 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
10d60 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  rns SQLITE_FULL 
10d70 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65  and does an imme
10d80 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  diate rollback..
10d90 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e  ** All subsequen
10da0 74 20 77 72 69 74 65 20 61 74 74 65 6d 70 74 73  t write attempts
10db0 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c   also return SQL
10dc0 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74  ITE_FULL until t
10dd0 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c  here.** is a cal
10de0 6c 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65  l to sqlite3page
10df0 72 5f 63 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71  r_commit() or sq
10e00 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
10e10 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65  ack() to.** rese
10e20 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
10e30 33 70 61 67 65 72 5f 77 72 69 74 65 28 76 6f 69  3pager_write(voi
10e40 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
10e50 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54  dr *pPg = DATA_T
10e60 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
10e70 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
10e80 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
10e90 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
10ea0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  _OK;..  /* Check
10eb0 20 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f   for errors.  */
10ec0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
10ed0 72 72 4d 61 73 6b 20 29 7b 20 0a 20 20 20 20 72  rrMask ){ .    r
10ee0 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63  eturn pager_errc
10ef0 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ode(pPager);.  }
10f00 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72  .  if( pPager->r
10f10 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72  eadOnly ){.    r
10f20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
10f30 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72  M;.  }..  /* Mar
10f40 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69  k the page as di
10f50 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67  rty.  If the pag
10f60 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
10f70 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20  en written.  ** 
10f80 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  to the journal t
10f90 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72  hen we can retur
10fa0 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  n right away..  
10fb0 2a 2f 0a 20 20 70 50 67 2d 3e 64 69 72 74 79 20  */.  pPg->dirty 
10fc0 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  = 1;.  if( pPg->
10fd0 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50  inJournal && (pP
10fe0 67 2d 3e 69 6e 53 74 6d 74 20 7c 7c 20 70 50 61  g->inStmt || pPa
10ff0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d  ger->stmtInUse==
11000 30 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  0) ){.    pPager
11010 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31  ->dirtyCache = 1
11020 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
11030 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
11040 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
11050 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74   far, it means t
11060 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65  hat the page nee
11070 64 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 77 72  ds to be.  ** wr
11080 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61  itten to the tra
11090 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
110a0 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69   or the ckeckpoi
110b0 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  nt journal.  ** 
110c0 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20  or both..  **.  
110d0 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20 74  ** First check t
110e0 6f 20 73 65 65 20 74 68 61 74 20 74 68 65 20 74  o see that the t
110f0 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
11100 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20  al exists and.  
11110 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69 66 20  ** create it if 
11120 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 2a  it does not..  *
11130 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
11140 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
11150 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20  _UNLOCK );.  rc 
11160 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 62  = sqlite3pager_b
11170 65 67 69 6e 28 70 44 61 74 61 2c 20 30 29 3b 0a  egin(pData, 0);.
11180 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11190 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
111a0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
111b0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
111c0 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
111d0 44 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  D );.  if( !pPag
111e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
111f0 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  && pPager->useJo
11200 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20  urnal ){.    rc 
11210 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
11220 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
11230 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11240 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
11250 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
11260 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
11270 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75  en || !pPager->u
11280 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 70  seJournal );.  p
11290 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
112a0 65 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 54 68 65  e = 1;..  /* The
112b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
112c0 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20  rnal now exists 
112d0 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52 45  and we have a RE
112e0 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 2a  SERVED or an.  *
112f0 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
11300 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   on the main dat
11310 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69  abase file.  Wri
11320 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
11330 61 67 65 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  age to.  ** the 
11340 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
11350 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  nal if it is not
11360 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a   there already..
11370 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 67 2d    */.  if( !pPg-
11380 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70  >inJournal && (p
11390 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
113a0 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6d 65 6d  l || pPager->mem
113b0 44 62 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28  Db) ){.    if( (
113c0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
113d0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
113e0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ize ){.      int
113f0 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 75 33 32   szPg;.      u32
11400 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20 69 66   saved;.      if
11410 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20  ( pPager->memDb 
11420 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73  ){.        PgHis
11430 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
11440 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
11450 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
11460 20 20 54 52 41 43 45 32 28 22 4a 4f 55 52 4e 41    TRACE2("JOURNA
11470 4c 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50  L page %d\n", pP
11480 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
11490 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d    assert( pHist-
114a0 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20  >pOrig==0 );.   
114b0 20 20 20 20 20 70 48 69 73 74 2d 3e 70 4f 72 69       pHist->pOri
114c0 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  g = sqliteMalloc
114d0 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67  Raw( pPager->pag
114e0 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
114f0 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69   if( pHist->pOri
11500 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  g ){.          m
11510 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 4f 72  emcpy(pHist->pOr
11520 69 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  ig, PGHDR_TO_DAT
11530 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
11540 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
11550 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 67     }.        pPg
11560 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
11570 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11580 20 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 20        u32 cksum 
11590 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  = pager_cksum(pP
115a0 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
115b0 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20   pData);.       
115c0 20 73 61 76 65 64 20 3d 20 2a 28 75 33 32 2a 29   saved = *(u32*)
115d0 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
115e0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 73 74 6f  Pg);.        sto
115f0 72 65 33 32 62 69 74 73 28 63 6b 73 75 6d 2c 20  re32bits(cksum, 
11600 70 50 67 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  pPg, SQLITE_PAGE
11610 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20  _SIZE);.        
11620 73 7a 50 67 20 3d 20 53 51 4c 49 54 45 5f 50 41  szPg = SQLITE_PA
11630 47 45 5f 53 49 5a 45 2b 38 3b 0a 20 20 20 20 20  GE_SIZE+8;.     
11640 20 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 70     store32bits(p
11650 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d  Pg->pgno, pPg, -
11660 34 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45  4);.        CODE
11670 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  C(pPager, pData,
11680 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a   pPg->pgno, 7);.
11690 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
116a0 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61  ite3OsWrite(&pPa
116b0 67 65 72 2d 3e 6a 66 64 2c 20 26 28 28 63 68 61  ger->jfd, &((cha
116c0 72 2a 29 70 44 61 74 61 29 5b 2d 34 5d 2c 20 73  r*)pData)[-4], s
116d0 7a 50 67 29 3b 0a 20 20 20 20 20 20 20 20 54 52  zPg);.        TR
116e0 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20 70 61  ACE3("JOURNAL pa
116f0 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
11700 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
11710 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b   pPg->needSync);
11720 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 28 70  .        CODEC(p
11730 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
11740 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20  g->pgno, 0);.   
11750 20 20 20 20 20 2a 28 75 33 32 2a 29 50 47 48 44       *(u32*)PGHD
11760 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 29 20  R_TO_EXTRA(pPg) 
11770 3d 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20 20  = saved;.       
11780 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11790 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
117a0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
117b0 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
117c0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
117d0 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45  >errMask |= PAGE
117e0 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20  R_ERR_FULL;.    
117f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
11800 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11810 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b     pPager->nRec+
11820 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  +;.        asser
11830 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
11840 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20  urnal!=0 );.    
11850 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
11860 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f  ournal[pPg->pgno
11870 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
11880 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20  pgno&7);.       
11890 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
118a0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
118b0 3b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 69  ;.        pPg->i
118c0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
118d0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
118e0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
118f0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
11900 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67  >aInStmt[pPg->pg
11910 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
11920 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
11930 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f       page_add_to
11940 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b  _stmt_list(pPg);
11950 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11960 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
11970 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
11980 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  c = !pPager->jou
11990 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20 21  rnalStarted && !
119a0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
119b0 20 20 20 20 20 20 54 52 41 43 45 33 28 22 41 50        TRACE3("AP
119c0 50 45 4e 44 20 70 61 67 65 20 25 64 20 6e 65 65  PEND page %d nee
119d0 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 20 70 50 67  dSync=%d\n", pPg
119e0 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65  ->pgno, pPg->nee
119f0 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 20 20  dSync);.    }.  
11a00 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53    if( pPg->needS
11a10 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ync ){.      pPa
11a20 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
11a30 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
11a40 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d  /* If the statem
11a50 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  ent journal is o
11a60 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
11a70 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20   is not in it,. 
11a80 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74   ** then write t
11a90 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
11aa0 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  to the statement
11ab0 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20   journal.  Note 
11ac0 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 74  that.  ** the st
11ad0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
11ae0 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66  format differs f
11af0 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64  rom the standard
11b00 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a   journal format.
11b10 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20    ** in that it 
11b20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73  omits the checks
11b30 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64  ums and the head
11b40 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  er..  */.  if( p
11b50 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
11b60 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74   && !pPg->inStmt
11b70 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
11b80 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74  no<=pPager->stmt
11b90 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Size ){.    asse
11ba0 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
11bb0 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e  al || (int)pPg->
11bc0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
11bd0 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 69  gDbSize );.    i
11be0 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  f( pPager->memDb
11bf0 20 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74   ){.      PgHist
11c00 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
11c10 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
11c20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61  pPager);.      a
11c30 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 53  ssert( pHist->pS
11c40 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt==0 );.      
11c50 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73  pHist->pStmt = s
11c60 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
11c70 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
11c80 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48   );.      if( pH
11c90 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  ist->pStmt ){.  
11ca0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69        memcpy(pHi
11cb0 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44 52  st->pStmt, PGHDR
11cc0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
11cd0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
11ce0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11cf0 54 52 41 43 45 32 28 22 53 54 4d 54 2d 4a 4f 55  TRACE2("STMT-JOU
11d00 52 4e 41 4c 20 70 61 67 65 20 25 64 5c 6e 22 2c  RNAL page %d\n",
11d10 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
11d20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74   }else{.      st
11d30 6f 72 65 33 32 62 69 74 73 28 70 50 67 2d 3e 70  ore32bits(pPg->p
11d40 67 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20  gno, pPg, -4);. 
11d50 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65       CODEC(pPage
11d60 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
11d70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 72  gno, 7);.      r
11d80 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
11d90 74 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64  te(&pPager->stfd
11da0 2c 20 28 28 63 68 61 72 2a 29 70 44 61 74 61 29  , ((char*)pData)
11db0 2d 34 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  -4, SQLITE_PAGE_
11dc0 53 49 5a 45 2b 34 29 3b 0a 20 20 20 20 20 20 54  SIZE+4);.      T
11dd0 52 41 43 45 32 28 22 53 54 4d 54 2d 4a 4f 55 52  RACE2("STMT-JOUR
11de0 4e 41 4c 20 70 61 67 65 20 25 64 5c 6e 22 2c 20  NAL page %d\n", 
11df0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
11e00 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20    CODEC(pPager, 
11e10 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
11e20 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
11e30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11e40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11e50 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
11e60 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
11e70 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
11e80 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c  |= PAGER_ERR_FUL
11e90 4c 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  L;.        retur
11ea0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
11eb0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
11ec0 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 61 73  NRec++;.      as
11ed0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
11ee0 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20  nStmt!=0 );.    
11ef0 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
11f00 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
11f10 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
11f20 37 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  7);.    }.    pa
11f30 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
11f40 69 73 74 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20  ist(pPg);.  }.. 
11f50 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64   /* Update the d
11f60 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64  atabase size and
11f70 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20   return..  */.  
11f80 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
11f90 7a 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  ze<(int)pPg->pgn
11fa0 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
11fb0 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70  >dbSize = pPg->p
11fc0 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  gno;.  }.  retur
11fd0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
11fe0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
11ff0 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20  e page given in 
12000 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73  the argument was
12010 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73   previously pass
12020 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ed.** to sqlite3
12030 70 61 67 65 72 5f 77 72 69 74 65 28 29 2e 20 20  pager_write().  
12040 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
12050 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  return TRUE if i
12060 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68  t is ok.** to ch
12070 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  ange the content
12080 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   of the page..*/
12090 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
120a0 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28 76 6f  r_iswriteable(vo
120b0 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67  id *pData){.  Pg
120c0 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f  Hdr *pPg = DATA_
120d0 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
120e0 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 64  .  return pPg->d
120f0 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  irty;.}../*.** R
12100 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65  eplace the conte
12110 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70  nt of a single p
12120 61 67 65 20 77 69 74 68 20 74 68 65 20 69 6e 66  age with the inf
12130 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
12140 74 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  third.** argumen
12150 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
12160 33 70 61 67 65 72 5f 6f 76 65 72 77 72 69 74 65  3pager_overwrite
12170 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
12180 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20  Pgno pgno, void 
12190 2a 70 44 61 74 61 29 7b 0a 20 20 76 6f 69 64 20  *pData){.  void 
121a0 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 63  *pPage;.  int rc
121b0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
121c0 33 70 61 67 65 72 5f 67 65 74 28 70 50 61 67 65  3pager_get(pPage
121d0 72 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65 29  r, pgno, &pPage)
121e0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
121f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
12200 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  = sqlite3pager_w
12210 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20  rite(pPage);.   
12220 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12230 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  OK ){.      memc
12240 70 79 28 70 50 61 67 65 2c 20 70 44 61 74 61 2c  py(pPage, pData,
12250 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
12260 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  E);.    }.    sq
12270 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
12280 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  (pPage);.  }.  r
12290 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
122a0 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69  ** A call to thi
122b0 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20  s routine tells 
122c0 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69  the pager that i
122d0 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  t is not necessa
122e0 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74  ry to.** write t
122f0 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  he information o
12300 6e 20 70 61 67 65 20 22 70 67 6e 6f 22 20 62 61  n page "pgno" ba
12310 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20  ck to the disk, 
12320 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74  even though.** t
12330 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62  hat page might b
12340 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  e marked as dirt
12350 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65  y..**.** The ove
12360 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20  rlying software 
12370 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73  layer calls this
12380 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c   routine when al
12390 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a  l of the data.**
123a0 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
123b0 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54  ge is unused.  T
123c0 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74  he pager marks t
123d0 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
123e0 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64   so.** that it d
123f0 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74  oes not get writ
12400 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ten to disk..**.
12410 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68  ** Tests show th
12420 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  at this optimiza
12430 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77  tion, together w
12440 69 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  ith the.** sqlit
12450 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c  e3pager_dont_rol
12460 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d  lback() below, m
12470 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20  ore than double 
12480 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20  the speed.** of 
12490 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65  large INSERT ope
124a0 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64  rations and quad
124b0 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20  ruple the speed 
124c0 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73  of large DELETEs
124d0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
124e0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
124f0 6c 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c 77  led, set the alw
12500 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67  aysRollback flag
12510 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62   to true..** Sub
12520 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
12530 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f   sqlite3pager_do
12540 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f  nt_rollback() fo
12550 72 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a  r the same page.
12560 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74  ** will thereaft
12570 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20  er be ignored.  
12580 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
12590 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f  y to avoid a pro
125a0 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20  blem.** where a 
125b0 70 61 67 65 20 77 69 74 68 20 64 61 74 61 20 69  page with data i
125c0 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  s added to the f
125d0 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f  reelist during o
125e0 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20  ne part of.** a 
125f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e  transaction then
12600 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
12610 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e  e freelist durin
12620 67 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a  g a later part.*
12630 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72  * of the same tr
12640 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65  ansaction and re
12650 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74  used for some ot
12660 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68  her purpose.  Wh
12670 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73  en it.** is firs
12680 74 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  t added to the f
12690 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f  reelist, this ro
126a0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
126b0 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a    When reused,.*
126c0 2a 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62  * the dont_rollb
126d0 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73  ack() routine is
126e0 20 63 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65   called.  But be
126f0 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 63  cause the page c
12700 6f 6e 74 61 69 6e 73 0a 2a 2a 20 63 72 69 74 69  ontains.** criti
12710 63 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69  cal data, we sti
12720 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75  ll need to be su
12730 72 65 20 69 74 20 67 65 74 73 20 72 6f 6c 6c 65  re it gets rolle
12740 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65 0a  d back in spite.
12750 2a 2a 20 6f 66 20 74 68 65 20 64 6f 6e 74 5f 72  ** of the dont_r
12760 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a  ollback() call..
12770 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70  */.void sqlite3p
12780 61 67 65 72 5f 64 6f 6e 74 5f 77 72 69 74 65 28  ager_dont_write(
12790 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
127a0 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
127b0 64 72 20 2a 70 50 67 3b 0a 0a 20 20 70 50 67 20  dr *pPg;..  pPg 
127c0 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
127d0 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
127e0 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
127f0 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 70  ack = 1;.  if( p
12800 50 67 20 26 26 20 70 50 67 2d 3e 64 69 72 74 79  Pg && pPg->dirty
12810 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
12820 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74  er->dbSize==(int
12830 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50  )pPg->pgno && pP
12840 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
12850 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  <pPager->dbSize 
12860 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
12870 68 69 73 20 70 61 67 65 73 20 69 73 20 74 68 65  his pages is the
12880 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68   last page in th
12890 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
128a0 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20  ile has grown.  
128b0 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68      ** during th
128c0 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
128d0 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e  ction, then do N
128e0 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  OT mark the page
128f0 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20   as clean..     
12900 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74   ** When the dat
12910 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73  abase file grows
12920 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73  , we must make s
12930 75 72 65 20 74 68 61 74 20 74 68 65 20 6c 61 73  ure that the las
12940 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  t page.      ** 
12950 67 65 74 73 20 77 72 69 74 74 65 6e 20 61 74 20  gets written at 
12960 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68  least once so th
12970 61 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  at the disk file
12980 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72   will be the cor
12990 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69  rect.      ** si
129a0 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f  ze. If you do no
129b0 74 20 77 72 69 74 65 20 74 68 69 73 20 70 61 67  t write this pag
129c0 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  e and the size o
129d0 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20  f the file.     
129e0 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20   ** on the disk 
129f0 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f  ends up being to
12a00 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61  o small, that ca
12a10 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
12a20 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  se.      ** corr
12a30 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68  uption during th
12a40 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69  e next transacti
12a50 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
12a60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52   }else{.      TR
12a70 41 43 45 33 28 22 44 4f 4e 54 5f 57 52 49 54 45  ACE3("DONT_WRITE
12a80 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e   page %d of %d\n
12a90 22 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65 72 2d  ", pgno, pPager-
12aa0 3e 66 64 2e 68 29 3b 0a 20 20 20 20 20 20 70 50  >fd.h);.      pP
12ab0 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
12ac0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
12ad0 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20   A call to this 
12ae0 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68  routine tells th
12af0 65 20 70 61 67 65 72 20 74 68 61 74 20 69 66 20  e pager that if 
12b00 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
12b10 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20  s,.** it is not 
12b20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72 65 73  necessary to res
12b30 74 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e  tore the data on
12b40 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e   the given page.
12b50 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20    This.** means 
12b60 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 64  that the pager d
12b70 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20  oes not have to 
12b80 72 65 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e  record the given
12b90 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20   page in the.** 
12ba0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
12bb0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
12bc0 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c  3pager_dont_roll
12bd0 62 61 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61  back(void *pData
12be0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
12bf0 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
12c00 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20  pData);.  Pager 
12c10 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
12c20 50 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 70 50  Pager;..  if( pP
12c30 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
12c40 45 52 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20  ER_EXCLUSIVE || 
12c50 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
12c60 70 65 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pen==0 ) return;
12c70 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61  .  if( pPg->alwa
12c80 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50  ysRollback || pP
12c90 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
12ca0 62 61 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  back || pPager->
12cb0 6d 65 6d 44 62 20 29 20 72 65 74 75 72 6e 3b 0a  memDb ) return;.
12cc0 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f    if( !pPg->inJo
12cd0 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50  urnal && (int)pP
12ce0 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65  g->pgno <= pPage
12cf0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
12d00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
12d10 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21  ger->aInJournal!
12d20 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
12d30 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67  ->aInJournal[pPg
12d40 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
12d50 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
12d60 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
12d70 6c 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  l = 1;.    if( p
12d80 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
12d90 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
12da0 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70  ->aInStmt[pPg->p
12db0 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
12dc0 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
12dd0 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
12de0 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
12df0 20 20 7d 0a 20 20 20 20 54 52 41 43 45 33 28 22    }.    TRACE3("
12e00 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61  DONT_ROLLBACK pa
12e10 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  ge %d of %d\n", 
12e20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 61 67 65  pPg->pgno, pPage
12e30 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 7d 0a 20 20  r->fd.h);.  }.  
12e40 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
12e50 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69  InUse && !pPg->i
12e60 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50  nStmt && (int)pP
12e70 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  g->pgno<=pPager-
12e80 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20  >stmtSize ){.   
12e90 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
12ea0 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29  Journal || (int)
12eb0 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
12ec0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a  ->origDbSize );.
12ed0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
12ee0 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29  er->aInStmt!=0 )
12ef0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
12f00 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
12f10 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
12f20 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 61 67 65  gno&7);.    page
12f30 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
12f40 74 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  t(pPg);.  }.}...
12f50 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50 67  /*.** Clear a Pg
12f60 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f  History block.*/
12f70 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65  .static void cle
12f80 61 72 48 69 73 74 6f 72 79 28 50 67 48 69 73 74  arHistory(PgHist
12f90 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a 20 20 73  ory *pHist){.  s
12fa0 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d  qliteFree(pHist-
12fb0 3e 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74  >pOrig);.  sqlit
12fc0 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74  eFree(pHist->pSt
12fd0 6d 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f  mt);.  pHist->pO
12fe0 72 69 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74  rig = 0;.  pHist
12ff0 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a  ->pStmt = 0;.}..
13000 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c  /*.** Commit all
13010 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
13020 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c  database and rel
13030 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
13040 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
13050 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66  e commit fails f
13060 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61  or any reason, a
13070 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70   rollback attemp
13080 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64  t is made.** and
13090 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
130a0 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20  s returned.  If 
130b0 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65  the commit worke
130c0 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  d, SQLITE_OK.** 
130d0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
130e0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
130f0 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70  _commit(Pager *p
13100 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
13110 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
13120 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
13130 72 72 4d 61 73 6b 3d 3d 50 41 47 45 52 5f 45 52  rrMask==PAGER_ER
13140 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63  R_FULL ){.    rc
13150 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
13160 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
13170 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
13180 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13190 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
131a0 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  L;.    }.    ret
131b0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
131c0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
131d0 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  k!=0 ){.    rc =
131e0 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70   pager_errcode(p
131f0 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
13200 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
13210 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50   pPager->state<P
13220 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
13230 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13240 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
13250 54 52 41 43 45 32 28 22 43 4f 4d 4d 49 54 20 25  TRACE2("COMMIT %
13260 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64  d\n", pPager->fd
13270 2e 68 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  .h);.  if( pPage
13280 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
13290 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f  pPg = pager_get_
132a0 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28  all_dirty_pages(
132b0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 77 68 69  pPager);.    whi
132c0 6c 65 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20  le( pPg ){.     
132d0 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 47   clearHistory(PG
132e0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
132f0 20 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20   pPager));.     
13300 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
13310 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
13320 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
13330 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pPg->inStmt = 0
13340 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72  ;.      pPg->pPr
13350 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e  evStmt = pPg->pN
13360 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  extStmt = 0;.   
13370 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 44     pPg = pPg->pD
13380 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  irty;.    }.    
13390 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
133a0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
133b0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
133c0 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  RED;.    return 
133d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
133e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 69 72   if( pPager->dir
133f0 74 79 43 61 63 68 65 3d 3d 30 20 29 7b 0a 20 20  tyCache==0 ){.  
13400 20 20 2f 2a 20 45 78 69 74 20 65 61 72 6c 79 20    /* Exit early 
13410 28 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 74  (without doing t
13420 68 65 20 74 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e  he time-consumin
13430 67 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  g sqlite3OsSync(
13440 29 20 63 61 6c 6c 73 29 0a 20 20 20 20 2a 2a 20  ) calls).    ** 
13450 69 66 20 74 68 65 72 65 20 68 61 76 65 20 62 65  if there have be
13460 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f  en no changes to
13470 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13480 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  le. */.    asser
13490 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
134a0 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  ync==0 );.    rc
134b0 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
134c0 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
134d0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
134e0 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72   = -1;.    retur
134f0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
13500 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
13510 6e 61 6c 4f 70 65 6e 20 29 3b 0a 23 69 66 20 30  nalOpen );.#if 0
13520 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72  .  rc = syncJour
13530 6e 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  nal(pPager, 0);.
13540 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13550 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
13560 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20  commit_abort;.  
13570 7d 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  }.  pPg = pager_
13580 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
13590 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ges(pPager);.  i
135a0 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 72 63  f( pPg ){.    rc
135b0 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
135c0 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  agelist(pPg);.  
135d0 20 20 69 66 28 20 72 63 20 7c 7c 20 28 21 70 50    if( rc || (!pP
135e0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20  ager->noSync && 
135f0 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 26 70  sqlite3OsSync(&p
13600 50 61 67 65 72 2d 3e 66 64 29 21 3d 53 51 4c 49  Pager->fd)!=SQLI
13610 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20  TE_OK) ){.      
13620 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72  goto commit_abor
13630 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  t;.    }.  }.#en
13640 64 69 66 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  dif.  rc = sqlit
13650 65 33 70 61 67 65 72 5f 73 79 6e 63 28 70 50 61  e3pager_sync(pPa
13660 67 65 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ger, 0);.  if( r
13670 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
13680 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f      goto commit_
13690 61 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 63 20  abort;.  }.  rc 
136a0 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
136b0 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 70  ock(pPager);.  p
136c0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
136d0 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  -1;.  return rc;
136e0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
136f0 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
13700 73 20 77 72 6f 6e 67 20 64 75 72 69 6e 67 20 74  s wrong during t
13710 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  he commit proces
13720 73 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61  s..  */.commit_a
13730 62 6f 72 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c  bort:.  rc = sql
13740 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
13750 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ck(pPager);.  if
13760 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13770 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
13780 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72  TE_FULL;.  }.  r
13790 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
137a0 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20  ** Rollback all 
137b0 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61  changes.  The da
137c0 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63  tabase falls bac
137d0 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45  k to PAGER_SHARE
137e0 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69  D mode..** All i
137f0 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70  n-memory cache p
13800 61 67 65 73 20 72 65 76 65 72 74 20 74 6f 20 74  ages revert to t
13810 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61  heir original da
13820 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20  ta contents..** 
13830 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64  The journal is d
13840 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
13850 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f  is routine canno
13860 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f  t fail unless so
13870 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
13880 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e   is not followin
13890 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74  g.** the correct
138a0 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f   locking protoco
138b0 6c 20 28 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  l (SQLITE_PROTOC
138c0 4f 4c 29 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f  OL) or unless so
138d0 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63  me other.** proc
138e0 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 20 74  ess is writing t
138f0 72 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f  rash into the jo
13900 75 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49  urnal file (SQLI
13910 54 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a  TE_CORRUPT) or.*
13920 2a 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72  * unless a prior
13930 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64   malloc() failed
13940 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e   (SQLITE_NOMEM).
13950 20 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 72    Appropriate er
13960 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65  ror.** codes are
13970 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c   returned for al
13980 6c 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e  l these occasion
13990 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  s.  Otherwise,.*
139a0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
139b0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
139c0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
139d0 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
139e0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
139f0 20 20 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41    TRACE2("ROLLBA
13a00 43 4b 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  CK %d\n", pPager
13a10 2d 3e 66 64 2e 68 29 3b 0a 20 20 69 66 28 20 70  ->fd.h);.  if( p
13a20 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
13a30 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20      PgHdr *p;.  
13a40 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e    for(p=pPager->
13a50 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  pAll; p; p=p->pN
13a60 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50  extAll){.      P
13a70 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b  gHistory *pHist;
13a80 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 64  .      if( !p->d
13a90 69 72 74 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b  irty ) continue;
13aa0 0a 20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50  .      pHist = P
13ab0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20  GHDR_TO_HIST(p, 
13ac0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
13ad0 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  f( pHist->pOrig 
13ae0 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
13af0 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
13b00 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  p), pHist->pOrig
13b10 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
13b20 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41  ze);.        TRA
13b30 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41  CE2("ROLLBACK-PA
13b40 47 45 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e  GE %d\n", p->pgn
13b50 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  o);.      }else{
13b60 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 32 28  .        TRACE2(
13b70 22 50 41 47 45 20 25 64 20 69 73 20 63 6c 65 61  "PAGE %d is clea
13b80 6e 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 29 3b 0a  n\n", p->pgno);.
13b90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c        }.      cl
13ba0 65 61 72 48 69 73 74 6f 72 79 28 70 48 69 73 74  earHistory(pHist
13bb0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 72 74  );.      p->dirt
13bc0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  y = 0;.      p->
13bd0 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
13be0 20 20 20 20 20 70 2d 3e 69 6e 53 74 6d 74 20 3d       p->inStmt =
13bf0 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72   0;.      p->pPr
13c00 65 76 53 74 6d 74 20 3d 20 70 2d 3e 70 4e 65 78  evStmt = p->pNex
13c10 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d  tStmt = 0;.    }
13c20 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
13c30 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  mt = 0;.    pPag
13c40 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
13c50 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b  ger->origDbSize;
13c60 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63  .    memoryTrunc
13c70 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ate(pPager);.   
13c80 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
13c90 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  se = 0;.    pPag
13ca0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
13cb0 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65  R_SHARED;.    re
13cc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13cd0 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67    }..  if( !pPag
13ce0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c  er->dirtyCache |
13cf0 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  | !pPager->journ
13d00 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63  alOpen ){.    rc
13d10 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
13d20 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
13d30 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
13d40 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72   = -1;.    retur
13d50 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
13d60 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
13d70 21 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65  !=0 && pPager->e
13d80 72 72 4d 61 73 6b 21 3d 50 41 47 45 52 5f 45 52  rrMask!=PAGER_ER
13d90 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66  R_FULL ){.    if
13da0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
13db0 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
13dc0 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
13dd0 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
13de0 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   1);.    }.    r
13df0 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63  eturn pager_errc
13e00 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ode(pPager);.  }
13e10 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
13e20 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
13e30 52 56 45 44 20 29 7b 0a 20 20 20 20 69 6e 74 20  RVED ){.    int 
13e40 72 63 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rc2;.    rc = pa
13e50 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65  ger_reload_cache
13e60 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63  (pPager);.    rc
13e70 32 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74  2 = pager_unwrit
13e80 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
13e90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13ea0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
13eb0 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20   = rc2;.    }.  
13ec0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
13ed0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
13ee0 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 7d 0a 20  Pager, 1);.  }. 
13ef0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13f00 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  OK ){.    rc = S
13f10 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
13f20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61     pPager->errMa
13f30 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f  sk |= PAGER_ERR_
13f40 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20 70  CORRUPT;.  }.  p
13f50 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
13f60 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  -1;.  return rc;
13f70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
13f80 20 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74   TRUE if the dat
13f90 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70  abase file is op
13fa0 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20  ened read-only. 
13fb0 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a   Return FALSE.**
13fc0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
13fd0 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20   is (in theory) 
13fe0 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74  writable..*/.int
13ff0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73   sqlite3pager_is
14000 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a  readonly(Pager *
14010 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
14020 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  n pPager->readOn
14030 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ly;.}../*.** Thi
14040 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
14050 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
14060 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
14070 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33  .*/.int *sqlite3
14080 70 61 67 65 72 5f 73 74 61 74 73 28 50 61 67 65  pager_stats(Page
14090 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74  r *pPager){.  st
140a0 61 74 69 63 20 69 6e 74 20 61 5b 39 5d 3b 0a 20  atic int a[9];. 
140b0 20 61 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[0] = pPager->
140c0 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70  nRef;.  a[1] = p
140d0 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20  Pager->nPage;.  
140e0 61 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d  a[2] = pPager->m
140f0 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20  xPage;.  a[3] = 
14100 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
14110 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d    a[4] = pPager-
14120 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d  >state;.  a[5] =
14130 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
14140 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65  ;.  a[6] = pPage
14150 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20  r->nHit;.  a[7] 
14160 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b  = pPager->nMiss;
14170 0a 20 20 61 5b 38 5d 20 3d 20 70 50 61 67 65 72  .  a[8] = pPager
14180 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 72 65 74 75 72  ->nOvfl;.  retur
14190 6e 20 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n a;.}../*.** Se
141a0 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
141b0 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a  rollback point..
141c0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
141d0 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  ne should be cal
141e0 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 72 61  led with the tra
141f0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
14200 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e   already.** open
14210 2e 20 20 41 20 6e 65 77 20 73 74 61 74 65 6d 65  .  A new stateme
14220 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72  nt journal is cr
14230 65 61 74 65 64 20 74 68 61 74 20 63 61 6e 20 62  eated that can b
14240 65 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61  e used to rollba
14250 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66  ck.** changes of
14260 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f   a single SQL co
14270 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20 6c  mmand within a l
14280 61 72 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f  arger transactio
14290 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
142a0 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67 69  3pager_stmt_begi
142b0 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  n(Pager *pPager)
142c0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  {.  int rc;.  ch
142d0 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f  ar zTemp[SQLITE_
142e0 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a  TEMPNAME_SIZE];.
142f0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
14300 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a  r->stmtInUse );.
14310 20 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d 42    TRACE2("STMT-B
14320 45 47 49 4e 20 25 64 5c 6e 22 2c 20 70 50 61 67  EGIN %d\n", pPag
14330 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 69 66 28  er->fd.h);.  if(
14340 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29   pPager->memDb )
14350 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  {.    pPager->st
14360 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 20  mtInUse = 1;.   
14370 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
14380 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
14390 7a 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ze;.    return S
143a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
143b0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  if( !pPager->jou
143c0 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
143d0 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
143e0 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65  open = 1;.    re
143f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14400 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
14410 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
14420 6e 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  n );.  pPager->a
14430 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d  InStmt = sqliteM
14440 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64  alloc( pPager->d
14450 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20  bSize/8 + 1 );. 
14460 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
14470 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Stmt==0 ){.    s
14480 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50  qlite3OsLock(&pP
14490 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44  ager->fd, SHARED
144a0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 72 65 74 75  _LOCK);.    retu
144b0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
144c0 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45  .  }.#ifndef NDE
144d0 42 55 47 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  BUG.  rc = sqlit
144e0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50  e3OsFileSize(&pP
144f0 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67  ager->jfd, &pPag
14500 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a  er->stmtJSize);.
14510 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
14520 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65  stmt_begin_faile
14530 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  d;.  assert( pPa
14540 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
14550 3d 20 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  = .    pPager->n
14560 52 65 63 2a 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  Rec*JOURNAL_PG_S
14570 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52  Z(pPager) + JOUR
14580 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
14590 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70  r) );.#endif.  p
145a0 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
145b0 20 3d 0a 20 20 20 20 20 70 50 61 67 65 72 2d 3e   =.     pPager->
145c0 6e 52 65 63 2a 4a 4f 55 52 4e 41 4c 5f 50 47 5f  nRec*JOURNAL_PG_
145d0 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55  SZ(pPager) + JOU
145e0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
145f0 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  er);.  pPager->s
14600 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72  tmtSize = pPager
14610 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 69 66 28 20  ->dbSize;.  if( 
14620 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65  !pPager->stmtOpe
14630 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  n ){.    rc = sq
14640 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74  lite3pager_opent
14650 65 6d 70 28 7a 54 65 6d 70 2c 20 26 70 50 61 67  emp(zTemp, &pPag
14660 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 69  er->stfd);.    i
14670 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d  f( rc ) goto stm
14680 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a  t_begin_failed;.
14690 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
146a0 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50  Open = 1;.    pP
146b0 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d  ager->stmtNRec =
146c0 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   0;.  }.  pPager
146d0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b  ->stmtInUse = 1;
146e0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
146f0 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69  _OK;. .stmt_begi
14700 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  n_failed:.  if( 
14710 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
14720 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
14730 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  e(pPager->aInStm
14740 74 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  t);.    pPager->
14750 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d  aInStmt = 0;.  }
14760 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14770 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20  ./*.** Commit a 
14780 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e  statement..*/.in
14790 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  t sqlite3pager_s
147a0 74 6d 74 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72  tmt_commit(Pager
147b0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
147c0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
147d0 73 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  se ){.    PgHdr 
147e0 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  *pPg, *pNext;.  
147f0 20 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d 43    TRACE2("STMT-C
14800 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 70 50 61  OMMIT %d\n", pPa
14810 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20 20  ger->fd.h);.    
14820 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d  if( !pPager->mem
14830 44 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  Db ){.      sqli
14840 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65  te3OsSeek(&pPage
14850 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20  r->stfd, 0);.   
14860 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54     /* sqlite3OsT
14870 72 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d  runcate(&pPager-
14880 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20  >stfd, 0); */.  
14890 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 20      sqliteFree( 
148a0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
148b0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
148c0 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  >aInStmt = 0;.  
148d0 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 50 67 3d    }.    for(pPg=
148e0 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70  pPager->pStmt; p
148f0 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a  Pg; pPg=pNext){.
14900 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50        pNext = pP
14910 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20  g->pNextStmt;.  
14920 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
14930 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20  >inStmt );.     
14940 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pPg->inStmt = 0
14950 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72  ;.      pPg->pPr
14960 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e  evStmt = pPg->pN
14970 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  extStmt = 0;.   
14980 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d     if( pPager->m
14990 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20  emDb ){.        
149a0 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
149b0 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
149c0 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
149d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
149e0 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b  e(pHist->pStmt);
149f0 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e  .        pHist->
14a00 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  pStmt = 0;.     
14a10 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61   }.    }.    pPa
14a20 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20  ger->stmtNRec = 
14a30 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
14a40 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20  tmtInUse = 0;.  
14a50 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
14a60 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 0;.  }.  pPage
14a70 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
14a80 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 0;.  return SQ
14a90 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
14aa0 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61  * Rollback a sta
14ab0 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  tement..*/.int s
14ac0 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74  qlite3pager_stmt
14ad0 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  _rollback(Pager 
14ae0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
14af0 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  rc;.  if( pPager
14b00 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
14b10 20 20 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d     TRACE2("STMT-
14b20 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20  ROLLBACK %d\n", 
14b30 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20  pPager->fd.h);. 
14b40 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d     if( pPager->m
14b50 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 50 67  emDb ){.      Pg
14b60 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20  Hdr *pPg;.      
14b70 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
14b80 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d  pStmt; pPg; pPg=
14b90 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b  pPg->pNextStmt){
14ba0 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f  .        PgHisto
14bb0 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
14bc0 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
14bd0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
14be0 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  if( pHist->pStmt
14bf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
14c00 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41  mcpy(PGHDR_TO_DA
14c10 54 41 28 70 50 67 29 2c 20 70 48 69 73 74 2d 3e  TA(pPg), pHist->
14c20 70 53 74 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70  pStmt, pPager->p
14c30 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
14c40 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
14c50 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Hist->pStmt);.  
14c60 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
14c70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
14c80 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
14c90 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
14ca0 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53   = pPager->stmtS
14cb0 69 7a 65 3b 0a 20 20 20 20 20 20 6d 65 6d 6f 72  ize;.      memor
14cc0 79 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  yTruncate(pPager
14cd0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
14ce0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
14cf0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
14d00 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61  ager_stmt_playba
14d10 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
14d20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67  }.    sqlite3pag
14d30 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70  er_stmt_commit(p
14d40 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Pager);.  }else{
14d50 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
14d60 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  _OK;.  }.  pPage
14d70 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
14d80 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
14d90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
14da0 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
14db0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
14dc0 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  ase file..*/.con
14dd0 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
14de0 70 61 67 65 72 5f 66 69 6c 65 6e 61 6d 65 28 50  pager_filename(P
14df0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
14e00 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
14e10 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  zFilename;.}../*
14e20 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64 65  .** Set the code
14e30 63 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  c for this pager
14e40 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
14e50 70 61 67 65 72 5f 73 65 74 5f 63 6f 64 65 63 28  pager_set_codec(
14e60 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
14e70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  ,.  void (*xCode
14e80 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
14e90 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64  gno,int),.  void
14ea0 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20   *pCodecArg.){. 
14eb0 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20   pPager->xCodec 
14ec0 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67  = xCodec;.  pPag
14ed0 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d 20  er->pCodecArg = 
14ee0 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 0a 2f 2a  pCodecArg;.}../*
14ef0 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74  .** Sync the dat
14f00 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
14f10 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e  he pager pPager.
14f20 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
14f30 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f  to the name.** o
14f40 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
14f50 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
14f60 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
14f70 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75  nto the individu
14f80 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  al.** journal fi
14f90 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  le. zMaster may 
14fa0 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69  be NULL, which i
14fb0 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
14fc0 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f   no master.** jo
14fd0 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20  urnal (a single 
14fe0 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
14ff0 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tion)..**.** Thi
15000 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65  s routine ensure
15010 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  s that the journ
15020 61 6c 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c  al is synced, al
15030 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 77 72  l dirty pages wr
15040 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20  itten.** to the 
15050 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
15060 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
15070 69 6c 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20  ile synced. The 
15080 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a  only thing that.
15090 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f  ** remains to co
150a0 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
150b0 74 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74  tion is to delet
150c0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
150d0 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72  le (or.** master
150e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
150f0 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a   specified)..**.
15100 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20  ** Note that if 
15110 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74  zMaster==NULL, t
15120 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65  his does not ove
15130 72 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75  rwrite a previou
15140 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65  s value.** passe
15150 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 70  d to an sqlite3p
15160 61 67 65 72 5f 73 79 6e 63 28 29 20 63 61 6c 6c  ager_sync() call
15170 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15180 70 61 67 65 72 5f 73 79 6e 63 28 50 61 67 65 72  pager_sync(Pager
15190 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
151a0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
151b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
151c0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  E_OK;..  /* If t
151d0 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  his is an in-mem
151e0 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61  ory db, or no pa
151f0 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72  ges have been wr
15200 69 74 74 65 6e 20 74 6f 2c 20 74 68 69 73 0a 20  itten to, this. 
15210 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20   ** function is 
15220 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
15230 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d  if( !pPager->mem
15240 44 62 20 26 26 20 70 50 61 67 65 72 2d 3e 64 69  Db && pPager->di
15250 72 74 79 43 61 63 68 65 20 29 7b 0a 20 20 20 20  rtyCache ){.    
15260 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20  PgHdr *pPg;.    
15270 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
15280 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a  journalOpen );..
15290 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
152a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
152b0 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75      rc = syncJou
152c0 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61  rnal(pPager, zMa
152d0 73 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ster);.    if( r
152e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
152f0 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a  oto sync_exit;..
15300 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c      /* Write all
15310 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
15320 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15330 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70  e */.    pPg = p
15340 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
15350 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29  ty_pages(pPager)
15360 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
15370 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
15380 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pPg);.    if( rc
15390 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
153a0 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 20  to sync_exit;.. 
153b0 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 70 61 67     /* If any pag
153c0 65 73 20 77 65 72 65 20 61 63 74 75 61 6c 6c 79  es were actually
153d0 20 77 72 69 74 74 65 6e 2c 20 73 79 6e 63 20 74   written, sync t
153e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
153f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 20   */.    if( pPg 
15400 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
15410 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nc ){.      rc =
15420 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 26   sqlite3OsSync(&
15430 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
15440 20 7d 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78 69   }.  }..sync_exi
15450 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t:.  return rc;.
15460 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
15470 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  _DEBUG./*.** Ret
15480 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
15490 73 74 61 74 65 20 6f 66 20 74 68 65 20 66 69 6c  state of the fil
154a0 65 20 6c 6f 63 6b 20 66 6f 72 20 74 68 65 20 67  e lock for the g
154b0 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 54  iven pager..** T
154c0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
154d0 69 73 20 6f 6e 65 20 6f 66 20 4e 4f 5f 4c 4f 43  is one of NO_LOC
154e0 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20  K, SHARED_LOCK, 
154f0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 2c 0a 2a  RESERVED_LOCK,.*
15500 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 2c 20  * PENDING_LOCK, 
15510 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  or EXCLUSIVE_LOC
15520 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
15530 33 70 61 67 65 72 5f 6c 6f 63 6b 73 74 61 74 65  3pager_lockstate
15540 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
15550 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
15560 2d 3e 66 64 2e 6c 6f 63 6b 74 79 70 65 3b 0a 7d  ->fd.locktype;.}
15570 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
15580 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
15590 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e  * Print a listin
155a0 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e  g of all referen
155b0 63 65 64 20 70 61 67 65 73 20 61 6e 64 20 74 68  ced pages and th
155c0 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a  eir ref count..*
155d0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
155e0 67 65 72 5f 72 65 66 64 75 6d 70 28 50 61 67 65  ger_refdump(Page
155f0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
15600 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28  Hdr *pPg;.  for(
15610 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
15620 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
15630 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69  pNextAll){.    i
15640 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20  f( pPg->nRef<=0 
15650 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
15660 70 72 69 6e 74 66 28 22 50 41 47 45 20 25 33 64  printf("PAGE %3d
15670 20 61 64 64 72 3d 30 78 25 30 38 78 20 6e 52 65   addr=0x%08x nRe
15680 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  f=%d\n", .      
15690 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 69 6e 74   pPg->pgno, (int
156a0 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
156b0 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b  Pg), pPg->nRef);
156c0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a        .  }.}.#endif.