/ Hex Artifact Content
Login

Artifact f93d104b61278246fb06859227ac5fd87e6a67f0:


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 31  : pager.c,v 1.11
0350: 37 20 32 30 30 34 2f 30 36 2f 30 39 20 32 30 3a  7 2004/06/09 20:
0360: 30 33 3a 30 39 20 64 72 68 20 45 78 70 20 24 0a  03:09 drh Exp $.
0370: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e  */.#include "os.
0380: 68 22 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75  h"         /* Mu
0390: 73 74 20 62 65 20 66 69 72 73 74 20 74 6f 20 65  st be first to e
03a0: 6e 61 62 6c 65 20 6c 61 72 67 65 20 66 69 6c 65  nable large file
03b0: 20 73 75 70 70 6f 72 74 20 2a 2f 0a 23 69 6e 63   support */.#inc
03c0: 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e  lude "sqliteInt.
03d0: 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 70 61 67  h".#include "pag
03e0: 65 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  er.h".#include <
03f0: 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75  assert.h>.#inclu
0400: 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f  de <string.h>../
0410: 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20  *.** Macros for 
0420: 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e  troubleshooting.
0430: 20 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65    Normally turne
0440: 64 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 73  d off.*/.#if 0.s
0450: 74 61 74 69 63 20 50 61 67 65 72 20 2a 6d 61 69  tatic Pager *mai
0460: 6e 50 61 67 65 72 20 3d 20 30 3b 0a 23 64 65 66  nPager = 0;.#def
0470: 69 6e 65 20 53 45 54 5f 50 41 47 45 52 28 58 29  ine SET_PAGER(X)
0480: 20 20 69 66 28 20 6d 61 69 6e 50 61 67 65 72 3d    if( mainPager=
0490: 3d 30 20 29 20 6d 61 69 6e 50 61 67 65 72 20 3d  =0 ) mainPager =
04a0: 20 28 58 29 0a 23 64 65 66 69 6e 65 20 43 4c 52   (X).#define CLR
04b0: 5f 50 41 47 45 52 28 58 29 20 20 69 66 28 20 6d  _PAGER(X)  if( m
04c0: 61 69 6e 50 61 67 65 72 3d 3d 28 58 29 20 29 20  ainPager==(X) ) 
04d0: 6d 61 69 6e 50 61 67 65 72 20 3d 20 30 0a 23 64  mainPager = 0.#d
04e0: 65 66 69 6e 65 20 54 52 41 43 45 31 28 58 29 20  efine TRACE1(X) 
04f0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d      if( pPager==
0500: 6d 61 69 6e 50 61 67 65 72 20 29 20 66 70 72 69  mainPager ) fpri
0510: 6e 74 66 28 73 74 64 65 72 72 2c 58 29 0a 23 64  ntf(stderr,X).#d
0520: 65 66 69 6e 65 20 54 52 41 43 45 32 28 58 2c 59  efine TRACE2(X,Y
0530: 29 20 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d  )   if( pPager==
0540: 6d 61 69 6e 50 61 67 65 72 20 29 20 66 70 72 69  mainPager ) fpri
0550: 6e 74 66 28 73 74 64 65 72 72 2c 58 2c 59 29 0a  ntf(stderr,X,Y).
0560: 23 64 65 66 69 6e 65 20 54 52 41 43 45 33 28 58  #define TRACE3(X
0570: 2c 59 2c 5a 29 20 69 66 28 20 70 50 61 67 65 72  ,Y,Z) if( pPager
0580: 3d 3d 6d 61 69 6e 50 61 67 65 72 20 29 20 66 70  ==mainPager ) fp
0590: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 58 2c 59  rintf(stderr,X,Y
05a0: 2c 5a 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ,Z).#else.#defin
05b0: 65 20 53 45 54 5f 50 41 47 45 52 28 58 29 0a 23  e SET_PAGER(X).#
05c0: 64 65 66 69 6e 65 20 43 4c 52 5f 50 41 47 45 52  define CLR_PAGER
05d0: 28 58 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43  (X).#define TRAC
05e0: 45 31 28 58 29 0a 23 64 65 66 69 6e 65 20 54 52  E1(X).#define TR
05f0: 41 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69 6e  ACE2(X,Y).#defin
0600: 65 20 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 0a  e TRACE3(X,Y,Z).
0610: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
0620: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 61 73  he page cache as
0630: 20 61 20 77 68 6f 6c 65 20 69 73 20 61 6c 77 61   a whole is alwa
0640: 79 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65  ys in one of the
0650: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74   following.** st
0660: 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41  ates:.**.**   PA
0670: 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20  GER_UNLOCK      
0680: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
0690: 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
06a0: 79 20 72 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a  y reading or .**
06b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06c0: 20 20 20 20 20 20 20 77 72 69 74 69 6e 67 20 74         writing t
06d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
06e0: 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a  .  There is no.*
06f0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0700: 20 20 20 20 20 20 20 20 64 61 74 61 20 68 65 6c          data hel
0710: 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68  d in memory.  Th
0720: 69 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  is is the initia
0730: 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
0740: 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65             state
0750: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0760: 53 48 41 52 45 44 20 20 20 20 20 20 20 20 54 68  SHARED        Th
0770: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0780: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0790: 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  base..**        
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
07b0: 72 69 74 69 6e 67 20 69 73 20 6e 6f 74 20 70 65  riting is not pe
07c0: 72 6d 69 74 74 65 64 2e 20 20 54 68 65 72 65 20  rmitted.  There 
07d0: 63 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20 20 20  can be.**       
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73  multiple readers
0800: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73   accessing the s
0810: 61 6d 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ame database.** 
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 20 66 69 6c 65 20 61 74 20 74 68        file at th
0840: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a  e same time..**.
0850: 2a 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52  **   PAGER_RESER
0860: 56 45 44 20 20 20 20 20 20 57 72 69 74 69 6e 67  VED      Writing
0870: 20 69 73 20 70 65 72 6d 69 74 74 65 64 20 74 6f   is permitted to
0880: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
0890: 6f 6e 6c 79 2e 0a 2a 2a 20 20 20 20 20 20 20 20  only..**        
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
08b0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
08c0: 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f  base file has no
08d0: 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e  t been modified.
08e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
08f0: 20 20 20 20 20 20 20 20 20 20 4f 74 68 65 72 20            Other 
0900: 70 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74  processes may st
0910: 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74  ill be reading t
0920: 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20  he on-disk.**   
0930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0940: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
0950: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  e..**.**   PAGER
0960: 5f 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54  _EXCLUSIVE     T
0970: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
0980: 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
0990: 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20  abase..**       
09a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09b0: 41 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73  Access is exclus
09c0: 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70  ive.  No other p
09d0: 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20  rocesses or.**  
09e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09f0: 20 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e       threads can
0a00: 20 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77   be reading or w
0a10: 72 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65  riting while one
0a20: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0a30: 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73            proces
0a40: 73 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a  s is writing..**
0a50: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63  .** The page cac
0a60: 68 65 20 63 6f 6d 65 73 20 75 70 20 69 6e 20 50  he comes up in P
0a70: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68  AGER_UNLOCK.  Th
0a80: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 0a 2a  e first time a.*
0a90: 2a 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 67 65  * sqlite_page_ge
0aa0: 74 28 29 20 6f 63 63 75 72 73 2c 20 74 68 65 20  t() occurs, the 
0ab0: 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e  state transition
0ac0: 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45  s to PAGER_SHARE
0ad0: 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20  D..** After all 
0ae0: 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
0af0: 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73  released using s
0b00: 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72 65 66  qlite_page_unref
0b10: 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61 74 65  (),.** the state
0b20: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 61 63   transitions bac
0b30: 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e 4c 4f 43  k to PAGER_UNLOC
0b40: 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69  K.  The first ti
0b50: 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69 74  me.** that sqlit
0b60: 65 5f 70 61 67 65 5f 77 72 69 74 65 28 29 20 69  e_page_write() i
0b70: 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 73 74  s called, the st
0b80: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0b90: 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45  to.** PAGER_RESE
0ba0: 52 56 45 44 2e 20 20 28 4e 6f 74 65 20 74 68 61  RVED.  (Note tha
0bb0: 74 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 77 72  t sqlite_page_wr
0bc0: 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62  ite() can only b
0bd0: 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61  e.** called on a
0be0: 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  n outstanding pa
0bf0: 67 65 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74  ge which means t
0c00: 68 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 75  hat the pager mu
0c10: 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50 41 47 45  st.** be in PAGE
0c20: 52 5f 53 48 41 52 45 44 20 62 65 66 6f 72 65 20  R_SHARED before 
0c30: 69 74 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  it transitions t
0c40: 6f 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  o PAGER_RESERVED
0c50: 2e 29 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  .).** The sqlite
0c60: 5f 70 61 67 65 5f 72 6f 6c 6c 62 61 63 6b 28 29  _page_rollback()
0c70: 20 61 6e 64 20 73 71 6c 69 74 65 5f 70 61 67 65   and sqlite_page
0c80: 5f 63 6f 6d 6d 69 74 28 29 20 66 75 6e 63 74 69  _commit() functi
0c90: 6f 6e 73 20 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ons .** transiti
0ca0: 6f 6e 20 74 68 65 20 73 74 61 74 65 20 66 72 6f  on the state fro
0cb0: 6d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  m PAGER_RESERVED
0cc0: 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53   to PAGER_EXCLUS
0cd0: 49 56 45 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f  IVE to.** PAGER_
0ce0: 53 48 41 52 45 44 2e 0a 2a 2f 0a 23 64 65 66 69  SHARED..*/.#defi
0cf0: 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  ne PAGER_UNLOCK 
0d00: 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50       0.#define P
0d10: 41 47 45 52 5f 53 48 41 52 45 44 20 20 20 20 20  AGER_SHARED     
0d20: 20 31 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   1.#define PAGER
0d30: 5f 52 45 53 45 52 56 45 44 20 20 20 20 32 0a 23  _RESERVED    2.#
0d40: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 58 43  define PAGER_EXC
0d50: 4c 55 53 49 56 45 20 20 20 33 0a 0a 0a 2f 2a 0a  LUSIVE   3.../*.
0d60: 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  ** Each in-memor
0d70: 79 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67  y image of a pag
0d80: 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 74 68  e begins with th
0d90: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64  e following head
0da0: 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64  er..** This head
0db0: 65 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62  er is only visib
0dc0: 6c 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 72  le to this pager
0dd0: 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c   module.  The cl
0de0: 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61  ient.** code tha
0df0: 74 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65  t calls pager se
0e00: 65 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61  es only the data
0e10: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68   that follows th
0e20: 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  e header..**.** 
0e30: 43 6c 69 65 6e 74 20 63 6f 64 65 20 73 68 6f 75  Client code shou
0e40: 6c 64 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 70  ld call sqlite3p
0e50: 61 67 65 72 5f 77 72 69 74 65 28 29 20 6f 6e 20  ager_write() on 
0e60: 61 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20  a page prior to 
0e70: 6d 61 6b 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f  making.** any mo
0e80: 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74  difications to t
0e90: 68 61 74 20 70 61 67 65 2e 20 20 54 68 65 20 66  hat page.  The f
0ea0: 69 72 73 74 20 74 69 6d 65 20 73 71 6c 69 74 65  irst time sqlite
0eb0: 33 70 61 67 65 72 5f 77 72 69 74 65 28 29 0a 2a  3pager_write().*
0ec0: 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  * is called, the
0ed0: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
0ee0: 6f 6e 74 65 6e 74 73 20 61 72 65 20 77 72 69 74  ontents are writ
0ef0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c  ten into the rol
0f00: 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  lback.** journal
0f10: 20 61 6e 64 20 50 67 48 64 72 2e 69 6e 4a 6f 75   and PgHdr.inJou
0f20: 72 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 6e  rnal and PgHdr.n
0f30: 65 65 64 53 79 6e 63 20 61 72 65 20 73 65 74 2e  eedSync are set.
0f40: 20 20 4c 61 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a    Later, once.**
0f50: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67   the journal pag
0f60: 65 20 68 61 73 20 6d 61 64 65 20 69 74 20 6f 6e  e has made it on
0f70: 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66  to the disk surf
0f80: 61 63 65 2c 20 50 67 48 64 72 2e 6e 65 65 64 53  ace, PgHdr.needS
0f90: 79 6e 63 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65  ync.** is cleare
0fa0: 64 2e 20 20 54 68 65 20 6d 6f 64 69 66 69 65 64  d.  The modified
0fb0: 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 20   page cannot be 
0fc0: 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74  written back int
0fd0: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a  o the original.*
0fe0: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
0ff0: 75 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61  until the journa
1000: 6c 20 70 61 67 65 73 20 68 61 73 20 62 65 65 6e  l pages has been
1010: 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
1020: 61 6e 64 20 74 68 65 0a 2a 2a 20 50 67 48 64 72  and the.** PgHdr
1030: 2e 6e 65 65 64 53 79 6e 63 20 68 61 73 20 62 65  .needSync has be
1040: 65 6e 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a  en cleared..**.*
1050: 2a 20 54 68 65 20 50 67 48 64 72 2e 64 69 72 74  * The PgHdr.dirt
1060: 79 20 66 6c 61 67 20 69 73 20 73 65 74 20 77 68  y flag is set wh
1070: 65 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  en sqlite3pager_
1080: 77 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65  write() is calle
1090: 64 20 61 6e 64 0a 2a 2a 20 69 73 20 63 6c 65 61  d and.** is clea
10a0: 72 65 64 20 61 67 61 69 6e 20 77 68 65 6e 20 74  red again when t
10b0: 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
10c0: 69 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20  is written back 
10d0: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  to the original.
10e0: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
10f0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
1100: 75 63 74 20 50 67 48 64 72 20 50 67 48 64 72 3b  uct PgHdr PgHdr;
1110: 0a 73 74 72 75 63 74 20 50 67 48 64 72 20 7b 0a  .struct PgHdr {.
1120: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
1130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1140: 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f   /* The pager to
1150: 20 77 68 69 63 68 20 74 68 69 73 20 70 61 67 65   which this page
1160: 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50 67   belongs */.  Pg
1170: 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
1180: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1190: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
11a0: 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
11b0: 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 48  .  PgHdr *pNextH
11c0: 61 73 68 2c 20 2a 70 50 72 65 76 48 61 73 68 3b  ash, *pPrevHash;
11d0: 20 20 2f 2a 20 48 61 73 68 20 63 6f 6c 6c 69 73    /* Hash collis
11e0: 69 6f 6e 20 63 68 61 69 6e 20 66 6f 72 20 50 67  ion chain for Pg
11f0: 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50 67  Hdr.pgno */.  Pg
1200: 48 64 72 20 2a 70 4e 65 78 74 46 72 65 65 2c 20  Hdr *pNextFree, 
1210: 2a 70 50 72 65 76 46 72 65 65 3b 20 20 2f 2a 20  *pPrevFree;  /* 
1220: 46 72 65 65 6c 69 73 74 20 6f 66 20 70 61 67 65  Freelist of page
1230: 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 20  s where nRef==0 
1240: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78  */.  PgHdr *pNex
1250: 74 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  tAll;           
1260: 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66      /* A list of
1270: 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20   all pages */.  
1280: 50 67 48 64 72 20 2a 70 4e 65 78 74 53 74 6d 74  PgHdr *pNextStmt
1290: 2c 20 2a 70 50 72 65 76 53 74 6d 74 3b 20 20 2f  , *pPrevStmt;  /
12a0: 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20  * List of pages 
12b0: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
12c0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38   journal */.  u8
12d0: 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20   inJournal;     
12e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12f0: 54 52 55 45 20 69 66 20 68 61 73 20 62 65 65 6e  TRUE if has been
1300: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
1310: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 53 74  nal */.  u8 inSt
1320: 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mt;             
1330: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
1340: 69 66 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  if in the statem
1350: 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a  ent subjournal *
1360: 2f 0a 20 20 75 38 20 64 69 72 74 79 3b 20 20 20  /.  u8 dirty;   
1370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1380: 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 77 65     /* TRUE if we
1390: 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 62   need to write b
13a0: 61 63 6b 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20  ack changes */. 
13b0: 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20   u8 needSync;   
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d0: 2f 2a 20 53 79 6e 63 20 6a 6f 75 72 6e 61 6c 20  /* Sync journal 
13e0: 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74  before writing t
13f0: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  his page */.  u8
1400: 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b   alwaysRollback;
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1420: 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c  Disable dont_rol
1430: 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68 69 73  lback() for this
1440: 20 70 61 67 65 20 2a 2f 0a 20 20 73 68 6f 72 74   page */.  short
1450: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
1460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1470: 62 65 72 20 6f 66 20 75 73 65 72 73 20 6f 66 20  ber of users of 
1480: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50  this page */.  P
1490: 67 48 64 72 20 2a 70 44 69 72 74 79 3b 20 20 20  gHdr *pDirty;   
14a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14b0: 20 44 69 72 74 79 20 70 61 67 65 73 20 73 6f 72   Dirty pages sor
14c0: 74 65 64 20 62 79 20 50 67 48 64 72 2e 70 67 6e  ted by PgHdr.pgn
14d0: 6f 20 2a 2f 0a 20 20 2f 2a 20 53 51 4c 49 54 45  o */.  /* SQLITE
14e0: 5f 50 41 47 45 5f 53 49 5a 45 20 62 79 74 65 73  _PAGE_SIZE bytes
14f0: 20 6f 66 20 70 61 67 65 20 64 61 74 61 20 66 6f   of page data fo
1500: 6c 6c 6f 77 20 74 68 69 73 20 68 65 61 64 65 72  llow this header
1510: 20 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72 2e 6e   */.  /* Pager.n
1520: 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20 6c  Extra bytes of l
1530: 6f 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c 6f 77  ocal data follow
1540: 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20 2a   the page data *
1550: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  /.};../*.** For 
1560: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e 6c  an in-memory onl
1570: 79 20 64 61 74 61 62 61 73 65 2c 20 73 6f 6d 65  y database, some
1580: 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   extra informati
1590: 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64 20 61  on is recorded a
15a0: 62 6f 75 74 0a 2a 2a 20 65 61 63 68 20 70 61 67  bout.** each pag
15b0: 65 20 73 6f 20 74 68 61 74 20 63 68 61 6e 67 65  e so that change
15c0: 73 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20  s can be rolled 
15d0: 62 61 63 6b 2e 20 20 28 4a 6f 75 72 6e 61 6c 20  back.  (Journal 
15e0: 66 69 6c 65 73 20 61 72 65 20 6e 6f 74 0a 2a 2a  files are not.**
15f0: 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65 6d   used for in-mem
1600: 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 29 20  ory databases.) 
1610: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   The following i
1620: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 61 64  nformation is ad
1630: 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 65 6e  ded to.** the en
1640: 64 20 6f 66 20 65 76 65 72 79 20 45 58 54 52 41  d of every EXTRA
1650: 20 62 6c 6f 63 6b 20 66 6f 72 20 69 6e 2d 6d 65   block for in-me
1660: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a  mory databases..
1670: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72  **.** This infor
1680: 6d 61 74 69 6f 6e 20 63 6f 75 6c 64 20 68 61 76  mation could hav
1690: 65 20 62 65 65 6e 20 61 64 64 65 64 20 64 69 72  e been added dir
16a0: 65 63 74 6c 79 20 74 6f 20 74 68 65 20 50 67 48  ectly to the PgH
16b0: 64 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  dr structure..**
16c0: 20 42 75 74 20 74 68 65 6e 20 69 74 20 77 6f 75   But then it wou
16d0: 6c 64 20 74 61 6b 65 20 75 70 20 61 6e 20 65 78  ld take up an ex
16e0: 74 72 61 20 38 20 62 79 74 65 73 20 6f 66 20 73  tra 8 bytes of s
16f0: 74 6f 72 61 67 65 20 6f 6e 20 65 76 65 72 79 20  torage on every 
1700: 50 67 48 64 72 0a 2a 2a 20 65 76 65 6e 20 66 6f  PgHdr.** even fo
1710: 72 20 64 69 73 6b 2d 62 61 73 65 64 20 64 61 74  r disk-based dat
1720: 61 62 61 73 65 73 2e 20 20 53 70 6c 69 74 74 69  abases.  Splitti
1730: 6e 67 20 69 74 20 6f 75 74 20 73 61 76 65 73 20  ng it out saves 
1740: 38 20 62 79 74 65 73 2e 20 20 54 68 69 73 0a 2a  8 bytes.  This.*
1750: 2a 20 69 73 20 6f 6e 6c 79 20 61 20 73 61 76 69  * is only a savi
1760: 6e 67 73 20 6f 66 20 30 2e 38 25 20 62 75 74 20  ngs of 0.8% but 
1770: 74 68 6f 73 65 20 70 65 72 63 65 6e 74 61 67 65  those percentage
1780: 73 20 61 64 64 20 75 70 2e 0a 2a 2f 0a 74 79 70  s add up..*/.typ
1790: 65 64 65 66 20 73 74 72 75 63 74 20 50 67 48 69  edef struct PgHi
17a0: 73 74 6f 72 79 20 50 67 48 69 73 74 6f 72 79 3b  story PgHistory;
17b0: 0a 73 74 72 75 63 74 20 50 67 48 69 73 74 6f 72  .struct PgHistor
17c0: 79 20 7b 0a 20 20 75 38 20 2a 70 4f 72 69 67 3b  y {.  u8 *pOrig;
17d0: 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
17e0: 20 70 61 67 65 20 74 65 78 74 2e 20 20 52 65 73   page text.  Res
17f0: 74 6f 72 65 20 74 6f 20 74 68 69 73 20 6f 6e 20  tore to this on 
1800: 61 20 66 75 6c 6c 20 72 6f 6c 6c 62 61 63 6b 20  a full rollback 
1810: 2a 2f 0a 20 20 75 38 20 2a 70 53 74 6d 74 3b 20  */.  u8 *pStmt; 
1820: 20 20 20 20 2f 2a 20 54 65 78 74 20 61 73 20 69      /* Text as i
1830: 74 20 77 61 73 20 61 74 20 74 68 65 20 62 65 67  t was at the beg
1840: 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 75  inning of the cu
1850: 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20  rrent statement 
1860: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d  */.};../*.** A m
1870: 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69 6e  acro used for in
1880: 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65 63  voking the codec
1890: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
18a0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
18b0: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64 65  E_HAS_CODEC.# de
18c0: 66 69 6e 65 20 43 4f 44 45 43 28 50 2c 44 2c 4e  fine CODEC(P,D,N
18d0: 2c 58 29 20 69 66 28 20 50 2d 3e 78 43 6f 64 65  ,X) if( P->xCode
18e0: 63 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28 50  c ){ P->xCodec(P
18f0: 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c  ->pCodecArg,D,N,
1900: 58 29 3b 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65  X); }.#else.# de
1910: 66 69 6e 65 20 43 4f 44 45 43 28 50 2c 44 2c 4e  fine CODEC(P,D,N
1920: 2c 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,X).#endif../*.*
1930: 2a 20 43 6f 6e 76 65 72 74 20 61 20 70 6f 69 6e  * Convert a poin
1940: 74 65 72 20 74 6f 20 61 20 50 67 48 64 72 20 69  ter to a PgHdr i
1950: 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  nto a pointer to
1960: 20 69 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e 64   its data.** and
1970: 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f 0a   back again..*/.
1980: 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f  #define PGHDR_TO
1990: 5f 44 41 54 41 28 50 29 20 20 28 28 76 6f 69 64  _DATA(P)  ((void
19a0: 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a 23 64 65  *)(&(P)[1])).#de
19b0: 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47 48  fine DATA_TO_PGH
19c0: 44 52 28 44 29 20 20 28 26 28 28 50 67 48 64 72  DR(D)  (&((PgHdr
19d0: 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65 66  *)(D))[-1]).#def
19e0: 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45 58 54  ine PGHDR_TO_EXT
19f0: 52 41 28 50 29 20 28 28 76 6f 69 64 2a 29 26 28  RA(P) ((void*)&(
1a00: 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31 5d 29  (char*)(&(P)[1])
1a10: 29 5b 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  )[SQLITE_PAGE_SI
1a20: 5a 45 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48  ZE]).#define PGH
1a30: 44 52 5f 54 4f 5f 48 49 53 54 28 50 2c 50 47 52  DR_TO_HIST(P,PGR
1a40: 29 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  )  \.           
1a50: 20 28 28 50 67 48 69 73 74 6f 72 79 2a 29 26 28   ((PgHistory*)&(
1a60: 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31 5d 29  (char*)(&(P)[1])
1a70: 29 5b 28 50 47 52 29 2d 3e 70 61 67 65 53 69 7a  )[(PGR)->pageSiz
1a80: 65 2b 28 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d  e+(PGR)->nExtra]
1a90: 29 0a 0a 2f 2a 0a 2a 2a 20 48 6f 77 20 62 69 67  )../*.** How big
1aa0: 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73   to make the has
1ab0: 68 20 74 61 62 6c 65 20 75 73 65 64 20 66 6f 72  h table used for
1ac0: 20 6c 6f 63 61 74 69 6e 67 20 69 6e 2d 6d 65 6d   locating in-mem
1ad0: 6f 72 79 20 70 61 67 65 73 0a 2a 2a 20 62 79 20  ory pages.** by 
1ae0: 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a  page number..*/.
1af0: 23 64 65 66 69 6e 65 20 4e 5f 50 47 5f 48 41 53  #define N_PG_HAS
1b00: 48 20 32 30 34 38 0a 0a 2f 2a 0a 2a 2a 20 48 61  H 2048../*.** Ha
1b10: 73 68 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  sh a page number
1b20: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 61 67 65  .*/.#define page
1b30: 72 5f 68 61 73 68 28 50 4e 29 20 20 28 28 50 4e  r_hash(PN)  ((PN
1b40: 29 26 28 4e 5f 50 47 5f 48 41 53 48 2d 31 29 29  )&(N_PG_HASH-1))
1b50: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70  ../*.** A open p
1b60: 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e 20  age cache is an 
1b70: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1b80: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
1b90: 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50  ure..*/.struct P
1ba0: 61 67 65 72 20 7b 0a 20 20 63 68 61 72 20 2a 7a  ager {.  char *z
1bb0: 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
1bc0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1bd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1be0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f  e */.  char *zJo
1bf0: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
1c00: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1c10: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
1c20: 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69 72 65 63  /.  char *zDirec
1c30: 74 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  tory;           
1c40: 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 68 6f 6c  /* Directory hol
1c50: 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a  d database and j
1c60: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a  ournal files */.
1c70: 20 20 4f 73 46 69 6c 65 20 66 64 2c 20 6a 66 64    OsFile fd, jfd
1c80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1c90: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
1ca0: 73 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 61  s for database a
1cb0: 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  nd journal */.  
1cc0: 4f 73 46 69 6c 65 20 73 74 66 64 3b 20 20 20 20  OsFile stfd;    
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1ce0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
1cf0: 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  or the statement
1d00: 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20   subjournal*/.  
1d10: 69 6e 74 20 64 62 53 69 7a 65 3b 20 20 20 20 20  int dbSize;     
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1d30: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1d40: 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  n the file */.  
1d50: 69 6e 74 20 6f 72 69 67 44 62 53 69 7a 65 3b 20  int origDbSize; 
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64              /* d
1d70: 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65  bSize before the
1d80: 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 20   current change 
1d90: 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 53 69 7a  */.  int stmtSiz
1da0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1db0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61   /* Size of data
1dc0: 62 61 73 65 20 28 69 6e 20 70 61 67 65 73 29 20  base (in pages) 
1dd0: 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20  at stmt_begin() 
1de0: 2a 2f 0a 20 20 6f 66 66 5f 74 20 73 74 6d 74 4a  */.  off_t stmtJ
1df0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
1e00: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72   /* Size of jour
1e10: 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65 67 69  nal at stmt_begi
1e20: 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  n() */.  int nRe
1e30: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1e40: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1e50: 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20  f pages written 
1e60: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  to the journal *
1e70: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69  /.  u32 cksumIni
1e80: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1e90: 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20  /* Quasi-random 
1ea0: 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65  value added to e
1eb0: 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f  very checksum */
1ec0: 0a 20 20 69 6e 74 20 73 74 6d 74 4e 52 65 63 3b  .  int stmtNRec;
1ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ee0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  * Number of reco
1ef0: 72 64 73 20 69 6e 20 73 74 6d 74 20 73 75 62 6a  rds in stmt subj
1f00: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  ournal */.  int 
1f10: 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20  nExtra;         
1f20: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
1f30: 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74  his many bytes t
1f40: 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
1f50: 20 70 61 67 65 20 2a 2f 0a 20 20 76 6f 69 64 20   page */.  void 
1f60: 28 2a 78 44 65 73 74 72 75 63 74 6f 72 29 28 76  (*xDestructor)(v
1f70: 6f 69 64 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61  oid*,int); /* Ca
1f80: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
1f90: 77 68 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67  when freeing pag
1fa0: 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  es */.  void (*x
1fb0: 52 65 69 6e 69 74 65 72 29 28 76 6f 69 64 2a 2c  Reiniter)(void*,
1fc0: 69 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20  int);   /* Call 
1fd0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
1fe0: 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65  n reloading page
1ff0: 73 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53  s */.  int pageS
2000: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
2010: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2020: 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20  bytes in a page 
2030: 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  */.  int nPage; 
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2050: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
2060: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
2070: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ges */.  int nRe
2080: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
2090: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
20a0: 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
20b0: 73 20 77 69 74 68 20 50 67 48 64 72 2e 6e 52 65  s with PgHdr.nRe
20c0: 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50  f>0 */.  int mxP
20d0: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
20e0: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
20f0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2100: 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63 68 65  to hold in cache
2110: 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20   */.  int nHit, 
2120: 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20  nMiss, nOvfl;   
2130: 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 2c    /* Cache hits,
2140: 20 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52   missing, and LR
2150: 55 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20  U overflows */. 
2160: 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 29 28   void (*xCodec)(
2170: 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
2180: 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e  ,int); /* Routin
2190: 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e  e for en/decodin
21a0: 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  g data */.  void
21b0: 20 2a 70 43 6f 64 65 63 41 72 67 3b 20 20 20 20   *pCodecArg;    
21c0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
21d0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f   argument to xCo
21e0: 64 65 63 28 29 20 2a 2f 0a 20 20 75 38 20 6a 6f  dec() */.  u8 jo
21f0: 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20  urnalOpen;      
2200: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2210: 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  f journal file d
2220: 65 73 63 72 69 70 74 6f 72 73 20 69 73 20 76 61  escriptors is va
2230: 6c 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  lid */.  u8 jour
2240: 6e 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20  nalStarted;     
2250: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2260: 68 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61  header of journa
2270: 6c 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20  l is synced */. 
2280: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
2290: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22a0: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
22b0: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
22c0: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  ile */.  u8 stmt
22d0: 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  Open;           
22e0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
22f0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  the statement su
2300: 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e  bjournal is open
2310: 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e 55   */.  u8 stmtInU
2320: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
2330: 20 20 2f 2a 20 54 72 75 65 20 77 65 20 61 72 65    /* True we are
2340: 20 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20   in a statement 
2350: 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  subtransaction *
2360: 2f 0a 20 20 75 38 20 73 74 6d 74 41 75 74 6f 6f  /.  u8 stmtAutoo
2370: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
2380: 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75  /* Open stmt jou
2390: 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a  rnal when main j
23a0: 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64  ournal is opened
23b0: 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20  */.  u8 noSync; 
23c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d0: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20   /* Do not sync 
23e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74  the journal if t
23f0: 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c  rue */.  u8 full
2400: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
2410: 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61       /* Do extra
2420: 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f   syncs of the jo
2430: 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74  urnal for robust
2440: 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 74 61  ness */.  u8 sta
2450: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
2460: 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 55        /* PAGER_U
2470: 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20  NLOCK, _SHARED, 
2480: 5f 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e 20  _RESERVED, etc. 
2490: 2a 2f 0a 20 20 75 38 20 65 72 72 4d 61 73 6b 3b  */.  u8 errMask;
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b0: 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72   /* One of sever
24c0: 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f  al kinds of erro
24d0: 72 73 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  rs */.  u8 tempF
24e0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
24f0: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
2500: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
2510: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61  file */.  u8 rea
2520: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
2530: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
2540: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
2550: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e  tabase */.  u8 n
2560: 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20  eedSync;        
2570: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2580: 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73  if an fsync() is
2590: 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a   needed on the j
25a0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64  ournal */.  u8 d
25b0: 69 72 74 79 43 61 63 68 65 3b 20 20 20 20 20 20  irtyCache;      
25c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
25d0: 69 66 20 63 61 63 68 65 64 20 70 61 67 65 73 20  if cached pages 
25e0: 68 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a  have changed */.
25f0: 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62    u8 alwaysRollb
2600: 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ack;          /*
2610: 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f   Disable dont_ro
2620: 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c  llback() for all
2630: 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d   pages */.  u8 m
2640: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
2650: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2660: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
2670: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20  ile I/O */.  u8 
2680: 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *aInJournal;    
2690: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
26a0: 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67  bit for each pag
26b0: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
26c0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a  e file */.  u8 *
26d0: 61 49 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20  aInStmt;        
26e0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62          /* One b
26f0: 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  it for each page
2700: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2710: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69   */.  PgHdr *pFi
2720: 72 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20  rst, *pLast;    
2730: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65    /* List of fre
2740: 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48  e pages */.  PgH
2750: 64 72 20 2a 70 46 69 72 73 74 53 79 6e 63 65 64  dr *pFirstSynced
2760: 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ;        /* Firs
2770: 74 20 66 72 65 65 20 70 61 67 65 20 77 69 74 68  t free page with
2780: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d   PgHdr.needSync=
2790: 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  =0 */.  PgHdr *p
27a0: 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  All;            
27b0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61      /* List of a
27c0: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67  ll pages */.  Pg
27d0: 48 64 72 20 2a 70 53 74 6d 74 3b 20 20 20 20 20  Hdr *pStmt;     
27e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
27f0: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
2800: 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a  e statement subj
2810: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64  ournal */.  PgHd
2820: 72 20 2a 61 48 61 73 68 5b 4e 5f 50 47 5f 48 41  r *aHash[N_PG_HA
2830: 53 48 5d 3b 20 20 20 20 2f 2a 20 48 61 73 68 20  SH];    /* Hash 
2840: 74 61 62 6c 65 20 74 6f 20 6d 61 70 20 70 61 67  table to map pag
2850: 65 20 6e 75 6d 62 65 72 20 6f 66 20 50 67 48 64  e number of PgHd
2860: 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74  r */.  int nMast
2870: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
2880: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2890: 62 79 74 65 73 20 74 6f 20 72 65 73 65 72 76 65  bytes to reserve
28a0: 20 66 6f 72 20 6d 61 73 74 65 72 20 6a 2e 70 20   for master j.p 
28b0: 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 72  */.  BusyHandler
28c0: 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 20   *pBusyHandler; 
28d0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
28e0: 71 6c 69 74 65 2e 62 75 73 79 48 61 6e 64 6c 65  qlite.busyHandle
28f0: 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  r */.};../*.** T
2900: 68 65 73 65 20 61 72 65 20 62 69 74 73 20 74 68  hese are bits th
2910: 61 74 20 63 61 6e 20 62 65 20 73 65 74 20 69 6e  at can be set in
2920: 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 2e 0a   Pager.errMask..
2930: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
2940: 5f 45 52 52 5f 46 55 4c 4c 20 20 20 20 20 30 78  _ERR_FULL     0x
2950: 30 31 20 20 2f 2a 20 61 20 77 72 69 74 65 28 29  01  /* a write()
2960: 20 66 61 69 6c 65 64 20 2a 2f 0a 23 64 65 66 69   failed */.#defi
2970: 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d  ne PAGER_ERR_MEM
2980: 20 20 20 20 20 20 30 78 30 32 20 20 2f 2a 20 6d        0x02  /* m
2990: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 2a  alloc() failed *
29a0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
29b0: 45 52 52 5f 4c 4f 43 4b 20 20 20 20 20 30 78 30  ERR_LOCK     0x0
29c0: 34 20 20 2f 2a 20 65 72 72 6f 72 20 69 6e 20 74  4  /* error in t
29d0: 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f  he locking proto
29e0: 63 6f 6c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  col */.#define P
29f0: 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54  AGER_ERR_CORRUPT
2a00: 20 20 30 78 30 38 20 20 2f 2a 20 64 61 74 61 62    0x08  /* datab
2a10: 61 73 65 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 63  ase or journal c
2a20: 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 23 64 65  orruption */.#de
2a30: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 44  fine PAGER_ERR_D
2a40: 49 53 4b 20 20 20 20 20 30 78 31 30 20 20 2f 2a  ISK     0x10  /*
2a50: 20 67 65 6e 65 72 61 6c 20 64 69 73 6b 20 49 2f   general disk I/
2a60: 4f 20 65 72 72 6f 72 20 2d 20 62 61 64 20 68 61  O error - bad ha
2a70: 72 64 20 64 72 69 76 65 3f 20 2a 2f 0a 0a 2f 2a  rd drive? */../*
2a80: 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** Journal file
2a90: 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  s begin with the
2aa0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63   following magic
2ab0: 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61   string.  The da
2ac0: 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e  ta.** was obtain
2ad0: 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e  ed from /dev/ran
2ae0: 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64  dom.  It is used
2af0: 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74   only as a sanit
2b00: 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  y check..**.** S
2b10: 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38  ince version 2.8
2b20: 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .0, the journal 
2b30: 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20  format contains 
2b40: 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74  additional sanit
2b50: 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e  y.** checking in
2b60: 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74  formation.  If t
2b70: 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77  he power fails w
2b80: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
2b90: 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69   is begin.** wri
2ba0: 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f  tten, semi-rando
2bb0: 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d  m garbage data m
2bc0: 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 74  ight appear in t
2bd0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
2be0: 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69  le after power i
2bf0: 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20  s restored.  If 
2c00: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68  an attempt is th
2c10: 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f  en made.** to ro
2c20: 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  ll the journal b
2c30: 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
2c40: 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75  e could be corru
2c50: 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74  pted.  The addit
2c60: 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20  ional.** sanity 
2c70: 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73  checking data is
2c80: 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64   an attempt to d
2c90: 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62  iscover the garb
2ca0: 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  age in the.** jo
2cb0: 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65  urnal and ignore
2cc0: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73   it..**.** The s
2cd0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69  anity checking i
2ce0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
2cf0: 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66  he new journal f
2d00: 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a  ormat consists.*
2d10: 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68  * of a 32-bit ch
2d20: 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70  ecksum on each p
2d30: 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68  age of data.  Th
2d40: 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72  e checksum cover
2d50: 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61  s both.** the pa
2d60: 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  ge number and th
2d70: 65 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  e SQLITE_PAGE_SI
2d80: 5a 45 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ZE bytes of data
2d90: 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a   for the page..*
2da0: 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20  * This cksum is 
2db0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
2dc0: 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76   32-bit random v
2dd0: 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72  alue that appear
2de0: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  s in the.** jour
2df0: 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61  nal file right a
2e00: 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e  fter the header.
2e10: 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69    The random ini
2e20: 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f  tializer is impo
2e30: 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73  rtant,.** becaus
2e40: 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  e garbage data t
2e50: 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74  hat appears at t
2e60: 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72  he end of a jour
2e70: 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a  nal is likely.**
2e80: 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f   data that was o
2e90: 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c  nce in other fil
2ea0: 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77  es that have now
2eb0: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20   been deleted.  
2ec0: 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67  If the.** garbag
2ed0: 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d  e data came from
2ee0: 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75   an obsolete jou
2ef0: 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63  rnal file, the c
2f00: 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a  hecksums might.*
2f10: 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42  * be correct.  B
2f20: 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  ut by initializi
2f30: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
2f40: 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  to random value 
2f50: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66  which.** is diff
2f60: 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20  erent for every 
2f70: 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69  journal, we mini
2f80: 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a  mize that risk..
2f90: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
2fa0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a  unsigned char aJ
2fb0: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20  ournalMagic[] = 
2fc0: 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20  {.  0xd9, 0xd5, 
2fd0: 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30  0x05, 0xf9, 0x20
2fe0: 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78  , 0xa1, 0x63, 0x
2ff0: 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  d7,.};../*.** Th
3000: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65  e size of the he
3010: 61 64 65 72 20 61 6e 64 20 6f 66 20 65 61 63 68  ader and of each
3020: 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75   page in the jou
3030: 72 6e 61 6c 20 76 61 72 69 65 73 20 61 63 63 6f  rnal varies acco
3040: 72 64 69 6e 67 0a 2a 2a 20 74 6f 20 77 68 69 63  rding.** to whic
3050: 68 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  h journal format
3060: 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20   is being used. 
3070: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   The following m
3080: 61 63 72 6f 73 20 66 69 67 75 72 65 20 6f 75 74  acros figure out
3090: 0a 2a 2a 20 74 68 65 20 73 69 7a 65 73 20 62 61  .** the sizes ba
30a0: 73 65 64 20 6f 6e 20 66 6f 72 6d 61 74 20 6e 75  sed on format nu
30b0: 6d 62 65 72 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  mbers..*/.#defin
30c0: 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e JOURNAL_HDR_SZ
30d0: 28 70 50 61 67 65 72 29 20 28 32 34 20 2b 20 28  (pPager) (24 + (
30e0: 70 50 61 67 65 72 29 2d 3e 6e 4d 61 73 74 65 72  pPager)->nMaster
30f0: 29 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  ).#define JOURNA
3100: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20  L_PG_SZ(pPager) 
3110: 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53   ((pPager->pageS
3120: 69 7a 65 29 20 2b 20 38 29 0a 0a 0a 2f 2a 0a 2a  ize) + 8).../*.*
3130: 2a 20 45 6e 61 62 6c 65 20 72 65 66 65 72 65 6e  * Enable referen
3140: 63 65 20 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e  ce count trackin
3150: 67 20 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65  g here:.*/.#ifde
3160: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
3170: 69 6e 74 20 70 61 67 65 72 33 5f 72 65 66 69 6e  int pager3_refin
3180: 66 6f 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20  fo_enable = 0;. 
3190: 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67   static void pag
31a0: 65 72 5f 72 65 66 69 6e 66 6f 28 50 67 48 64 72  er_refinfo(PgHdr
31b0: 20 2a 70 29 7b 0a 20 20 20 20 73 74 61 74 69 63   *p){.    static
31c0: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
31d0: 20 20 69 66 28 20 21 70 61 67 65 72 33 5f 72 65    if( !pager3_re
31e0: 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72  finfo_enable ) r
31f0: 65 74 75 72 6e 3b 0a 20 20 20 20 70 72 69 6e 74  eturn;.    print
3200: 66 28 0a 20 20 20 20 20 20 20 22 52 45 46 43 4e  f(.       "REFCN
3210: 54 3a 20 25 34 64 20 61 64 64 72 3d 30 78 25 30  T: %4d addr=0x%0
3220: 38 78 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 0a 20  8x nRef=%d\n",. 
3230: 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f 2c 20 28        p->pgno, (
3240: 69 6e 74 29 50 47 48 44 52 5f 54 4f 5f 44 41 54  int)PGHDR_TO_DAT
3250: 41 28 70 29 2c 20 70 2d 3e 6e 52 65 66 0a 20 20  A(p), p->nRef.  
3260: 20 20 29 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 20    );.    cnt++; 
3270: 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67 20 74    /* Something t
3280: 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69  o set a breakpoi
3290: 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64  nt on */.  }.# d
32a0: 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29  efine REFINFO(X)
32b0: 20 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28    pager_refinfo(
32c0: 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  X).#else.# defin
32d0: 65 20 52 45 46 49 4e 46 4f 28 58 29 0a 23 65 6e  e REFINFO(X).#en
32e0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
32f0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
3300: 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20   from the given 
3310: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
3320: 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65    Store the inte
3330: 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72  ger.** that is r
3340: 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52  ead in *pRes.  R
3350: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
3360: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
3370: 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65  rked, or an.** e
3380: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
3390: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
33a0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
33b0: 20 72 65 61 64 33 32 62 69 74 73 28 4f 73 46 69   read32bits(OsFi
33c0: 6c 65 20 2a 66 64 2c 20 75 33 32 20 2a 70 52 65  le *fd, u32 *pRe
33d0: 73 29 7b 0a 20 20 75 33 32 20 72 65 73 3b 0a 20  s){.  u32 res;. 
33e0: 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20   int rc;.  rc = 
33f0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64  sqlite3OsRead(fd
3400: 2c 20 26 72 65 73 2c 20 73 69 7a 65 6f 66 28 72  , &res, sizeof(r
3410: 65 73 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  es));.  if( rc==
3420: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3430: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
3440: 63 5b 34 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  c[4];.    memcpy
3450: 28 61 63 2c 20 26 72 65 73 2c 20 34 29 3b 0a 20  (ac, &res, 4);. 
3460: 20 20 20 72 65 73 20 3d 20 28 61 63 5b 30 5d 3c     res = (ac[0]<
3470: 3c 32 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c 31  <24) | (ac[1]<<1
3480: 36 29 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29 20  6) | (ac[2]<<8) 
3490: 7c 20 61 63 5b 33 5d 3b 0a 20 20 7d 0a 20 20 2a  | ac[3];.  }.  *
34a0: 70 52 65 73 20 3d 20 72 65 73 3b 0a 20 20 72 65  pRes = res;.  re
34b0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
34c0: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
34d0: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68   integer into th
34e0: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
34f0: 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e  criptor.  Return
3500: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
3510: 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
3520: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
3530: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
3540: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
3550: 20 77 72 69 74 65 33 32 62 69 74 73 28 4f 73 46   write32bits(OsF
3560: 69 6c 65 20 2a 66 64 2c 20 75 33 32 20 76 61 6c  ile *fd, u32 val
3570: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
3580: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 61 63 5b 30  ar ac[4];.  ac[0
3590: 5d 20 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26 20  ] = (val>>24) & 
35a0: 30 78 66 66 3b 0a 20 20 61 63 5b 31 5d 20 3d 20  0xff;.  ac[1] = 
35b0: 28 76 61 6c 3e 3e 31 36 29 20 26 20 30 78 66 66  (val>>16) & 0xff
35c0: 3b 0a 20 20 61 63 5b 32 5d 20 3d 20 28 76 61 6c  ;.  ac[2] = (val
35d0: 3e 3e 38 29 20 26 20 30 78 66 66 3b 0a 20 20 61  >>8) & 0xff;.  a
35e0: 63 5b 33 5d 20 3d 20 76 61 6c 20 26 20 30 78 66  c[3] = val & 0xf
35f0: 66 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  f;.  return sqli
3600: 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61  te3OsWrite(fd, a
3610: 63 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c, 4);.}../*.** 
3620: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
3630: 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 70 61  nteger into a pa
3640: 67 65 20 68 65 61 64 65 72 20 72 69 67 68 74 20  ge header right 
3650: 62 65 66 6f 72 65 20 74 68 65 0a 2a 2a 20 70 61  before the.** pa
3660: 67 65 20 64 61 74 61 2e 20 20 54 68 69 73 20 77  ge data.  This w
3670: 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68  ill overwrite th
3680: 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70  e PgHdr.pDirty p
3690: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
36a0: 63 20 76 6f 69 64 20 73 74 6f 72 65 33 32 62 69  c void store32bi
36b0: 74 73 28 75 33 32 20 76 61 6c 2c 20 50 67 48 64  ts(u32 val, PgHd
36c0: 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65 74  r *p, int offset
36d0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
36e0: 61 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26  ar *ac;.  ac = &
36f0: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  ((unsigned char*
3700: 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
3710: 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 61 63  ))[offset];.  ac
3720: 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34 29 20  [0] = (val>>24) 
3730: 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 31 5d 20  & 0xff;.  ac[1] 
3740: 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26 20 30 78  = (val>>16) & 0x
3750: 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d 20 28 76  ff;.  ac[2] = (v
3760: 61 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b 0a 20  al>>8) & 0xff;. 
3770: 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26 20 30   ac[3] = val & 0
3780: 78 66 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  xff;.}.../*.** C
3790: 6f 6e 76 65 72 74 20 74 68 65 20 62 69 74 73 20  onvert the bits 
37a0: 69 6e 20 74 68 65 20 70 50 61 67 65 72 2d 3e 65  in the pPager->e
37b0: 72 72 4d 61 73 6b 20 69 6e 74 6f 20 61 6e 20 61  rrMask into an a
37c0: 70 70 72 6f 70 72 61 74 65 0a 2a 2a 20 72 65 74  pproprate.** ret
37d0: 75 72 6e 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  urn code..*/.sta
37e0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72  tic int pager_er
37f0: 72 63 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61  rcode(Pager *pPa
3800: 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
3810: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
3820: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
3830: 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f  k & PAGER_ERR_LO
3840: 43 4b 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c  CK )    rc = SQL
3850: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20  ITE_PROTOCOL;.  
3860: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
3870: 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f  ask & PAGER_ERR_
3880: 44 49 53 4b 20 29 20 20 20 20 72 63 20 3d 20 53  DISK )    rc = S
3890: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 69  QLITE_IOERR;.  i
38a0: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
38b0: 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 46  sk & PAGER_ERR_F
38c0: 55 4c 4c 20 29 20 20 20 20 72 63 20 3d 20 53 51  ULL )    rc = SQ
38d0: 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 69 66 28  LITE_FULL;.  if(
38e0: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
38f0: 20 26 20 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d   & PAGER_ERR_MEM
3900: 20 29 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49   )     rc = SQLI
3910: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 69 66 28 20  TE_NOMEM;.  if( 
3920: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
3930: 26 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52  & PAGER_ERR_CORR
3940: 55 50 54 20 29 20 72 63 20 3d 20 53 51 4c 49 54  UPT ) rc = SQLIT
3950: 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 72 65 74  E_CORRUPT;.  ret
3960: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
3970: 20 41 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 61   Add or remove a
3980: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6c   page from the l
3990: 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
39a0: 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65   that are in the
39b0: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  .** statement jo
39c0: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urnal..**.** The
39d0: 20 50 61 67 65 72 20 6b 65 65 70 73 20 61 20 73   Pager keeps a s
39e0: 65 70 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20  eparate list of 
39f0: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 63  pages that are c
3a00: 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74  urrently in.** t
3a10: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
3a20: 72 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70  rnal.  This help
3a30: 73 20 74 68 65 20 73 71 6c 69 74 65 33 70 61 67  s the sqlite3pag
3a40: 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 29  er_stmt_commit()
3a50: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20  .** routine run 
3a60: 4d 55 43 48 20 66 61 73 74 65 72 20 66 6f 72 20  MUCH faster for 
3a70: 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
3a80: 77 68 65 72 65 20 74 68 65 72 65 20 61 72 65 20  where there are 
3a90: 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e  many.** pages in
3aa0: 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79   memory but only
3ab0: 20 61 20 66 65 77 20 61 72 65 20 69 6e 20 74 68   a few are in th
3ac0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
3ad0: 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nal..*/.static v
3ae0: 6f 69 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f  oid page_add_to_
3af0: 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20  stmt_list(PgHdr 
3b00: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
3b10: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
3b20: 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d  ager;.  if( pPg-
3b30: 3e 69 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e  >inStmt ) return
3b40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
3b50: 3e 70 50 72 65 76 53 74 6d 74 3d 3d 30 20 26 26  >pPrevStmt==0 &&
3b60: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3d   pPg->pNextStmt=
3b70: 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 50 72  =0 );.  pPg->pPr
3b80: 65 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66  evStmt = 0;.  if
3b90: 28 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20  ( pPager->pStmt 
3ba0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  ){.    pPager->p
3bb0: 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20  Stmt->pPrevStmt 
3bc0: 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67  = pPg;.  }.  pPg
3bd0: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50  ->pNextStmt = pP
3be0: 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 70  ager->pStmt;.  p
3bf0: 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70  Pager->pStmt = p
3c00: 50 67 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d  Pg;.  pPg->inStm
3c10: 74 20 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20  t = 1;.}.static 
3c20: 76 6f 69 64 20 70 61 67 65 5f 72 65 6d 6f 76 65  void page_remove
3c30: 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28  _from_stmt_list(
3c40: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
3c50: 66 28 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20  f( !pPg->inStmt 
3c60: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
3c70: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 29  pPg->pPrevStmt )
3c80: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
3c90: 67 2d 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e  g->pPrevStmt->pN
3ca0: 65 78 74 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a  extStmt==pPg );.
3cb0: 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74      pPg->pPrevSt
3cc0: 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  mt->pNextStmt = 
3cd0: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a  pPg->pNextStmt;.
3ce0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
3cf0: 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
3d00: 2d 3e 70 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a  ->pStmt==pPg );.
3d10: 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
3d20: 3e 70 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e  >pStmt = pPg->pN
3d30: 65 78 74 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 69  extStmt;.  }.  i
3d40: 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d  f( pPg->pNextStm
3d50: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
3d60: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d   pPg->pNextStmt-
3d70: 3e 70 50 72 65 76 53 74 6d 74 3d 3d 70 50 67 20  >pPrevStmt==pPg 
3d80: 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  );.    pPg->pNex
3d90: 74 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74  tStmt->pPrevStmt
3da0: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d   = pPg->pPrevStm
3db0: 74 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e  t;.  }.  pPg->pN
3dc0: 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70  extStmt = 0;.  p
3dd0: 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  Pg->pPrevStmt = 
3de0: 30 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74  0;.  pPg->inStmt
3df0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46   = 0;.}../*.** F
3e00: 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
3e10: 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76  e hash table giv
3e20: 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62  en its page numb
3e30: 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61  er.  Return.** a
3e40: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
3e50: 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20  page or NULL if 
3e60: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74  not found..*/.st
3e70: 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65  atic PgHdr *page
3e80: 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  r_lookup(Pager *
3e90: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
3ea0: 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d  o){.  PgHdr *p =
3eb0: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70   pPager->aHash[p
3ec0: 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 5d  ager_hash(pgno)]
3ed0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26 20  ;.  while( p && 
3ee0: 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b  p->pgno!=pgno ){
3ef0: 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
3f00: 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74  tHash;.  }.  ret
3f10: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
3f20: 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
3f30: 61 73 65 20 61 6e 64 20 63 6c 65 61 72 20 74 68  ase and clear th
3f40: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
3f50: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
3f60: 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 73 74 61  .** sets the sta
3f70: 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  te of the pager 
3f80: 62 61 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20  back to what it 
3f90: 77 61 73 20 77 68 65 6e 20 69 74 20 77 61 73 20  was when it was 
3fa0: 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e  first.** opened.
3fb0: 20 20 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e    Any outstandin
3fc0: 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61  g pages are inva
3fd0: 6c 69 64 61 74 65 64 20 61 6e 64 20 73 75 62 73  lidated and subs
3fe0: 65 71 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a  equent attempts.
3ff0: 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f  ** to access tho
4000: 73 65 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69  se pages will li
4010: 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61  kely result in a
4020: 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74   coredump..*/.st
4030: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
4040: 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  reset(Pager *pPa
4050: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
4060: 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f  Pg, *pNext;.  fo
4070: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
4080: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65  ll; pPg; pPg=pNe
4090: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
40a0: 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
40b0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
40c0: 50 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  Pg);.  }.  pPage
40d0: 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20  r->pFirst = 0;. 
40e0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
40f0: 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61  ynced = 0;.  pPa
4100: 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a  ger->pLast = 0;.
4110: 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d    pPager->pAll =
4120: 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61   0;.  memset(pPa
4130: 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73  ger->aHash, 0, s
4140: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48  izeof(pPager->aH
4150: 61 73 68 29 29 3b 0a 20 20 70 50 61 67 65 72 2d  ash));.  pPager-
4160: 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66  >nPage = 0;.  if
4170: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
4180: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
4190: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61  ){.    sqlite3pa
41a0: 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
41b0: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
41c0: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61  te3OsUnlock(&pPa
41d0: 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
41e0: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61  );.  pPager->sta
41f0: 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
4200: 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  K;.  pPager->dbS
4210: 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67  ize = -1;.  pPag
4220: 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20  er->nRef = 0;.  
4230: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
4240: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
4250: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  ;.}../*.** When 
4260: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
4270: 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65  called, the page
4280: 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  r has the journa
4290: 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a  l file open and.
42a0: 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ** a RESERVED or
42b0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
42c0: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
42d0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72    This routine r
42e0: 65 6c 65 61 73 65 73 0a 2a 2a 20 74 68 65 20 64  eleases.** the d
42f0: 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64  atabase lock and
4300: 20 61 63 71 75 69 72 65 73 20 61 20 53 48 41 52   acquires a SHAR
4310: 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70  ED lock in its p
4320: 6c 61 63 65 2e 20 20 54 68 65 20 6a 6f 75 72 6e  lace.  The journ
4330: 61 6c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 64 65  al.** file is de
4340: 6c 65 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64  leted and closed
4350: 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f  ..**.** TODO: Co
4360: 6e 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20 74  nsider keeping t
4370: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
4380: 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61  open for tempora
4390: 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a  ry databases..**
43a0: 20 54 68 69 73 20 6d 69 67 68 74 20 67 69 76 65   This might give
43b0: 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69   a performance i
43c0: 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69  mprovement on wi
43d0: 6e 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65 6e  ndows where open
43e0: 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73  ing.** a file is
43f0: 20 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70   an expensive op
4400: 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  eration..*/.stat
4410: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 75 6e 77  ic int pager_unw
4420: 72 69 74 65 6c 6f 63 6b 28 50 61 67 65 72 20 2a  ritelock(Pager *
4430: 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
4440: 20 2a 70 50 67 3b 0a 20 20 69 66 28 20 70 50 61   *pPg;.  if( pPa
4450: 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52  ger->state<PAGER
4460: 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
4470: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
4480: 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  K;.  }.  sqlite3
4490: 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69  pager_stmt_commi
44a0: 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  t(pPager);.  if(
44b0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
44c0: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
44d0: 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d  OsClose(&pPager-
44e0: 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50 61 67  >stfd);.    pPag
44f0: 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30  er->stmtOpen = 0
4500: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
4510: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
4520: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
4530: 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a  Close(&pPager->j
4540: 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  fd);.    pPager-
4550: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30  >journalOpen = 0
4560: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44  ;.    sqlite3OsD
4570: 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a  elete(pPager->zJ
4580: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71 6c  ournal);.    sql
4590: 69 74 65 46 72 65 65 28 20 70 50 61 67 65 72 2d  iteFree( pPager-
45a0: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >aInJournal );. 
45b0: 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f     pPager->aInJo
45c0: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66  urnal = 0;.    f
45d0: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
45e0: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
45f0: 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
4600: 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
4610: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  al = 0;.      pP
4620: 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
4630: 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
4640: 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 0;.    }.  }
4650: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
4660: 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43  ( pPager->dirtyC
4670: 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  ache==0 || pPage
4680: 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30  r->useJournal==0
4690: 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   );.  }.  sqlite
46a0: 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  3OsUnlock(&pPage
46b0: 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
46c0: 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  CK);.  pPager->s
46d0: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
46e0: 52 45 44 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  RED;.  return SQ
46f0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
4700: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  * Compute and re
4710: 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
4720: 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66 20  for the page of 
4730: 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  data..**.** This
4740: 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63   is not a real c
4750: 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20  hecksum.  It is 
4760: 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20  really just the 
4770: 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72  sum of the .** r
4780: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61  andom initial va
4790: 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  lue and the page
47a0: 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 63 6f 6e   number.  We con
47b0: 73 69 64 65 72 65 64 20 64 6f 20 61 20 63 68 65  sidered do a che
47c0: 63 6b 73 75 6d 0a 2a 2a 20 6f 66 20 74 68 65 20  cksum.** of the 
47d0: 64 61 74 61 62 61 73 65 2c 20 62 75 74 20 74 68  database, but th
47e0: 61 74 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20  at was found to 
47f0: 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2f 0a  be too slow..*/.
4800: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
4810: 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50  _cksum(Pager *pP
4820: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  ager, Pgno pgno,
4830: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 44 61   const char *aDa
4840: 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d  ta){.  u32 cksum
4850: 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
4860: 49 6e 69 74 20 2b 20 70 67 6e 6f 3b 0a 20 20 72  Init + pgno;.  r
4870: 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a  eturn cksum;.}..
4880: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e  /*.** Read a sin
4890: 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  gle page from th
48a0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
48b0: 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64 65  pened on file de
48c0: 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e  scriptor.** jfd.
48d0: 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69 73 20    Playback this 
48e0: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  one page..**.** 
48f0: 0a 2a 2a 20 0a 2a 2a 20 54 68 65 72 65 20 61 72  .** .** There ar
4900: 65 20 74 68 72 65 65 20 64 69 66 66 65 72 65 6e  e three differen
4910: 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  t journal format
4920: 73 2e 20 20 54 68 65 20 66 6f 72 6d 61 74 20 70  s.  The format p
4930: 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69  arameter determi
4940: 6e 65 73 0a 2a 2a 20 77 68 69 63 68 20 66 6f 72  nes.** which for
4950: 6d 61 74 20 69 73 20 75 73 65 64 20 62 79 20 74  mat is used by t
4960: 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20  he journal that 
4970: 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  is played back..
4980: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
4990: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
49a0: 5f 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  _page(Pager *pPa
49b0: 67 65 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64  ger, OsFile *jfd
49c0: 2c 20 69 6e 74 20 75 73 65 43 6b 73 75 6d 29 7b  , int useCksum){
49d0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48  .  int rc;.  PgH
49e0: 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20  dr *pPg;        
49f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
4a00: 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69   existing page i
4a10: 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  n the cache */. 
4a20: 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
4a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4a40: 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
4a50: 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a  r of a page in j
4a60: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
4a70: 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
4a80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
4a90: 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73  cksum used for s
4aa0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a  anity checking *
4ab0: 2f 0a 20 20 75 38 20 61 44 61 74 61 5b 53 51 4c  /.  u8 aData[SQL
4ac0: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 20  ITE_PAGE_SIZE]; 
4ad0: 20 20 2f 2a 20 53 74 6f 72 65 20 64 61 74 61 20    /* Store data 
4ae0: 68 65 72 65 20 2a 2f 0a 0a 20 20 72 63 20 3d 20  here */..  rc = 
4af0: 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
4b00: 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63  &pgno);.  if( rc
4b10: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
4b20: 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
4b30: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66  sqlite3OsRead(jf
4b40: 64 2c 20 26 61 44 61 74 61 2c 20 70 50 61 67 65  d, &aData, pPage
4b50: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
4b60: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
4b70: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
4b80: 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
4b90: 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
4ba0: 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20  .  This is more 
4bb0: 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49  important that I
4bc0: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a   originally.  **
4bd0: 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20   thought.  If a 
4be0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
4bf0: 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a  curs while the j
4c00: 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20  ournal is being 
4c10: 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74  written,.  ** it
4c20: 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76   could cause inv
4c30: 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20  alid data to be 
4c40: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
4c50: 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65   journal.  We ne
4c60: 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63  ed to.  ** detec
4c70: 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64  t this invalid d
4c80: 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70  ata (with high p
4c90: 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20  robability) and 
4ca0: 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a  ignore it..  */.
4cb0: 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b    if( pgno==0 ){
4cc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
4cd0: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
4ce0: 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e 65  f( pgno>(unsigne
4cf0: 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  d)pPager->dbSize
4d00: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
4d10: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
4d20: 69 66 28 20 75 73 65 43 6b 73 75 6d 20 29 7b 0a  if( useCksum ){.
4d30: 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62      rc = read32b
4d40: 69 74 73 28 6a 66 64 2c 20 26 63 6b 73 75 6d 29  its(jfd, &cksum)
4d50: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
4d60: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66  eturn rc;.    if
4d70: 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  ( pager_cksum(pP
4d80: 61 67 65 72 2c 20 70 67 6e 6f 2c 20 61 44 61 74  ager, pgno, aDat
4d90: 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20  a)!=cksum ){.   
4da0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
4db0: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
4dc0: 0a 0a 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20  ..  /* Playback 
4dd0: 74 68 65 20 70 61 67 65 2e 20 20 55 70 64 61 74  the page.  Updat
4de0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
4df0: 63 6f 70 79 20 6f 66 20 74 68 65 20 70 61 67 65  copy of the page
4e00: 0a 20 20 2a 2a 20 61 74 20 74 68 65 20 73 61 6d  .  ** at the sam
4e10: 65 20 74 69 6d 65 2c 20 69 66 20 74 68 65 72 65  e time, if there
4e20: 20 69 73 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20   is one..  */.  
4e30: 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
4e40: 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
4e50: 3b 0a 20 20 54 52 41 43 45 32 28 22 50 4c 41 59  ;.  TRACE2("PLAY
4e60: 42 41 43 4b 20 70 61 67 65 20 25 64 5c 6e 22 2c  BACK page %d\n",
4e70: 20 70 67 6e 6f 29 3b 0a 20 20 73 71 6c 69 74 65   pgno);.  sqlite
4e80: 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
4e90: 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 6f  >fd, (pgno-1)*(o
4ea0: 66 66 5f 74 29 53 51 4c 49 54 45 5f 50 41 47 45  ff_t)SQLITE_PAGE
4eb0: 5f 53 49 5a 45 29 3b 0a 20 20 72 63 20 3d 20 73  _SIZE);.  rc = s
4ec0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70  qlite3OsWrite(&p
4ed0: 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61 74 61  Pager->fd, aData
4ee0: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
4ef0: 5a 45 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29  ZE);.  if( pPg )
4f00: 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65  {.    /* No page
4f10: 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20   should ever be 
4f20: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74  rolled back that
4f30: 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65   is in use, exce
4f40: 70 74 20 66 6f 72 20 70 61 67 65 0a 20 20 20 20  pt for page.    
4f50: 2a 2a 20 31 20 77 68 69 63 68 20 69 73 20 68 65  ** 1 which is he
4f60: 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64  ld in use in ord
4f70: 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c  er to keep the l
4f80: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
4f90: 61 73 65 0a 20 20 20 20 2a 2a 20 61 63 74 69 76  ase.    ** activ
4fa0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f  e..    */.    vo
4fb0: 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 61  id *pData;.    a
4fc0: 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
4fd0: 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f  ==0 || pPg->pgno
4fe0: 3d 3d 31 20 29 3b 0a 20 20 20 20 70 44 61 74 61  ==1 );.    pData
4ff0: 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41   = PGHDR_TO_DATA
5000: 28 70 50 67 29 3b 0a 20 20 20 20 6d 65 6d 63 70  (pPg);.    memcp
5010: 79 28 70 44 61 74 61 2c 20 61 44 61 74 61 2c 20  y(pData, aData, 
5020: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
5030: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
5040: 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29  r->xDestructor )
5050: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
5060: 78 44 65 73 74 72 75 63 74 6f 72 28 70 44 61 74  xDestructor(pDat
5070: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
5080: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
5090: 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
50a0: 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
50b0: 63 20 3d 20 30 3b 0a 20 20 20 20 43 4f 44 45 43  c = 0;.    CODEC
50c0: 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
50d0: 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20  pPg->pgno, 3);. 
50e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
50f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
5100: 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68  er zMaster is th
5110: 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74  e name of a mast
5120: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
5130: 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61   A single journa
5140: 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72  l.** file that r
5150: 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d  eferred to the m
5160: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
5170: 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  le has just been
5180: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
5190: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
51a0: 65 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f  ecks if it is po
51b0: 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
51c0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
51d0: 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64  nal file,.** and
51e0: 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69   does so if it i
51f0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
5200: 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
5210: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61  (const char *zMa
5220: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
5230: 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70  .  int master_op
5240: 65 6e 20 3d 20 30 3b 0a 20 20 4f 73 46 69 6c 65  en = 0;.  OsFile
5250: 20 6d 61 73 74 65 72 3b 0a 20 20 63 68 61 72 20   master;.  char 
5260: 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  *zMasterJournal 
5270: 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73  = 0; /* Contents
5280: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
5290: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 6f 66 66  al file */.  off
52a0: 5f 74 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  _t nMasterJourna
52b0: 6c 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  l;     /* Size o
52c0: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
52d0: 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f   file */..  /* O
52e0: 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a  pen the master j
52f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c  ournal file excl
5300: 75 73 69 76 65 6c 79 20 69 6e 20 63 61 73 65 20  usively in case 
5310: 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
5320: 73 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69  ss.  ** is runni
5330: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
5340: 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69  also. Not that i
5350: 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68  t makes too much
5360: 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a   difference..  *
5370: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
5380: 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
5390: 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73 74 65 72  zMaster, &master
53a0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
53b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
53c0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
53d0: 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20    master_open = 
53e0: 31 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  1;..  rc = sqlit
53f0: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 6d 61  e3OsFileSize(&ma
5400: 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f  ster, &nMasterJo
5410: 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63  urnal);.  if( rc
5420: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
5430: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
5440: 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72  ;..  if( nMaster
5450: 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20  Journal>0 ){.   
5460: 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 20 20   char *zDb;.    
5470: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
5480: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d   (char *)sqliteM
5490: 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75  alloc(nMasterJou
54a0: 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 21  rnal);.    if( !
54b0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
54c0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
54d0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
54e0: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
54f0: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  out;.    }.    r
5500: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
5510: 64 28 26 6d 61 73 74 65 72 2c 20 7a 4d 61 73 74  d(&master, zMast
5520: 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73 74  erJournal, nMast
5530: 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  erJournal);.    
5540: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
5550: 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
5560: 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 44 62  er_out;..    zDb
5570: 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61   = zMasterJourna
5580: 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a  l;.    while( (z
5590: 44 62 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  Db-zMasterJourna
55a0: 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l)<nMasterJourna
55b0: 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  l ){.      char 
55c0: 2a 7a 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  *zJournal = 0;. 
55d0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53       sqlite3SetS
55e0: 74 72 69 6e 67 28 26 7a 4a 6f 75 72 6e 61 6c 2c  tring(&zJournal,
55f0: 20 7a 44 62 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22   zDb, "-journal"
5600: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
5610: 21 7a 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  !zJournal ){.   
5620: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
5630: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
5640: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
5650: 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
5660: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46    if( sqlite3OsF
5670: 69 6c 65 45 78 69 73 74 73 28 7a 4a 6f 75 72 6e  ileExists(zJourn
5680: 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  al) ){.        /
5690: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75  * One of the jou
56a0: 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f  rnals pointed to
56b0: 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a   by the master j
56c0: 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20  ournal exists.. 
56d0: 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69         ** Open i
56e0: 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69  t and check if i
56f0: 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  t points at the 
5700: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
5710: 49 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  If.        ** so
5720: 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  , return without
5730: 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61   deleting the ma
5740: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
5750: 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
5760: 20 20 20 20 20 20 4f 73 46 69 6c 65 20 6a 6f 75        OsFile jou
5770: 72 6e 61 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e  rnal;.        in
5780: 74 20 6e 4d 61 73 74 65 72 3b 0a 20 20 20 20 20  t nMaster;.     
5790: 20 20 20 6f 66 66 5f 74 20 6a 73 7a 3b 0a 0a 20     off_t jsz;.. 
57a0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
57b0: 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
57c0: 79 28 7a 4a 6f 75 72 6e 61 6c 2c 20 26 6a 6f 75  y(zJournal, &jou
57d0: 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  rnal);.        s
57e0: 71 6c 69 74 65 46 72 65 65 28 7a 4a 6f 75 72 6e  qliteFree(zJourn
57f0: 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  al);.        if(
5800: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5810: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
5820: 74 65 33 4f 73 43 6c 6f 73 65 28 26 6a 6f 75 72  te3OsClose(&jour
5830: 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nal);.          
5840: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
5850: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 09  ut;.        }...
5860: 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
5870: 66 69 6c 65 20 69 73 20 62 69 67 20 65 6e 6f 75  file is big enou
5880: 67 68 20 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e  gh to be a journ
5890: 61 6c 20 66 69 6c 65 0a 20 20 20 20 20 20 20 20  al file.        
58a0: 2a 2a 20 77 69 74 68 20 74 68 65 20 72 65 71 75  ** with the requ
58b0: 69 72 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72  ired master jour
58c0: 6e 61 6c 20 6e 61 6d 65 2e 20 49 66 20 6e 6f 74  nal name. If not
58d0: 2c 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 20  , ignore it..   
58e0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
58f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
5900: 6c 65 53 69 7a 65 28 26 6a 6f 75 72 6e 61 6c 2c  leSize(&journal,
5910: 20 26 6a 73 7a 29 3b 0a 20 20 20 20 20 20 20 20   &jsz);.        
5920: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
5930: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
5940: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6a  qlite3OsClose(&j
5950: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  ournal);.       
5960: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
5970: 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
5980: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 73 7a  .        if( jsz
5990: 3c 28 32 35 2b 73 74 72 6c 65 6e 28 7a 4d 61 73  <(25+strlen(zMas
59a0: 74 65 72 29 29 20 29 7b 0a 20 20 20 20 20 20 20  ter)) ){.       
59b0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
59c0: 65 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  e(&journal);.   
59d0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
59e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
59f0: 20 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 53     .        /* S
5a00: 65 65 6b 20 74 6f 20 74 68 65 20 70 6f 69 6e 74  eek to the point
5a10: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
5a20: 77 68 65 72 65 20 74 68 65 20 6d 61 73 74 65 72  where the master
5a30: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20   journal name.  
5a40: 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 6f 72        ** is stor
5a50: 65 64 2e 20 52 65 61 64 20 74 68 65 20 6d 61 73  ed. Read the mas
5a60: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
5a70: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
5a80: 61 69 6e 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  ained.        **
5a90: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 20 20   from malloc..  
5aa0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
5ab0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
5ac0: 65 65 6b 28 26 6a 6f 75 72 6e 61 6c 2c 20 32 30  eek(&journal, 20
5ad0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
5ae0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
5af0: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
5b00: 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
5b10: 72 65 61 64 33 32 62 69 74 73 28 26 6a 6f 75 72  read32bits(&jour
5b20: 6e 61 6c 2c 20 28 75 33 32 2a 29 26 6e 4d 61 73  nal, (u32*)&nMas
5b30: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ter);.        if
5b40: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5b50: 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
5b60: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 69 66  _out;.        if
5b70: 28 20 6e 4d 61 73 74 65 72 3e 30 20 26 26 20 6e  ( nMaster>0 && n
5b80: 4d 61 73 74 65 72 3e 3d 73 74 72 6c 65 6e 28 7a  Master>=strlen(z
5b90: 4d 61 73 74 65 72 29 2b 31 20 29 7b 0a 20 20 20  Master)+1 ){.   
5ba0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d 61         char *zMa
5bb0: 73 74 65 72 50 74 72 20 3d 20 28 63 68 61 72 20  sterPtr = (char 
5bc0: 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e  *)sqliteMalloc(n
5bd0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
5be0: 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 50     if( !zMasterP
5bf0: 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  tr ){.          
5c00: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
5c10: 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  MEM;.          }
5c20: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
5c30: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26 6a  sqlite3OsRead(&j
5c40: 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50  ournal, zMasterP
5c50: 74 72 2c 20 6e 4d 61 73 74 65 72 29 3b 0a 20 20  tr, nMaster);.  
5c60: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
5c70: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5c80: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46           sqliteF
5c90: 72 65 65 28 7a 4d 61 73 74 65 72 50 74 72 29 3b  ree(zMasterPtr);
5ca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
5cb0: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
5cc0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
5cd0: 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74         if( 0==st
5ce0: 72 6e 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  rncmp(zMasterPtr
5cf0: 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74  , zMaster, nMast
5d00: 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  er) ){.         
5d10: 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20     /* We have a 
5d20: 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65  match. Do not de
5d30: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
5d40: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
5d50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
5d60: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 50  iteFree(zMasterP
5d70: 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  tr);.           
5d80: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
5d90: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  out;.          }
5da0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5db0: 20 7d 0a 20 20 20 20 20 20 7a 44 62 20 2b 3d 20   }.      zDb += 
5dc0: 28 73 74 72 6c 65 6e 28 7a 44 62 29 2b 31 29 3b  (strlen(zDb)+1);
5dd0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
5de0: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
5df0: 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65 6c 6d 61  zMaster);..delma
5e00: 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20  ster_out:.  if( 
5e10: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
5e20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
5e30: 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  (zMasterJournal)
5e40: 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d 61  ;.  }  .  if( ma
5e50: 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20  ster_open ){.   
5e60: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
5e70: 26 6d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20  &master);.  }.  
5e80: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5e90: 0a 2a 2a 20 4d 61 6b 65 20 65 76 65 72 79 20 70  .** Make every p
5ea0: 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
5eb0: 20 61 67 72 65 65 20 77 69 74 68 20 77 68 61 74   agree with what
5ec0: 20 69 73 20 6f 6e 20 64 69 73 6b 2e 20 20 49 6e   is on disk.  In
5ed0: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 2a 2a   other words,.**
5ee0: 20 72 65 72 65 61 64 20 74 68 65 20 64 69 73 6b   reread the disk
5ef0: 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 73 74   to reset the st
5f00: 61 74 65 20 6f 66 20 74 68 65 20 63 61 63 68 65  ate of the cache
5f10: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
5f20: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61  tine is called a
5f30: 66 74 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 20  fter a rollback 
5f40: 69 6e 20 77 68 69 63 68 20 73 6f 6d 65 20 6f 66  in which some of
5f50: 20 74 68 65 20 64 69 72 74 79 20 63 61 63 68 65   the dirty cache
5f60: 0a 2a 2a 20 70 61 67 65 73 20 68 61 64 20 6e 65  .** pages had ne
5f70: 76 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ver been written
5f80: 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20 20 57   out to disk.  W
5f90: 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 20 62  e need to roll b
5fa0: 61 63 6b 20 74 68 65 0a 2a 2a 20 63 61 63 68 65  ack the.** cache
5fb0: 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65   content and the
5fc0: 20 65 61 73 69 65 73 74 20 77 61 79 20 74 6f 20   easiest way to 
5fd0: 64 6f 20 74 68 61 74 20 69 73 20 74 6f 20 72 65  do that is to re
5fe0: 72 65 61 64 20 74 68 65 20 6f 6c 64 20 63 6f 6e  read the old con
5ff0: 74 65 6e 74 0a 2a 2a 20 62 61 63 6b 20 66 72 6f  tent.** back fro
6000: 6d 20 74 68 65 20 64 69 73 6b 2e 0a 2a 2f 0a 73  m the disk..*/.s
6010: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
6020: 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 50 61 67  reload_cache(Pag
6030: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
6040: 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
6050: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
6060: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
6070: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
6080: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
6090: 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b  {.    char zBuf[
60a0: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
60b0: 5d 3b 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d  ];.    if( !pPg-
60c0: 3e 64 69 72 74 79 20 29 20 63 6f 6e 74 69 6e 75  >dirty ) continu
60d0: 65 3b 0a 20 20 20 20 69 66 28 20 28 69 6e 74 29  e;.    if( (int)
60e0: 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61  pPg->pgno <= pPa
60f0: 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
6100: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6110: 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
6120: 66 64 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  fd, SQLITE_PAGE_
6130: 53 49 5a 45 2a 28 6f 66 66 5f 74 29 28 70 50 67  SIZE*(off_t)(pPg
6140: 2d 3e 70 67 6e 6f 2d 31 29 29 3b 0a 20 20 20 20  ->pgno-1));.    
6150: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6160: 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e 66 64  Read(&pPager->fd
6170: 2c 20 7a 42 75 66 2c 20 53 51 4c 49 54 45 5f 50  , zBuf, SQLITE_P
6180: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  AGE_SIZE);.     
6190: 20 54 52 41 43 45 32 28 22 52 45 46 45 54 43 48   TRACE2("REFETCH
61a0: 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50 67   page %d\n", pPg
61b0: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43  ->pgno);.      C
61c0: 4f 44 45 43 28 70 50 61 67 65 72 2c 20 7a 42 75  ODEC(pPager, zBu
61d0: 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 32 29  f, pPg->pgno, 2)
61e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
61f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73   break;.    }els
6200: 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  e{.      memset(
6210: 7a 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f  zBuf, 0, SQLITE_
6220: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
6230: 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e  }.    if( pPg->n
6240: 52 65 66 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70  Ref==0 || memcmp
6250: 28 7a 42 75 66 2c 20 50 47 48 44 52 5f 54 4f 5f  (zBuf, PGHDR_TO_
6260: 44 41 54 41 28 70 50 67 29 2c 20 53 51 4c 49 54  DATA(pPg), SQLIT
6270: 45 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 7b 0a  E_PAGE_SIZE) ){.
6280: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48        memcpy(PGH
6290: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
62a0: 20 7a 42 75 66 2c 20 53 51 4c 49 54 45 5f 50 41   zBuf, SQLITE_PA
62b0: 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  GE_SIZE);.      
62c0: 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69  if( pPager->xRei
62d0: 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  niter ){.       
62e0: 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
62f0: 65 72 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  er(PGHDR_TO_DATA
6300: 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70  (pPg), pPager->p
6310: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
6320: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
6330: 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45  emset(PGHDR_TO_E
6340: 58 54 52 41 28 70 50 67 29 2c 20 30 2c 20 70 50  XTRA(pPg), 0, pP
6350: 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20  ager->nExtra);. 
6360: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6370: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
6380: 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72   0;.    pPg->dir
6390: 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ty = 0;.  }.  re
63a0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
63b0: 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  ** Playback the 
63c0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73  journal and thus
63d0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
63e0: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a  abase file to.**
63f0: 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61   the state it wa
6400: 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73  s in before we s
6410: 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68  tarted making ch
6420: 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  anges.  .**.** T
6430: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
6440: 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c  format is as fol
6450: 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31  lows: .**.**  (1
6460: 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78  )  8 byte prefix
6470: 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f  .  A copy of aJo
6480: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
6490: 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69    (2)  4 byte bi
64a0: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
64b0: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
64c0: 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61  mber of valid pa
64d0: 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20  ge records.**   
64e0: 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e      in the journ
64f0: 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c  al.  If this val
6500: 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
6510: 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74  , then compute t
6520: 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62  he.**       numb
6530: 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72  er of page recor
6540: 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ds from the jour
6550: 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33  nal size..**  (3
6560: 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
6570: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
6580: 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  ch is the initia
6590: 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  l value for the 
65a0: 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79  .**       sanity
65b0: 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28   checksum..**  (
65c0: 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  4)  4 byte integ
65d0: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
65e0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
65f0: 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  to truncate the.
6600: 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73  **       databas
6610: 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f  e to during a ro
6620: 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20  llback..**  (5) 
6630: 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
6640: 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
6650: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
6660: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
6670: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65  al.**       name
6680: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61 79  .  The value may
6690: 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63 61   be zero (indica
66a0: 74 65 20 74 68 61 74 20 74 68 65 72 65 20 69 73  te that there is
66b0: 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20   no master.**   
66c0: 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a      journal.).**
66d0: 20 20 28 36 29 20 20 4e 20 62 79 74 65 73 20 6f    (6)  N bytes o
66e0: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
66f0: 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20  rnal name.  The 
6700: 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c  name will be nul
6710: 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20  -terminated.**  
6720: 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20 62       and might b
6730: 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20 74  e shorter than t
6740: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
6750: 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65 20  om (5).  If the 
6760: 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20 20  first byte.**   
6770: 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65 20      of the name 
6780: 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68 65  is \000 then the
6790: 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 20  re is no master 
67a0: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61  journal.  The ma
67b0: 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f  ster.**       jo
67c0: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73 74  urnal name is st
67d0: 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a  ored in UTF-8..*
67e0: 2a 20 20 28 37 29 20 20 5a 65 72 6f 20 6f 72 20  *  (7)  Zero or 
67f0: 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61  more pages insta
6800: 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f  nces, each as fo
6810: 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20  llows:.**       
6820: 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20   +  4 byte page 
6830: 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20  number..**      
6840: 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67    +  pPager->pag
6850: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
6860: 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ata..**        +
6870: 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75    4 byte checksu
6880: 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20  m.**.** When we 
6890: 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75  speak of the jou
68a0: 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20  rnal header, we 
68b0: 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 36  mean the first 6
68c0: 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a   items above..**
68d0: 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74   Each entry in t
68e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e  he journal is an
68f0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
6900: 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a   7th item..**.**
6910: 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20   Call the value 
6920: 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20  from the second 
6930: 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20  bullet "nRec".  
6940: 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62  nRec is the numb
6950: 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70  er of.** valid p
6960: 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74  age entries in t
6970: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
6980: 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20  most cases, you 
6990: 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  can compute the.
69a0: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  ** value of nRec
69b0: 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
69c0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
69d0: 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f  le.  But if a po
69e0: 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f  wer.** failure o
69f0: 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68  ccurred while th
6a00: 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
6a10: 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20  ing written, it 
6a20: 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20  could be the.** 
6a30: 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69  case that the si
6a40: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
6a50: 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61  l file had alrea
6a60: 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65  dy been increase
6a70: 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74  d but.** the ext
6a80: 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e  ra entries had n
6a90: 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73  ot yet made it s
6aa0: 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20  afely to disk.  
6ab0: 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a  In such a case,.
6ac0: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
6ad0: 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
6ae0: 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
6af0: 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61   would be too la
6b00: 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61  rge.  For.** tha
6b10: 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77  t reason, we alw
6b20: 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63  ays use the nRec
6b30: 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65   value in the he
6b40: 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ader..**.** If t
6b50: 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73  he nRec value is
6b60: 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d   0xffffffff it m
6b70: 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73  eans that nRec s
6b80: 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
6b90: 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69  d.** from the fi
6ba0: 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76  le size.  This v
6bb0: 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65  alue is used whe
6bc0: 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63  n the user selec
6bd0: 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e  ts the.** no-syn
6be0: 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65  c option for the
6bf0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77   journal.  A pow
6c00: 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
6c10: 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74   lead to corrupt
6c20: 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ion.** in this c
6c30: 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68  ase.  But for th
6c40: 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72  ings like tempor
6c50: 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68  ary table (which
6c60: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65   will be.** dele
6c70: 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77  ted when the pow
6c80: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20  er is restored) 
6c90: 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20  we don't care.  
6ca0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
6cb0: 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65  le opened as the
6cc0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
6cd0: 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d   not a well-form
6ce0: 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  ed.** journal fi
6cf0: 6c 65 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  le then the data
6d00: 62 61 73 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  base will likely
6d10: 20 61 6c 72 65 61 64 79 20 62 65 0a 2a 2a 20 63   already be.** c
6d20: 6f 72 72 75 70 74 65 64 2c 20 73 6f 20 74 68 65  orrupted, so the
6d30: 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55   PAGER_ERR_CORRU
6d40: 50 54 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  PT bit is set in
6d50: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
6d60: 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 43  .** and SQLITE_C
6d70: 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e  ORRUPT is return
6d80: 65 64 2e 20 20 49 66 20 69 74 20 61 6c 6c 20 77  ed.  If it all w
6d90: 6f 72 6b 73 2c 20 74 68 65 6e 20 74 68 69 73 20  orks, then this 
6da0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
6db0: 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  ns SQLITE_OK..*/
6dc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
6dd0: 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  r_playback(Pager
6de0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 75 73   *pPager, int us
6df0: 65 4a 6f 75 72 6e 61 6c 53 69 7a 65 29 7b 0a 20  eJournalSize){. 
6e00: 20 6f 66 66 5f 74 20 73 7a 4a 3b 20 20 20 20 20   off_t szJ;     
6e10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
6e20: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
6e30: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
6e40: 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  /.  int nRec;   
6e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6e60: 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64  Number of Record
6e70: 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
6e80: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6ea0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
6eb0: 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20  /.  Pgno mxPg = 
6ec0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
6ed0: 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67  Size of the orig
6ee0: 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67  inal file in pag
6ef0: 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  es */.  unsigned
6f00: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
6f10: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
6f20: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
6f30: 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  eader */.  int r
6f40: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
6f50: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
6f60: 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69  de of a subrouti
6f70: 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73  ne */.  int nMas
6f80: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
6f90: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
6fa0: 74 65 73 20 69 6e 20 74 68 65 20 6e 61 6d 65 20  tes in the name 
6fb0: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
6fc0: 6c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  l */.  char *zMa
6fd0: 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ster = 0;       
6fe0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65  /* Name of maste
6ff0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
7000: 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46  f any */..  /* F
7010: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
7020: 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
7030: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
7040: 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20  Abort early if. 
7050: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
7060: 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20  is empty..  */. 
7070: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
7080: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
7090: 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
70a0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  &pPager->jfd, 0)
70b0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
70c0: 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67  OsFileSize(&pPag
70d0: 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
70e0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
70f0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
7100: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
7110: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6a  }..  /* If the j
7120: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
7130: 6f 6f 20 73 6d 61 6c 6c 20 74 6f 20 63 6f 6e 74  oo small to cont
7140: 61 69 6e 20 61 20 63 6f 6d 70 6c 65 74 65 20 68  ain a complete h
7150: 65 61 64 65 72 2c 0a 20 20 2a 2a 20 69 74 20 6d  eader,.  ** it m
7160: 75 73 74 20 6d 65 61 6e 20 74 68 61 74 20 74 68  ust mean that th
7170: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  e process that c
7180: 72 65 61 74 65 64 20 74 68 65 20 6a 6f 75 72 6e  reated the journ
7190: 61 6c 20 77 61 73 20 6a 75 73 74 0a 20 20 2a 2a  al was just.  **
71a0: 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 20 77 72   beginning to wr
71b0: 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ite the journal 
71c0: 66 69 6c 65 20 77 68 65 6e 20 69 74 20 64 69 65  file when it die
71d0: 64 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  d.  In that case
71e0: 2c 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62  ,.  ** the datab
71f0: 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20  ase file should 
7200: 68 61 76 65 20 73 74 69 6c 6c 20 62 65 65 6e 20  have still been 
7210: 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 63 68 61  completely uncha
7220: 6e 67 65 64 2e 0a 20 20 2a 2a 20 4e 6f 74 68 69  nged..  ** Nothi
7230: 6e 67 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  ng needs to be r
7240: 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 57 65 20  olled back.  We 
7250: 63 61 6e 20 73 61 66 65 6c 79 20 69 67 6e 6f 72  can safely ignor
7260: 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a  e this journal..
7270: 20 20 2a 2f 0a 20 20 69 66 28 20 73 7a 4a 20 3c    */.  if( szJ <
7280: 20 32 34 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20   24 ){.    goto 
7290: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
72a0: 7d 0a 0a 20 20 2f 2a 20 28 31 29 20 52 65 61 64  }..  /* (1) Read
72b0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
72c0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  f the journal an
72d0: 64 20 76 65 72 69 66 79 20 74 68 65 20 6d 61 67  d verify the mag
72e0: 69 63 20 73 74 72 69 6e 67 0a 20 20 2a 2a 20 61  ic string.  ** a
72f0: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
7300: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  of the journal. 
7310: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
7320: 33 4f 73 52 65 61 64 28 26 70 50 61 67 65 72 2d  3OsRead(&pPager-
7330: 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69  >jfd, aMagic, si
7340: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 3b 0a 20  zeof(aMagic));. 
7350: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
7360: 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61  OK || memcmp(aMa
7370: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
7380: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
7390: 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 63  c))!=0 ){.    rc
73a0: 20 3d 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43   = SQLITE_PROTOC
73b0: 4f 4c 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  OL;.    goto end
73c0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
73d0: 20 20 2f 2a 20 28 32 29 20 52 65 61 64 20 74 68    /* (2) Read th
73e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
73f0: 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
7400: 6a 6f 75 72 6e 61 6c 2e 20 20 2a 2f 0a 20 20 72  journal.  */.  r
7410: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 26  c = read32bits(&
7420: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 75 33  pPager->jfd, (u3
7430: 32 2a 29 26 6e 52 65 63 29 3b 0a 20 20 69 66 28  2*)&nRec);.  if(
7440: 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70   rc ) goto end_p
7450: 6c 61 79 62 61 63 6b 3b 0a 20 20 69 66 28 20 6e  layback;.  if( n
7460: 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20  Rec==0xffffffff 
7470: 7c 7c 20 75 73 65 4a 6f 75 72 6e 61 6c 53 69 7a  || useJournalSiz
7480: 65 20 29 7b 0a 20 20 20 20 6e 52 65 63 20 3d 20  e ){.    nRec = 
7490: 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48  (szJ - JOURNAL_H
74a0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a  DR_SZ(pPager))/J
74b0: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
74c0: 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
74d0: 28 33 29 20 52 65 61 64 20 74 68 65 20 69 6e 69  (3) Read the ini
74e0: 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74  tial value for t
74f0: 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73  he sanity checks
7500: 75 6d 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61  um */.  rc = rea
7510: 64 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d  d32bits(&pPager-
7520: 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 63  >jfd, &pPager->c
7530: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28  ksumInit);.  if(
7540: 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70   rc ) goto end_p
7550: 6c 61 79 62 61 63 6b 3b 0a 0a 20 20 2f 2a 20 28  layback;..  /* (
7560: 34 29 20 52 65 61 64 20 74 68 65 20 6e 75 6d 62  4) Read the numb
7570: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
7580: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
7590: 20 70 72 69 6f 72 20 74 6f 20 74 68 65 0a 20 20   prior to the.  
75a0: 2a 2a 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  ** start of the 
75b0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
75c0: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
75d0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  (&pPager->jfd, &
75e0: 6d 78 50 67 29 3b 0a 20 20 69 66 28 20 72 63 21  mxPg);.  if( rc!
75f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7600: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
7610: 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 28  ack;.  }..  /* (
7620: 35 29 20 61 6e 64 20 28 36 29 3a 20 43 68 65 63  5) and (6): Chec
7630: 6b 20 69 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  k if a master jo
7640: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 70  urnal file is sp
7650: 65 63 69 66 69 65 64 2e 20 49 66 20 6f 6e 65 20  ecified. If one 
7660: 69 73 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65  is.  ** specifie
7670: 64 2c 20 6f 6e 6c 79 20 70 72 6f 63 65 65 64 20  d, only proceed 
7680: 77 69 74 68 20 74 68 65 20 70 6c 61 79 62 61 63  with the playbac
7690: 6b 20 69 66 20 69 74 20 73 74 69 6c 6c 20 65 78  k if it still ex
76a0: 69 73 74 73 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ists. */.  rc = 
76b0: 72 65 61 64 33 32 62 69 74 73 28 26 70 50 61 67  read32bits(&pPag
76c0: 65 72 2d 3e 6a 66 64 2c 20 26 6e 4d 61 73 74 65  er->jfd, &nMaste
76d0: 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  r);.  if( rc ) g
76e0: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
76f0: 3b 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72 3e  ;.  if( nMaster>
7700: 30 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72  0 ){.    zMaster
7710: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
7720: 6e 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 69 66  nMaster);.    if
7730: 28 20 21 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20  ( !zMaster ){.  
7740: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
7750: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
7760: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
7770: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
7780: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70 50  qlite3OsRead(&pP
7790: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
77a0: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6e 4d 61 73  er, pPager->nMas
77b0: 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ter);.    if( rc
77c0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  !=SQLITE_OK || (
77d0: 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 21 73  zMaster[0] && !s
77e0: 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73  qlite3OsFileExis
77f0: 74 73 28 7a 4d 61 73 74 65 72 29 29 20 29 7b 0a  ts(zMaster)) ){.
7800: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
7810: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20  layback;.    }. 
7820: 20 7d 0a 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74   }..  /* Truncat
7830: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
7840: 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 27 73  ile back to it's
7850: 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 20 2a   original size *
7860: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
7870: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d  er->origDbSize==
7880: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6f 72 69  0 || pPager->ori
7890: 67 44 62 53 69 7a 65 3d 3d 6d 78 50 67 20 29 3b  gDbSize==mxPg );
78a0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
78b0: 73 54 72 75 6e 63 61 74 65 28 26 70 50 61 67 65  sTruncate(&pPage
78c0: 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 50 41  r->fd, SQLITE_PA
78d0: 47 45 5f 53 49 5a 45 2a 28 6f 66 66 5f 74 29 6d  GE_SIZE*(off_t)m
78e0: 78 50 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  xPg);.  if( rc!=
78f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7900: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
7910: 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  ck;.  }.  pPager
7920: 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b  ->dbSize = mxPg;
7930: 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72  .  .  /* Copy or
7940: 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
7950: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
7960: 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
7970: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
7980: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
7990: 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20   i<nRec; i++){. 
79a0: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
79b0: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
79c0: 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
79d0: 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 69 66  >jfd, 1);.    if
79e0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
79f0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  ){.      if( rc=
7a00: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
7a10: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
7a20: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
7a30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7a40: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 61 67   }.  }..  /* Pag
7a50: 65 73 20 74 68 61 74 20 68 61 76 65 20 62 65 65  es that have bee
7a60: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
7a70: 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 6e 65 76   journal but nev
7a80: 65 72 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 77  er synced.  ** w
7a90: 68 65 72 65 20 6e 6f 74 20 72 65 73 74 6f 72 65  here not restore
7aa0: 64 20 62 79 20 74 68 65 20 6c 6f 6f 70 20 61 62  d by the loop ab
7ab0: 6f 76 65 2e 20 20 57 65 20 68 61 76 65 20 74 6f  ove.  We have to
7ac0: 20 72 65 73 74 6f 72 65 20 74 68 6f 73 65 0a 20   restore those. 
7ad0: 20 2a 2a 20 70 61 67 65 73 20 62 79 20 72 65 61   ** pages by rea
7ae0: 64 69 6e 67 20 74 68 65 6d 20 62 61 63 6b 20 66  ding them back f
7af0: 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  rom the original
7b00: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
7b10: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7b20: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 61 67 65 72  _OK ){.    pager
7b30: 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50  _reload_cache(pP
7b40: 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 65 6e 64 5f  ager);.  }..end_
7b50: 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20  playback:.  if( 
7b60: 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 2f  zMaster ){.    /
7b70: 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
7b80: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
7b90: 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  and this routine
7ba0: 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 74 72 75   will return tru
7bb0: 65 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66  e,.    ** see if
7bc0: 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
7bd0: 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
7be0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  ster journal. If
7bf0: 20 65 72 72 6f 72 73 20 0a 20 20 20 20 2a 2a 20   errors .    ** 
7c00: 6f 63 63 75 72 20 64 75 72 69 6e 67 20 74 68 69  occur during thi
7c10: 73 20 70 72 6f 63 65 73 73 2c 20 69 67 6e 6f 72  s process, ignor
7c20: 65 20 74 68 65 6d 2e 0a 20 20 20 20 2a 2f 0a 20  e them..    */. 
7c30: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
7c40: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61  E_OK ){.      pa
7c50: 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 7a 4d  ger_delmaster(zM
7c60: 61 73 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  aster);.    }.  
7c70: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61    sqliteFree(zMa
7c80: 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ster);.  }.  if(
7c90: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
7ca0: 7b 0a 20 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a  {.    /* FIX ME:
7cb0: 20 57 65 20 73 68 6f 75 6c 64 6e 27 74 20 64 65   We shouldn't de
7cc0: 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
7cd0: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
7ce0: 75 72 65 64 20 64 75 72 69 6e 67 0a 20 20 20 20  ured during.    
7cf0: 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 20  ** rollback. It 
7d00: 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 61 20  may have been a 
7d10: 74 72 61 6e 73 69 65 6e 74 20 65 72 72 6f 72 20  transient error 
7d20: 61 6e 64 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  and the rollback
7d30: 20 6d 61 79 0a 20 20 20 20 2a 2a 20 73 75 63 63   may.    ** succ
7d40: 65 65 64 20 6e 65 78 74 20 74 69 6d 65 20 69 74  eed next time it
7d50: 20 69 73 20 61 74 74 65 6d 70 74 65 64 2e 0a 20   is attempted.. 
7d60: 20 20 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f     */.    pager_
7d70: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
7d80: 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
7d90: 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45  >errMask |= PAGE
7da0: 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20  R_ERR_CORRUPT;. 
7db0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
7dc0: 4f 52 52 55 50 54 3b 0a 20 20 7d 65 6c 73 65 7b  ORRUPT;.  }else{
7dd0: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
7de0: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
7df0: 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
7e00: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
7e10: 6c 61 79 62 61 63 6b 20 74 68 65 20 73 74 61 74  layback the stat
7e20: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ement journal..*
7e30: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 69 6d  *.** This is sim
7e40: 69 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e 67 20  ilar to playing 
7e50: 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  back the transac
7e60: 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74  tion journal but
7e70: 20 77 69 74 68 0a 2a 2a 20 61 20 66 65 77 20 65   with.** a few e
7e80: 78 74 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a  xtra twists..**.
7e90: 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 20 6e  **    (1)  The n
7ea0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
7eb0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
7ec0: 69 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ile at the start
7ed0: 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 74   of.**         t
7ee0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
7ef0: 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72  stored in pPager
7f00: 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20  ->stmtSize, not 
7f10: 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  in the.**       
7f20: 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    journal file i
7f30: 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  tself..**.**    
7f40: 28 32 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e  (2)  In addition
7f50: 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   to playing back
7f60: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
7f70: 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20  ournal, also.** 
7f80: 20 20 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b          playback
7f90: 20 61 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68   all pages of th
7fa0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
7fb0: 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a  urnal beginning.
7fc0: 2a 2a 20 20 20 20 20 20 20 20 20 61 74 20 6f 66  **         at of
7fd0: 66 73 65 74 20 70 50 61 67 65 72 2d 3e 73 74 6d  fset pPager->stm
7fe0: 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  tJSize..*/.stati
7ff0: 63 20 69 6e 74 20 70 61 67 65 72 5f 73 74 6d 74  c int pager_stmt
8000: 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20  _playback(Pager 
8010: 2a 70 50 61 67 65 72 29 7b 0a 20 20 6f 66 66 5f  *pPager){.  off_
8020: 74 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  t szJ;          
8030: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
8040: 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c  the full journal
8050: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
8060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8070: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f  * Number of Reco
8080: 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  rds */.  int i; 
8090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80a0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
80b0: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  r */.  int rc;..
80c0: 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68    /* Truncate th
80d0: 65 20 64 61 74 61 62 61 73 65 20 62 61 63 6b 20  e database back 
80e0: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
80f0: 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  size..  */.  rc 
8100: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
8110: 61 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ate(&pPager->fd,
8120: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
8130: 45 2a 28 6f 66 66 5f 74 29 70 50 61 67 65 72 2d  E*(off_t)pPager-
8140: 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20 20 70 50  >stmtSize);.  pP
8150: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
8160: 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b  Pager->stmtSize;
8170: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
8180: 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
8190: 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 73 74  ds are in the st
81a0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
81b0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
81c0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
81d0: 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e && pPager->jou
81e0: 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71  rnalOpen );.  sq
81f0: 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
8200: 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20  ger->stfd, 0);. 
8210: 20 6e 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e   nRec = pPager->
8220: 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f  stmtNRec;.  .  /
8230: 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20  * Copy original 
8240: 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65  pages out of the
8250: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
8260: 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
8270: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
8280: 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74  se file.  Note t
8290: 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hat the statemen
82a0: 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20  t journal omits 
82b0: 63 68 65 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20  checksums from. 
82c0: 20 2a 2a 20 65 61 63 68 20 72 65 63 6f 72 64 20   ** each record 
82d0: 73 69 6e 63 65 20 70 6f 77 65 72 2d 66 61 69 6c  since power-fail
82e0: 75 72 65 20 72 65 63 6f 76 65 72 79 20 69 73 20  ure recovery is 
82f0: 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f  not important to
8300: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
8310: 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20  journals..  */. 
8320: 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69   for(i=nRec-1; i
8330: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72  >=0; i--){.    r
8340: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
8350: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
8360: 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 66  er, &pPager->stf
8370: 64 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72  d, 0);.    asser
8380: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
8390: 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  NE );.    if( rc
83a0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
83b0: 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
83c0: 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  back;.  }..  /* 
83d0: 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
83e0: 61 6e 79 20 70 61 67 65 73 20 6e 65 65 64 20 74  any pages need t
83f0: 6f 20 62 65 20 63 6f 70 69 65 64 20 6f 75 74 20  o be copied out 
8400: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
8410: 6f 6e 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  on.  ** journal.
8420: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
8430: 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67  ite3OsSeek(&pPag
8440: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
8450: 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69  >stmtJSize);.  i
8460: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8470: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
8480: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
8490: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
84a0: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50  e3OsFileSize(&pP
84b0: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29  ager->jfd, &szJ)
84c0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
84d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
84e0: 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
84f0: 61 63 6b 3b 0a 20 20 7d 0a 20 20 6e 52 65 63 20  ack;.  }.  nRec 
8500: 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  = (szJ - pPager-
8510: 3e 73 74 6d 74 4a 53 69 7a 65 29 2f 4a 4f 55 52  >stmtJSize)/JOUR
8520: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
8530: 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d  );.  for(i=nRec-
8540: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
8550: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
8560: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
8570: 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
8580: 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 69 66  >jfd, 1);.    if
8590: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
85a0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
85b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
85c0: 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   );.      goto e
85d0: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
85e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 65  ;.    }.  }.  .e
85f0: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
8600: 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
8610: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
8620: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
8630: 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50  PAGER_ERR_CORRUP
8640: 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  T;.    rc = SQLI
8650: 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a  TE_CORRUPT;.  }.
8660: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
8670: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
8680: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
8690: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
86a0: 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f  es that are allo
86b0: 77 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  wed..**.** The m
86c0: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 69 73  aximum number is
86d0: 20 74 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61   the absolute va
86e0: 6c 75 65 20 6f 66 20 74 68 65 20 6d 78 50 61 67  lue of the mxPag
86f0: 65 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20  e parameter..** 
8700: 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67  If mxPage is neg
8710: 61 74 69 76 65 2c 20 74 68 65 20 6e 6f 53 79 6e  ative, the noSyn
8720: 63 20 66 6c 61 67 20 69 73 20 61 6c 73 6f 20 73  c flag is also s
8730: 65 74 2e 20 20 6e 6f 53 79 6e 63 20 62 79 70 61  et.  noSync bypa
8740: 73 73 65 73 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f  sses.** calls to
8750: 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29   sqlite3OsSync()
8760: 2e 20 20 54 68 65 20 70 61 67 65 72 20 72 75 6e  .  The pager run
8770: 73 20 6d 75 63 68 20 66 61 73 74 65 72 20 77 69  s much faster wi
8780: 74 68 20 6e 6f 53 79 6e 63 20 6f 6e 2c 0a 2a 2a  th noSync on,.**
8790: 20 62 75 74 20 69 66 20 74 68 65 20 6f 70 65 72   but if the oper
87a0: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61  ating system cra
87b0: 73 68 65 73 20 6f 72 20 74 68 65 72 65 20 69 73  shes or there is
87c0: 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72   an abrupt power
87d0: 20 0a 2a 2a 20 66 61 69 6c 75 72 65 2c 20 74 68   .** failure, th
87e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
87f0: 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e  might be left in
8800: 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
8810: 20 61 6e 64 0a 2a 2a 20 75 6e 72 65 70 61 69 72   and.** unrepair
8820: 61 62 6c 65 20 73 74 61 74 65 2e 20 20 0a 2a 2f  able state.  .*/
8830: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
8840: 65 72 5f 73 65 74 5f 63 61 63 68 65 73 69 7a 65  er_set_cachesize
8850: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
8860: 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
8870: 66 28 20 6d 78 50 61 67 65 3e 3d 30 20 29 7b 0a  f( mxPage>=0 ){.
8880: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79      pPager->noSy
8890: 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  nc = pPager->tem
88a0: 70 46 69 6c 65 3b 0a 20 20 20 20 69 66 28 20 70  pFile;.    if( p
88b0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20  Pager->noSync ) 
88c0: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
88d0: 20 3d 20 30 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a   = 0; .  }else{.
88e0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79      pPager->noSy
88f0: 6e 63 20 3d 20 31 3b 0a 20 20 20 20 6d 78 50 61  nc = 1;.    mxPa
8900: 67 65 20 3d 20 2d 6d 78 50 61 67 65 3b 0a 20 20  ge = -mxPage;.  
8910: 7d 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 31  }.  if( mxPage>1
8920: 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
8930: 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65  >mxPage = mxPage
8940: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
8950: 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74  djust the robust
8960: 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61  ness of the data
8970: 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64  base to damage d
8980: 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
8990: 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69  .** or power fai
89a0: 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e  lures by changin
89b0: 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  g the number of 
89c0: 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72  syncs()s when wr
89d0: 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c  iting.** the rol
89e0: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20  lback journal.  
89f0: 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
8a00: 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  levels:.**.**   
8a10: 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74   OFF       sqlit
8a20: 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65  e3OsSync() is ne
8a30: 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69  ver called.  Thi
8a40: 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  s is the default
8a50: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
8a60: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61   for temporary a
8a70: 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c  nd transient fil
8a80: 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52  es..**.**    NOR
8a90: 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  MAL    The journ
8aa0: 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63  al is synced onc
8ab0: 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
8ac0: 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
8ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
8ae0: 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20  abase.  This is 
8af0: 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74  normally adequat
8b00: 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75  e protection, bu
8b10: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
8b20: 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69    it is theoreti
8b30: 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20  cally possible, 
8b40: 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69  though very unli
8b50: 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20  kely,.**        
8b60: 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e        that an in
8b70: 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66  opertune power f
8b80: 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
8b90: 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  ve the journal.*
8ba0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
8bb0: 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20  n a state which 
8bc0: 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61  would cause dama
8bd0: 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
8be0: 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  se.**           
8bf0: 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f     when it is ro
8c00: 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
8c10: 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68      FULL      Th
8c20: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
8c30: 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65  ced twice before
8c40: 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
8c50: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
8c60: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77       database (w
8c70: 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f  ith some additio
8c80: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
8c90: 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  - the nRec field
8ca0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
8cb0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
8cc0: 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77  header - being w
8cd0: 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65  ritten in betwee
8ce0: 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20  n the two.**    
8cf0: 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29            syncs)
8d00: 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20  .  If we assume 
8d10: 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a  that writing a.*
8d20: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
8d30: 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
8d40: 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65  r is atomic, the
8d50: 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76  n this mode prov
8d60: 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ides.**         
8d70: 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74       assurance t
8d80: 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
8d90: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72  will not be corr
8da0: 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  upted to the.** 
8db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69               poi
8dc0: 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61  nt of causing da
8dd0: 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
8de0: 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  base during roll
8df0: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65  back..**.** Nume
8e00: 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63  ric values assoc
8e10: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65  iated with these
8e20: 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d   states are OFF=
8e30: 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a  =1, NORMAL=2,.**
8e40: 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a   and FULL=3..*/.
8e50: 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
8e60: 72 5f 73 65 74 5f 73 61 66 65 74 79 5f 6c 65 76  r_set_safety_lev
8e70: 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  el(Pager *pPager
8e80: 2c 20 69 6e 74 20 6c 65 76 65 6c 29 7b 0a 20 20  , int level){.  
8e90: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
8ea0: 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50    level==1 || pP
8eb0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
8ec0: 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
8ed0: 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26  nc = level==3 &&
8ee0: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
8ef0: 6c 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  le;.  if( pPager
8f00: 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65  ->noSync ) pPage
8f10: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
8f20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
8f30: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
8f40: 20 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65    Write the name
8f50: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74   of the file int
8f60: 6f 20 7a 4e 61 6d 65 0a 2a 2a 20 28 7a 4e 61 6d  o zName.** (zNam
8f70: 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  e must be at lea
8f80: 73 74 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41  st SQLITE_TEMPNA
8f90: 4d 45 5f 53 49 5a 45 20 62 79 74 65 73 20 6c 6f  ME_SIZE bytes lo
8fa0: 6e 67 2e 29 20 20 57 72 69 74 65 0a 2a 2a 20 74  ng.)  Write.** t
8fb0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
8fc0: 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65  or into *fd.  Re
8fd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
8fe0: 6e 20 73 75 63 63 65 73 73 20 6f 72 20 73 6f 6d  n success or som
8ff0: 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72  e.** other error
9000: 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c   code if we fail
9010: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 53 20 77  ..**.** The OS w
9020: 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ill automaticall
9030: 79 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d  y delete the tem
9040: 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e  porary file when
9050: 20 69 74 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64   it is.** closed
9060: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9070: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65  sqlite3pager_ope
9080: 6e 74 65 6d 70 28 63 68 61 72 20 2a 7a 46 69 6c  ntemp(char *zFil
9090: 65 2c 20 4f 73 46 69 6c 65 20 2a 66 64 29 7b 0a  e, OsFile *fd){.
90a0: 20 20 69 6e 74 20 63 6e 74 20 3d 20 38 3b 0a 20    int cnt = 8;. 
90b0: 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 0a 20   int rc;.  do{. 
90c0: 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71     cnt--;.    sq
90d0: 6c 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e  lite3OsTempFileN
90e0: 61 6d 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20  ame(zFile);.    
90f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
9100: 65 6e 45 78 63 6c 75 73 69 76 65 28 7a 46 69 6c  enExclusive(zFil
9110: 65 2c 20 66 64 2c 20 31 29 3b 0a 20 20 7d 77 68  e, fd, 1);.  }wh
9120: 69 6c 65 28 20 63 6e 74 3e 30 20 26 26 20 72 63  ile( cnt>0 && rc
9130: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
9140: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
9150: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
9160: 77 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64  w page cache and
9170: 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74   put a pointer t
9180: 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  o the page cache
9190: 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a   in *ppPager..**
91a0: 20 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   The file to be 
91b0: 63 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20  cached need not 
91c0: 65 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65  exist.  The file
91d0: 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75   is not locked u
91e0: 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73  ntil.** the firs
91f0: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
9200: 33 70 61 67 65 72 5f 67 65 74 28 29 20 61 6e 64  3pager_get() and
9210: 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70   is only held op
9220: 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20  en until the.** 
9230: 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c  last page is rel
9240: 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69  eased using sqli
9250: 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29  te3pager_unref()
9260: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  ..**.** If zFile
9270: 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65  name is NULL the
9280: 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d  n a randomly-nam
9290: 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ed temporary fil
92a0: 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
92b0: 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20  and used as the 
92c0: 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65  file to be cache
92d0: 64 2e 20 20 54 68 65 20 66 69 6c 65 20 77 69 6c  d.  The file wil
92e0: 6c 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20  l be deleted.** 
92f0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68  automatically wh
9300: 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
9310: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
9320: 61 67 65 72 5f 6f 70 65 6e 28 0a 20 20 50 61 67  ager_open(.  Pag
9330: 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20  er **ppPager,   
9340: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
9350: 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
9360: 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ure here */.  co
9370: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
9380: 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame,   /* Name o
9390: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
93a0: 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ile to open */. 
93b0: 20 69 6e 74 20 6d 78 50 61 67 65 2c 20 20 20 20   int mxPage,    
93c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
93d0: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
93e0: 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73  mory cache pages
93f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
9400: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
9410: 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70  * Extra bytes ap
9420: 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d  pend to each in-
9430: 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
9440: 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 2c   int useJournal,
9450: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55            /* TRU
9460: 45 20 74 6f 20 75 73 65 20 61 20 72 6f 6c 6c 62  E to use a rollb
9470: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74  ack journal on t
9480: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 76 6f  his file */.  vo
9490: 69 64 20 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  id  *pBusyHandle
94a0: 72 20 20 20 20 20 20 2f 2a 20 42 75 73 79 20 63  r      /* Busy c
94b0: 61 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20  allback */.){.  
94c0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
94d0: 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
94e0: 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 61 6d 65  name;.  int name
94f0: 4c 65 6e 3b 0a 20 20 4f 73 46 69 6c 65 20 66 64  Len;.  OsFile fd
9500: 3b 0a 20 20 69 6e 74 20 72 63 2c 20 69 3b 0a 20  ;.  int rc, i;. 
9510: 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 3b 0a 20   int tempFile;. 
9520: 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a   int memDb = 0;.
9530: 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d    int readOnly =
9540: 20 30 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70   0;.  char zTemp
9550: 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45  [SQLITE_TEMPNAME
9560: 5f 53 49 5a 45 5d 3b 0a 0a 20 20 2a 70 70 50 61  _SIZE];..  *ppPa
9570: 67 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 73  ger = 0;.  if( s
9580: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
9590: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
95a0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
95b0: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46 69 6c 65  .  }.  if( zFile
95c0: 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
95d0: 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 66 28 20  e[0] ){.    if( 
95e0: 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
95f0: 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20  ,":memory:")==0 
9600: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d  ){.      memDb =
9610: 20 31 3b 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50   1;.      zFullP
9620: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
9630: 4d 61 6c 6c 6f 63 28 34 29 3b 0a 20 20 20 20 20  Malloc(4);.     
9640: 20 69 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61   if( zFullPathna
9650: 6d 65 20 29 20 73 74 72 63 70 79 28 7a 46 75 6c  me ) strcpy(zFul
9660: 6c 50 61 74 68 6e 61 6d 65 2c 20 22 22 29 3b 0a  lPathname, "");.
9670: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
9680: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
9690: 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68  .      zFullPath
96a0: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  name = sqlite3Os
96b0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69  FullPathname(zFi
96c0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72  lename);.      r
96d0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
96e0: 6e 52 65 61 64 57 72 69 74 65 28 7a 46 75 6c 6c  nReadWrite(zFull
96f0: 50 61 74 68 6e 61 6d 65 2c 20 26 66 64 2c 20 26  Pathname, &fd, &
9700: 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20 20 20  readOnly);.     
9710: 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20   tempFile = 0;. 
9720: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
9730: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
9740: 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65  ger_opentemp(zTe
9750: 6d 70 2c 20 26 66 64 29 3b 0a 20 20 20 20 7a 46  mp, &fd);.    zF
9760: 69 6c 65 6e 61 6d 65 20 3d 20 7a 54 65 6d 70 3b  ilename = zTemp;
9770: 0a 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61  .    zFullPathna
9780: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  me = sqlite3OsFu
9790: 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65  llPathname(zFile
97a0: 6e 61 6d 65 29 3b 0a 20 20 20 20 74 65 6d 70 46  name);.    tempF
97b0: 69 6c 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69  ile = 1;.  }.  i
97c0: 66 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  f( sqlite3_mallo
97d0: 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  c_failed ){.    
97e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
97f0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  MEM;.  }.  if( r
9800: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
9810: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
9820: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
9830: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9840: 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20  _CANTOPEN;.  }. 
9850: 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c 65   nameLen = strle
9860: 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  n(zFullPathname)
9870: 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c  ;.  pPager = sql
9880: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
9890: 66 28 2a 70 50 61 67 65 72 29 20 2b 20 6e 61 6d  f(*pPager) + nam
98a0: 65 4c 65 6e 2a 33 20 2b 20 33 30 20 29 3b 0a 20  eLen*3 + 30 );. 
98b0: 20 69 66 28 20 70 50 61 67 65 72 3d 3d 30 20 29   if( pPager==0 )
98c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
98d0: 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20 20 73  lose(&fd);.    s
98e0: 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50  qliteFree(zFullP
98f0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65  athname);.    re
9900: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
9910: 4d 3b 0a 20 20 7d 0a 20 20 53 45 54 5f 50 41 47  M;.  }.  SET_PAG
9920: 45 52 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50  ER(pPager);.  pP
9930: 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  ager->zFilename 
9940: 3d 20 28 63 68 61 72 2a 29 26 70 50 61 67 65 72  = (char*)&pPager
9950: 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  [1];.  pPager->z
9960: 44 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61  Directory = &pPa
9970: 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e  ger->zFilename[n
9980: 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50 61  ameLen+1];.  pPa
9990: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20  ger->zJournal = 
99a0: 26 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  &pPager->zDirect
99b0: 6f 72 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a  ory[nameLen+1];.
99c0: 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72 2d    strcpy(pPager-
99d0: 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c  >zFilename, zFul
99e0: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74  lPathname);.  st
99f0: 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69  rcpy(pPager->zDi
9a00: 72 65 63 74 6f 72 79 2c 20 7a 46 75 6c 6c 50 61  rectory, zFullPa
9a10: 74 68 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69  thname);.  for(i
9a20: 3d 6e 61 6d 65 4c 65 6e 3b 20 69 3e 30 20 26 26  =nameLen; i>0 &&
9a30: 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
9a40: 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69  ory[i-1]!='/'; i
9a50: 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20  --){}.  if( i>0 
9a60: 29 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  ) pPager->zDirec
9a70: 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20  tory[i-1] = 0;. 
9a80: 20 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e   strcpy(pPager->
9a90: 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50  zJournal, zFullP
9aa0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  athname);.  sqli
9ab0: 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  teFree(zFullPath
9ac0: 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28  name);.  strcpy(
9ad0: 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
9ae0: 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f  l[nameLen], "-jo
9af0: 75 72 6e 61 6c 22 29 3b 0a 20 20 70 50 61 67 65  urnal");.  pPage
9b00: 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 70 50  r->fd = fd;.  pP
9b10: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
9b20: 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  n = 0;.  pPager-
9b30: 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73  >useJournal = us
9b40: 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d  eJournal && !mem
9b50: 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  Db;.  pPager->st
9b60: 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50  mtOpen = 0;.  pP
9b70: 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
9b80: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
9b90: 52 65 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Ref = 0;.  pPage
9ba0: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 65 6d 44  r->dbSize = memD
9bb0: 62 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  b-1;.  pPager->p
9bc0: 61 67 65 53 69 7a 65 20 3d 20 53 51 4c 49 54 45  ageSize = SQLITE
9bd0: 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 70 50  _PAGE_SIZE;.  pP
9be0: 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
9bf0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74   0;.  pPager->st
9c00: 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  mtJSize = 0;.  p
9c10: 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
9c20: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61  ;.  pPager->mxPa
9c30: 67 65 20 3d 20 6d 78 50 61 67 65 3e 35 20 3f 20  ge = mxPage>5 ? 
9c40: 6d 78 50 61 67 65 20 3a 20 31 30 3b 0a 20 20 70  mxPage : 10;.  p
9c50: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
9c60: 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70  AGER_UNLOCK;.  p
9c70: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d  Pager->errMask =
9c80: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 74 65   0;.  pPager->te
9c90: 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c  mpFile = tempFil
9ca0: 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d  e;.  pPager->mem
9cb0: 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20 70 50  Db = memDb;.  pP
9cc0: 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d  ager->readOnly =
9cd0: 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 70 50 61   readOnly;.  pPa
9ce0: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
9cf0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  0;.  pPager->noS
9d00: 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  ync = pPager->te
9d10: 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f  mpFile || !useJo
9d20: 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d  urnal;.  pPager-
9d30: 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 70  >pFirst = 0;.  p
9d40: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
9d50: 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ced = 0;.  pPage
9d60: 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20  r->pLast = 0;.  
9d70: 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d  pPager->nExtra =
9d80: 20 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65   nExtra;.  pPage
9d90: 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20  r->pBusyHandler 
9da0: 3d 20 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  = (BusyHandler *
9db0: 29 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20  )pBusyHandler;. 
9dc0: 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
9dd0: 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66  aHash, 0, sizeof
9de0: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29  (pPager->aHash))
9df0: 3b 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70  ;.  *ppPager = p
9e00: 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20  Pager;.  return 
9e10: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
9e20: 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73 74  .** Set the dest
9e30: 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73 20  ructor for this 
9e40: 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e  pager.  If not N
9e50: 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75 63  ULL, the destruc
9e60: 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  tor is called.**
9e70: 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65   when the refere
9e80: 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63  nce count on eac
9e90: 68 20 70 61 67 65 20 72 65 61 63 68 65 73 20 7a  h page reaches z
9ea0: 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72 75  ero.  The destru
9eb0: 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75  ctor can.** be u
9ec0: 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20  sed to clean up 
9ed0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
9ee0: 68 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e 74  he extra segment
9ef0: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61 63   appended to eac
9f00: 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  h page..**.** Th
9f10: 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20  e destructor is 
9f20: 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61 20  not called as a 
9f30: 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33 70 61  result sqlite3pa
9f40: 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20 20 0a 2a  ger_close().  .*
9f50: 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20 61 72  * Destructors ar
9f60: 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79  e only called by
9f70: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
9f80: 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ref()..*/.void s
9f90: 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f  qlite3pager_set_
9fa0: 64 65 73 74 72 75 63 74 6f 72 28 50 61 67 65 72  destructor(Pager
9fb0: 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28   *pPager, void (
9fc0: 2a 78 44 65 73 63 29 28 76 6f 69 64 2a 2c 69 6e  *xDesc)(void*,in
9fd0: 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  t)){.  pPager->x
9fe0: 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78 44 65  Destructor = xDe
9ff0: 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  sc;.}../*.** Set
a000: 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a   the reinitializ
a010: 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  er for this page
a020: 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c  r.  If not NULL,
a030: 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a   the reinitializ
a040: 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  er.** is called 
a050: 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  when the content
a060: 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 63 61   of a page in ca
a070: 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  che is restored 
a080: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a  to its original.
a090: 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20 72 65  ** value as a re
a0a0: 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  sult of a rollba
a0b0: 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62 61 63  ck.  The callbac
a0c0: 6b 20 67 69 76 65 73 20 68 69 67 68 65 72 2d 6c  k gives higher-l
a0d0: 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20  evel code.** an 
a0e0: 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72  opportunity to r
a0f0: 65 73 74 6f 72 65 20 74 68 65 20 45 58 54 52 41  estore the EXTRA
a100: 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67 72 65   section to agre
a110: 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f  e with the resto
a120: 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61 74 61  red.** page data
a130: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a140: 33 70 61 67 65 72 5f 73 65 74 5f 72 65 69 6e 69  3pager_set_reini
a150: 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
a160: 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  r, void (*xReini
a170: 74 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29 7b 0a  t)(void*,int)){.
a180: 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
a190: 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d  ter = xReinit;.}
a1a0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
a1b0: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
a1c0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
a1d0: 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69  disk file associ
a1e0: 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61  ated with.** pPa
a1f0: 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
a200: 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75  te3pager_pagecou
a210: 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
a220: 29 7b 0a 20 20 6f 66 66 5f 74 20 6e 3b 0a 20 20  ){.  off_t n;.  
a230: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
a240: 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
a250: 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a  r->dbSize>=0 ){.
a260: 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
a270: 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 20  r->dbSize;.  }. 
a280: 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69   if( sqlite3OsFi
a290: 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e  leSize(&pPager->
a2a0: 66 64 2c 20 26 6e 29 21 3d 53 51 4c 49 54 45 5f  fd, &n)!=SQLITE_
a2b0: 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
a2c0: 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47  ->errMask |= PAG
a2d0: 45 52 5f 45 52 52 5f 44 49 53 4b 3b 0a 20 20 20  ER_ERR_DISK;.   
a2e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
a2f0: 20 6e 20 2f 3d 20 53 51 4c 49 54 45 5f 50 41 47   n /= SQLITE_PAG
a300: 45 5f 53 49 5a 45 3b 0a 20 20 69 66 28 20 70 50  E_SIZE;.  if( pP
a310: 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
a320: 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  ER_UNLOCK ){.   
a330: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
a340: 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = n;.  }.  retur
a350: 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f  n n;.}../*.** Fo
a360: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
a370: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n.*/.static int 
a380: 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65  syncJournal(Page
a390: 72 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29  r*, const char*)
a3a0: 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  ;.../*.** Unlink
a3b0: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
a3c0: 20 66 72 65 65 20 6c 69 73 74 20 28 74 68 65 20   free list (the 
a3d0: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65  list of all page
a3e0: 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29  s where nRef==0)
a3f0: 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73  .** and from its
a400: 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20   hash collision 
a410: 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  chain..*/.static
a420: 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65   void unlinkPage
a430: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
a440: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
a450: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  pPg->pPager;..  
a460: 2f 2a 20 4b 65 65 70 20 74 68 65 20 70 46 69 72  /* Keep the pFir
a470: 73 74 53 79 6e 63 65 64 20 70 6f 69 6e 74 65 72  stSynced pointer
a480: 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65   pointing at the
a490: 20 66 69 72 73 74 20 73 79 6e 63 68 72 6f 6e 69   first synchroni
a4a0: 7a 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 66  zed page */.  if
a4b0: 28 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70  ( pPg==pPager->p
a4c0: 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20  FirstSynced ){. 
a4d0: 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50     PgHdr *p = pP
a4e0: 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
a4f0: 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
a500: 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d  >needSync ){ p =
a510: 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d   p->pNextFree; }
a520: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69  .    pPager->pFi
a530: 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20  rstSynced = p;. 
a540: 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20   }..  /* Unlink 
a550: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
a560: 74 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e  t */.  if( pPg->
a570: 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
a580: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d   pPg->pPrevFree-
a590: 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
a5a0: 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d  ->pNextFree;.  }
a5b0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
a5c0: 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ( pPager->pFirst
a5d0: 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61  ==pPg );.    pPa
a5e0: 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50  ger->pFirst = pP
a5f0: 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
a600: 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65  }.  if( pPg->pNe
a610: 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50  xtFree ){.    pP
a620: 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50  g->pNextFree->pP
a630: 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  revFree = pPg->p
a640: 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73  PrevFree;.  }els
a650: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
a660: 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50  Pager->pLast==pP
a670: 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  g );.    pPager-
a680: 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50  >pLast = pPg->pP
a690: 72 65 76 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70  revFree;.  }.  p
a6a0: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  Pg->pNextFree = 
a6b0: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  pPg->pPrevFree =
a6c0: 20 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b   0;..  /* Unlink
a6d0: 20 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68   from the pgno h
a6e0: 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ash table */.  i
a6f0: 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  f( pPg->pNextHas
a700: 68 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  h ){.    pPg->pN
a710: 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61  extHash->pPrevHa
a720: 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48  sh = pPg->pPrevH
a730: 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ash;.  }.  if( p
a740: 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 29 7b  Pg->pPrevHash ){
a750: 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48  .    pPg->pPrevH
a760: 61 73 68 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  ash->pNextHash =
a770: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b   pPg->pNextHash;
a780: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
a790: 74 20 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68  t h = pager_hash
a7a0: 28 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  (pPg->pgno);.   
a7b0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a7c0: 3e 61 48 61 73 68 5b 68 5d 3d 3d 70 50 67 20 29  >aHash[h]==pPg )
a7d0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48  ;.    pPager->aH
a7e0: 61 73 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e  ash[h] = pPg->pN
a7f0: 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 70  extHash;.  }.  p
a800: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  Pg->pNextHash = 
a810: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  pPg->pPrevHash =
a820: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
a830: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
a840: 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61 6e  d to truncate an
a850: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
a860: 61 73 65 2e 20 20 44 65 6c 65 74 65 0a 2a 2a 20  ase.  Delete.** 
a870: 65 76 65 72 79 20 70 61 67 65 73 20 77 68 6f 73  every pages whos
a880: 65 20 70 67 6e 6f 20 69 73 20 6c 61 72 67 65 72  e pgno is larger
a890: 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62   than pPager->db
a8a0: 53 69 7a 65 20 61 6e 64 20 69 73 20 75 6e 72 65  Size and is unre
a8b0: 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20 52 65 66  ferenced..** Ref
a8c0: 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 6c 61  erenced pages la
a8d0: 72 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72  rger than pPager
a8e0: 2d 3e 64 62 53 69 7a 65 20 61 72 65 20 7a 65 72  ->dbSize are zer
a8f0: 6f 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  oed..*/.static v
a900: 6f 69 64 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61  oid memoryTrunca
a910: 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
a920: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
a930: 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50 67 3b  .  PgHdr **ppPg;
a940: 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 20 3d 20  .  int dbSize = 
a950: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
a960: 0a 20 20 70 70 50 67 20 3d 20 26 70 50 61 67 65  .  ppPg = &pPage
a970: 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65  r->pAll;.  while
a980: 28 20 28 70 50 67 20 3d 20 2a 70 70 50 67 29 21  ( (pPg = *ppPg)!
a990: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  =0 ){.    if( pP
a9a0: 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20  g->pgno<=dbSize 
a9b0: 29 7b 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20  ){.      ppPg = 
a9c0: 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a  &pPg->pNextAll;.
a9d0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
a9e0: 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20  g->nRef>0 ){.   
a9f0: 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
aa00: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c  TO_DATA(pPg), 0,
aa10: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
aa20: 65 29 3b 0a 20 20 20 20 20 20 70 70 50 67 20 3d  e);.      ppPg =
aa30: 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b   &pPg->pNextAll;
aa40: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
aa50: 20 20 2a 70 70 50 67 20 3d 20 70 50 67 2d 3e 70    *ppPg = pPg->p
aa60: 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 75  NextAll;.      u
aa70: 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a  nlinkPage(pPg);.
aa80: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
aa90: 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61  (pPg);.      pPa
aaa0: 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20  ger->nPage--;.  
aab0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
aac0: 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 66 69   Truncate the fi
aad0: 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  le to the number
aae0: 20 6f 66 20 70 61 67 65 73 20 73 70 65 63 69 66   of pages specif
aaf0: 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ied..*/.int sqli
ab00: 74 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74  te3pager_truncat
ab10: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
ab20: 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20   Pgno nPage){.  
ab30: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50  int rc;.  if( pP
ab40: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20 29  ager->dbSize<0 )
ab50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67  {.    sqlite3pag
ab60: 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61  er_pagecount(pPa
ab70: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
ab80: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21  pPager->errMask!
ab90: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  =0 ){.    rc = p
aba0: 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61  ager_errcode(pPa
abb0: 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
abc0: 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e   rc;.  }.  if( n
abd0: 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29  Page>=(unsigned)
abe0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
abf0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
ac00: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
ac10: 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20  ( pPager->memDb 
ac20: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
ac30: 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  bSize = nPage;. 
ac40: 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74     memoryTruncat
ac50: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
ac60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
ac70: 0a 20 20 7d 0a 20 20 73 79 6e 63 4a 6f 75 72 6e  .  }.  syncJourn
ac80: 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  al(pPager, 0);. 
ac90: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
aca0: 72 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d  runcate(&pPager-
acb0: 3e 66 64 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  >fd, SQLITE_PAGE
acc0: 5f 53 49 5a 45 2a 28 6f 66 66 5f 74 29 6e 50 61  _SIZE*(off_t)nPa
acd0: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ge);.  if( rc==S
ace0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
acf0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
ad00: 20 6e 50 61 67 65 3b 0a 20 20 7d 0a 20 20 72 65   nPage;.  }.  re
ad10: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
ad20: 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70  * Shutdown the p
ad30: 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65  age cache.  Free
ad40: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20   all memory and 
ad50: 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e  close all files.
ad60: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
ad70: 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70  saction was in p
ad80: 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69  rogress when thi
ad90: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
ada0: 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61  led, that.** tra
adb0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
adc0: 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75  ed back.  All ou
add0: 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
ade0: 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a  are invalidated.
adf0: 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d  ** and their mem
ae00: 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41  ory is freed.  A
ae10: 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
ae20: 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61  e a page associa
ae30: 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73  ted.** with this
ae40: 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65   page cache afte
ae50: 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
ae60: 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b  returns will lik
ae70: 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  ely.** result in
ae80: 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a   a coredump..*/.
ae90: 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
aea0: 5f 63 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50  _close(Pager *pP
aeb0: 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
aec0: 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 73  pPg, *pNext;.  s
aed0: 77 69 74 63 68 28 20 70 50 61 67 65 72 2d 3e 73  witch( pPager->s
aee0: 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65  tate ){.    case
aef0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3a   PAGER_RESERVED:
af00: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
af10: 45 58 43 4c 55 53 49 56 45 3a 20 7b 0a 20 20 20  EXCLUSIVE: {.   
af20: 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
af30: 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
af40: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ;.      if( !pPa
af50: 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
af60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
af70: 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  nlock(&pPager->f
af80: 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
af90: 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
afa0: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
afb0: 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20  alOpen==0 );.   
afc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
afd0: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 53      case PAGER_S
afe0: 48 41 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 69  HARED: {.      i
aff0: 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44  f( !pPager->memD
b000: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  b ){.        sql
b010: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50  ite3OsUnlock(&pP
b020: 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43  ager->fd, NO_LOC
b030: 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
b040: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
b050: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
b060: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e      /* Do nothin
b070: 67 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  g */.      break
b080: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
b090: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
b0a0: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65  ll; pPg; pPg=pNe
b0b0: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
b0c0: 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
b0d0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
b0e0: 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  Pg);.  }.  if( !
b0f0: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
b100: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
b110: 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 66 64 29  ose(&pPager->fd)
b120: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
b130: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
b140: 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20 54  pen==0 );.  /* T
b150: 65 6d 70 20 66 69 6c 65 73 20 61 72 65 20 61 75  emp files are au
b160: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
b170: 74 65 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20  ted by the OS.  
b180: 2a 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74  ** if( pPager->t
b190: 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20  empFile ){.  ** 
b1a0: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
b1b0: 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  e(pPager->zFilen
b1c0: 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a  ame);.  ** }.  *
b1d0: 2f 0a 20 20 43 4c 52 5f 50 41 47 45 52 28 70 50  /.  CLR_PAGER(pP
b1e0: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
b1f0: 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 21 3d  ger->zFilename!=
b200: 28 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b 31  (char*)&pPager[1
b210: 5d 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ] ){.    assert(
b220: 20 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74   0 );  /* Cannot
b230: 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 73   happen */.    s
b240: 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
b250: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
b260: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
b270: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a  ger->zJournal);.
b280: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
b290: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
b2a0: 79 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  y);.  }.  sqlite
b2b0: 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Free(pPager);.  
b2c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
b2d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
b2e0: 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
b2f0: 72 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  r for the given 
b300: 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67  page data..*/.Pg
b310: 6e 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  no sqlite3pager_
b320: 70 61 67 65 6e 75 6d 62 65 72 28 76 6f 69 64 20  pagenumber(void 
b330: 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
b340: 20 2a 70 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47   *p = DATA_TO_PG
b350: 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65  HDR(pData);.  re
b360: 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a  turn p->pgno;.}.
b370: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f  ./*.** The page_
b380: 72 65 66 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  ref() function i
b390: 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 72 65  ncrements the re
b3a0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
b3b0: 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20  r a page..** If 
b3c0: 74 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72  the page is curr
b3d0: 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65  ently on the fre
b3e0: 65 6c 69 73 74 20 28 74 68 65 20 72 65 66 65 72  elist (the refer
b3f0: 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65  ence count is ze
b400: 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f  ro) then.** remo
b410: 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65 20 66  ve it from the f
b420: 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46  reelist..**.** F
b430: 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74  or non-test syst
b440: 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 20  ems, page_ref() 
b450: 69 73 20 61 20 6d 61 63 72 6f 20 74 68 61 74 20  is a macro that 
b460: 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65 66 28  calls _page_ref(
b470: 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74  ).** online of t
b480: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
b490: 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72  nt is zero.  For
b4a0: 20 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70   test systems, p
b4b0: 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20  age_ref().** is 
b4c0: 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20  a real function 
b4d0: 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 73  so that we can s
b4e0: 65 74 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 61  et breakpoints a
b4f0: 6e 64 20 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a  nd trace it..*/.
b500: 73 74 61 74 69 63 20 76 6f 69 64 20 5f 70 61 67  static void _pag
b510: 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67  e_ref(PgHdr *pPg
b520: 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  ){.  if( pPg->nR
b530: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ef==0 ){.    /* 
b540: 54 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72  The page is curr
b550: 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65  ently on the fre
b560: 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65 20 69  elist.  Remove i
b570: 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  t. */.    if( pP
b580: 67 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  g==pPg->pPager->
b590: 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a  pFirstSynced ){.
b5a0: 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d        PgHdr *p =
b5b0: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
b5c0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 20  .      while( p 
b5d0: 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29  && p->needSync )
b5e0: 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72  { p = p->pNextFr
b5f0: 65 65 3b 20 7d 0a 20 20 20 20 20 20 70 50 67 2d  ee; }.      pPg-
b600: 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53  >pPager->pFirstS
b610: 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d  ynced = p;.    }
b620: 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50  .    if( pPg->pP
b630: 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20  revFree ){.     
b640: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d   pPg->pPrevFree-
b650: 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
b660: 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
b670: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
b680: 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g->pPager->pFirs
b690: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  t = pPg->pNextFr
b6a0: 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ee;.    }.    if
b6b0: 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  ( pPg->pNextFree
b6c0: 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
b6d0: 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46  NextFree->pPrevF
b6e0: 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ree = pPg->pPrev
b6f0: 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Free;.    }else{
b700: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
b710: 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d  er->pLast = pPg-
b720: 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20  >pPrevFree;.    
b730: 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  }.    pPg->pPage
b740: 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20  r->nRef++;.  }. 
b750: 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pPg->nRef++;.  
b760: 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a  REFINFO(pPg);.}.
b770: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
b780: 53 54 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  ST.  static void
b790: 20 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20   page_ref(PgHdr 
b7a0: 2a 70 50 67 29 7b 0a 20 20 20 20 69 66 28 20 70  *pPg){.    if( p
b7b0: 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Pg->nRef==0 ){. 
b7c0: 20 20 20 20 20 5f 70 61 67 65 5f 72 65 66 28 70       _page_ref(p
b7d0: 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Pg);.    }else{.
b7e0: 20 20 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b        pPg->nRef+
b7f0: 2b 3b 0a 20 20 20 20 20 20 52 45 46 49 4e 46 4f  +;.      REFINFO
b800: 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
b810: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
b820: 70 61 67 65 5f 72 65 66 28 50 29 20 20 20 28 28  page_ref(P)   ((
b830: 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67  P)->nRef==0?_pag
b840: 65 5f 72 65 66 28 50 29 3a 28 76 6f 69 64 29 28  e_ref(P):(void)(
b850: 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64  P)->nRef++).#end
b860: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d  if../*.** Increm
b870: 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
b880: 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61  e count for a pa
b890: 67 65 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70  ge.  The input p
b8a0: 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72  ointer is.** a r
b8b0: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
b8c0: 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e  page data..*/.in
b8d0: 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  t sqlite3pager_r
b8e0: 65 66 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  ef(void *pData){
b8f0: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
b900: 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
b910: 61 74 61 29 3b 0a 20 20 70 61 67 65 5f 72 65 66  ata);.  page_ref
b920: 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pPg);.  return 
b930: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
b940: 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75  .** Sync the jou
b950: 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20  rnal.  In other 
b960: 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
b970: 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
b980: 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
b990: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
b9a0: 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
b9b0: 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
b9c0: 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
b9d0: 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73  .** disk.  It is
b9e0: 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64   not safe to mod
b9f0: 69 66 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ify the original
ba00: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
ba10: 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68  ntil after.** th
ba20: 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65  e journal has be
ba30: 65 6e 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74  en synced.  If t
ba40: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
ba50: 62 61 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64  base is modified
ba60: 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a   before.** the j
ba70: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
ba80: 20 61 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69   and a power fai
ba90: 6c 75 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65  lure occurs, the
baa0: 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61   unsynced journa
bab0: 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20  l.** data would 
bac0: 62 65 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77  be lost and we w
bad0: 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74  ould be unable t
bae0: 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c  o completely rol
baf0: 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74  lback the.** dat
bb00: 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20  abase changes.  
bb10: 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
bb20: 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e  ion would occur.
bb30: 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  .** .** This rou
bb40: 74 69 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65  tine also update
bb50: 73 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  s the nRec field
bb60: 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f   in the header o
bb70: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  f the journal..*
bb80: 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  * (See comments 
bb90: 6f 6e 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61  on the pager_pla
bba0: 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  yback() routine 
bbb0: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
bbc0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20  nformation.).** 
bbd0: 49 66 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65  If the sync mode
bbe0: 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79   is FULL, two sy
bbf0: 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20  ncs will occur. 
bc00: 20 46 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65   First the whole
bc10: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73   journal.** is s
bc20: 79 6e 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20  ynced, then the 
bc30: 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20 75 70  nRec field is up
bc40: 64 61 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65  dated, then a se
bc50: 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73  cond sync occurs
bc60: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70  ..**.** For temp
bc70: 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2c  orary databases,
bc80: 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
bc90: 69 66 20 77 65 20 61 72 65 20 61 62 6c 65 20 74  if we are able t
bca0: 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66  o rollback.** af
bcb0: 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c  ter a power fail
bcc0: 75 72 65 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63  ure, so sync occ
bcd0: 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  urs..**.** This 
bce0: 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74  routine clears t
bcf0: 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c  he needSync fiel
bd00: 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20  d of every page 
bd10: 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a  current held in.
bd20: 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  ** memory..*/.st
bd30: 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75  atic int syncJou
bd40: 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
bd50: 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
bd60: 7a 4d 61 73 74 65 72 29 7b 0a 20 20 50 67 48 64  zMaster){.  PgHd
bd70: 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
bd80: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
bd90: 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75   /* Sync the jou
bda0: 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69  rnal before modi
bdb0: 66 79 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64  fying the main d
bdc0: 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73  atabase.  ** (as
bdd0: 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20  suming there is 
bde0: 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74  a journal and it
bdf0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
be00: 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ced.).  */.  if(
be10: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
be20: 63 20 7c 7c 20 7a 4d 61 73 74 65 72 20 29 7b 0a  c || zMaster ){.
be30: 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
be40: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
be50: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
be60: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
be70: 3b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72  ;.      /* asser
be80: 74 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  t( !pPager->noSy
be90: 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20  nc ); // noSync 
bea0: 6d 69 67 68 74 20 62 65 20 73 65 74 20 69 66 20  might be set if 
beb0: 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20  synchronous.    
bec0: 20 20 2a 2a 20 77 61 73 20 74 75 72 6e 65 64 20    ** was turned 
bed0: 6f 66 66 20 61 66 74 65 72 20 74 68 65 20 74 72  off after the tr
bee0: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74  ansaction was st
bef0: 61 72 74 65 64 2e 20 20 54 69 63 6b 65 74 20 23  arted.  Ticket #
bf00: 36 31 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  615 */.#ifndef N
bf10: 44 45 42 55 47 0a 20 20 20 20 20 20 7b 0a 20 20  DEBUG.      {.  
bf20: 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
bf30: 72 65 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6e  re the pPager->n
bf40: 52 65 63 20 63 6f 75 6e 74 65 72 20 77 65 20 61  Rec counter we a
bf50: 72 65 20 6b 65 65 70 69 6e 67 20 61 67 72 65 65  re keeping agree
bf60: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74  s.        ** wit
bf70: 68 20 74 68 65 20 6e 52 65 63 20 63 6f 6d 70 75  h the nRec compu
bf80: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  ted from the siz
bf90: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
bfa0: 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
bfb0: 2f 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20  /.        off_t 
bfc0: 68 64 72 53 7a 2c 20 70 67 53 7a 2c 20 6a 53 7a  hdrSz, pgSz, jSz
bfd0: 3b 0a 20 20 20 20 20 20 20 20 68 64 72 53 7a 20  ;.        hdrSz 
bfe0: 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
bff0: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
c000: 20 20 70 67 53 7a 20 3d 20 4a 4f 55 52 4e 41 4c    pgSz = JOURNAL
c010: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
c020: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
c030: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26  ite3OsFileSize(&
c040: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53  pPager->jfd, &jS
c050: 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z);.        if( 
c060: 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
c070: 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  c;.        asser
c080: 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2a  t( pPager->nRec*
c090: 70 67 53 7a 2b 68 64 72 53 7a 3d 3d 6a 53 7a 20  pgSz+hdrSz==jSz 
c0a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
c0b0: 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  f.      {.      
c0c0: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
c0d0: 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  Rec value into t
c0e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c0f0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 20 20  header */.      
c100: 20 20 6f 66 66 5f 74 20 73 7a 4a 3b 0a 20 20 20    off_t szJ;.   
c110: 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
c120: 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
c130: 20 20 20 20 20 20 20 54 52 41 43 45 32 28 22 53         TRACE2("S
c140: 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
c150: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64  d\n", pPager->fd
c160: 2e 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  .h);.          r
c170: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
c180: 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  c(&pPager->jfd);
c190: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
c1a0: 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
c1b0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c1c0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65      sqlite3OsSee
c1d0: 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  k(&pPager->jfd, 
c1e0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
c1f0: 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20  agic));.        
c200: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
c210: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  (&pPager->jfd, p
c220: 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20  Pager->nRec);.  
c230: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
c240: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20  eturn rc;..     
c250: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
c260: 6e 61 6d 65 20 6f 66 20 74 68 65 20 6d 61 73 74  name of the mast
c270: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
c280: 69 66 20 6f 6e 65 20 69 73 20 73 70 65 63 69 66  if one is specif
c290: 69 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ied */.        i
c2a0: 66 28 20 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20  f( zMaster ){.  
c2b0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
c2c0: 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3c  strlen(zMaster)<
c2d0: 70 50 61 67 65 72 2d 3e 6e 4d 61 73 74 65 72 20  pPager->nMaster 
c2e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
c2f0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
c300: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 32 30  &pPager->jfd, 20
c310: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
c320: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
c330: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
c340: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26  sqlite3OsWrite(&
c350: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
c360: 73 74 65 72 2c 20 73 74 72 6c 65 6e 28 7a 4d 61  ster, strlen(zMa
c370: 73 74 65 72 29 2b 31 29 3b 0a 20 20 20 20 20 20  ster)+1);.      
c380: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
c390: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
c3a0: 7d 0a 0a 20 20 20 20 20 20 20 20 73 7a 4a 20 3d  }..        szJ =
c3b0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
c3c0: 70 50 61 67 65 72 29 20 2b 20 20 70 50 61 67 65  pPager) +  pPage
c3d0: 72 2d 3e 6e 52 65 63 2a 4a 4f 55 52 4e 41 4c 5f  r->nRec*JOURNAL_
c3e0: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  PG_SZ(pPager);. 
c3f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
c400: 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66  Seek(&pPager->jf
c410: 64 2c 20 73 7a 4a 29 3b 0a 20 20 20 20 20 20 7d  d, szJ);.      }
c420: 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22 53  .      TRACE2("S
c430: 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
c440: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64  d\n", pPager->fd
c450: 2e 68 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  .h);.      rc = 
c460: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 26 70  sqlite3OsSync(&p
c470: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
c480: 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72     if( rc!=0 ) r
c490: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
c4a0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
c4b0: 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20  tarted = 1;.    
c4c0: 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  }.    pPager->ne
c4d0: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20  edSync = 0;..   
c4e0: 20 2f 2a 20 45 72 61 73 65 20 74 68 65 20 6e 65   /* Erase the ne
c4f0: 65 64 53 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d  edSync flag from
c500: 20 65 76 65 72 79 20 70 61 67 65 2e 0a 20 20 20   every page..   
c510: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50 67 3d   */.    for(pPg=
c520: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
c530: 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
c540: 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67  tAll){.      pPg
c550: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
c560: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
c570: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
c580: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b   pPager->pFirst;
c590: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  .  }..#ifndef ND
c5a0: 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74 68 65  EBUG.  /* If the
c5b0: 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20   Pager.needSync 
c5c0: 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20 74 68  flag is clear th
c5d0: 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  en the PgHdr.nee
c5e0: 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20  dSync.  ** flag 
c5f0: 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63 6c 65  must also be cle
c600: 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73  ar for all pages
c610: 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74  .  Verify that t
c620: 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61  his.  ** invaria
c630: 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f  nt is true..  */
c640: 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72  .  else{.    for
c650: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
c660: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
c670: 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
c680: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
c690: 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  eedSync==0 );.  
c6a0: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
c6b0: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
c6c0: 6e 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e 70 46  nced==pPager->pF
c6d0: 69 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  irst );.  }.#end
c6e0: 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
c6f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
c700: 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  a list of pages 
c710: 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74 68  (connected by th
c720: 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70  e PgHdr.pDirty p
c730: 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a 2a  ointer) write.**
c740: 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74 68   every one of th
c750: 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20 74 6f  ose pages out to
c760: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
c770: 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d  le and mark them
c780: 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e   all.** as clean
c790: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c7a0: 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
c7b0: 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73  list(PgHdr *pLis
c7c0: 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  t){.  Pager *pPa
c7d0: 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ger;.  int rc;. 
c7e0: 20 69 6e 74 20 62 75 73 79 20 3d 20 31 3b 0a 0a   int busy = 1;..
c7f0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
c800: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c810: 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c  K;.  pPager = pL
c820: 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  ist->pPager;..  
c830: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
c840: 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 69   there may be ei
c850: 74 68 65 72 20 61 20 52 45 53 45 52 56 45 44 20  ther a RESERVED 
c860: 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
c870: 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  k on the.  ** da
c880: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
c890: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
c8a0: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
c8b0: 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ck, the followin
c8c0: 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  g.  ** calls to 
c8d0: 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20  sqlite3OsLock() 
c8e0: 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a  are no-ops..  **
c8f0: 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65  .  ** Moving the
c900: 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52   lock from RESER
c910: 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45  VED to EXCLUSIVE
c920: 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76   actually involv
c930: 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68  es going.  ** th
c940: 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65  rough an interme
c950: 64 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44  diate state PEND
c960: 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47  ING.   A PENDING
c970: 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e   lock prevents n
c980: 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20  ew.  ** readers 
c990: 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74  from attaching t
c9a0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  o the database b
c9b0: 75 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65  ut is unsufficie
c9c0: 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a  nt for us to.  *
c9d0: 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64  * write.  The id
c9e0: 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20  ea of a PENDING 
c9f0: 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65  lock is to preve
ca00: 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66  nt new readers f
ca10: 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20  rom.  ** coming 
ca20: 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74  in while we wait
ca30: 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65   for existing re
ca40: 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a  aders to clear..
ca50: 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20    **.  ** While 
ca60: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
ca70: 74 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61  the RESERVED sta
ca80: 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  te, the original
ca90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20   database file. 
caa0: 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64   ** is unchanged
cab0: 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c   and we can roll
cac0: 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76  back without hav
cad0: 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20  ing to playback 
cae0: 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  the.  ** journal
caf0: 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
cb00: 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
cb10: 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73  .  Once we trans
cb20: 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58  ition to.  ** EX
cb30: 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e  CLUSIVE, it mean
cb40: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
cb50: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61  ile has been cha
cb60: 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c  nged and any rol
cb70: 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20  lback.  ** will 
cb80: 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61  require a journa
cb90: 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f  l playback..  */
cba0: 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d  .  do {.    rc =
cbb0: 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26   sqlite3OsLock(&
cbc0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c  pPager->fd, EXCL
cbd0: 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 7d  USIVE_LOCK);.  }
cbe0: 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
cbf0: 45 5f 42 55 53 59 20 26 26 20 0a 20 20 20 20 20  E_BUSY && .     
cc00: 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
cc10: 6e 64 6c 65 72 20 26 26 20 0a 20 20 20 20 20 20  ndler && .      
cc20: 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
cc30: 64 6c 65 72 2d 3e 78 46 75 6e 63 20 26 26 20 0a  dler->xFunc && .
cc40: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42        pPager->pB
cc50: 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e  usyHandler->xFun
cc60: 63 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  c(pPager->pBusyH
cc70: 61 6e 64 6c 65 72 2d 3e 70 41 72 67 2c 20 22 22  andler->pArg, ""
cc80: 2c 20 62 75 73 79 2b 2b 29 0a 20 20 29 3b 0a 20  , busy++).  );. 
cc90: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
cca0: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
ccb0: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65   rc;.  }.  pPage
ccc0: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
ccd0: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 0a 20 20 77  _EXCLUSIVE;..  w
cce0: 68 69 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a 20  hile( pList ){. 
ccf0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
cd00: 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20 73  ->dirty );.    s
cd10: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50  qlite3OsSeek(&pP
cd20: 61 67 65 72 2d 3e 66 64 2c 20 28 70 4c 69 73 74  ager->fd, (pList
cd30: 2d 3e 70 67 6e 6f 2d 31 29 2a 28 6f 66 66 5f 74  ->pgno-1)*(off_t
cd40: 29 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a  )SQLITE_PAGE_SIZ
cd50: 45 29 3b 0a 20 20 20 20 43 4f 44 45 43 28 70 50  E);.    CODEC(pP
cd60: 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ager, PGHDR_TO_D
cd70: 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69 73  ATA(pList), pLis
cd80: 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20 20 20  t->pgno, 6);.   
cd90: 20 54 52 41 43 45 32 28 22 53 54 4f 52 45 20 70   TRACE2("STORE p
cda0: 61 67 65 20 25 64 5c 6e 22 2c 20 70 4c 69 73 74  age %d\n", pList
cdb0: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 72 63 20  ->pgno);.    rc 
cdc0: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
cdd0: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47  (&pPager->fd, PG
cde0: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73  HDR_TO_DATA(pLis
cdf0: 74 29 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  t), SQLITE_PAGE_
ce00: 53 49 5a 45 29 3b 0a 20 20 20 20 43 4f 44 45 43  SIZE);.    CODEC
ce10: 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54  (pPager, PGHDR_T
ce20: 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70  O_DATA(pList), p
ce30: 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a  List->pgno, 0);.
ce40: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
ce50: 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 4c 69 73  urn rc;.    pLis
ce60: 74 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  t->dirty = 0;.  
ce70: 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d    pList = pList-
ce80: 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20 72  >pDirty;.  }.  r
ce90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
cea0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63  .}../*.** Collec
ceb0: 74 20 65 76 65 72 79 20 64 69 72 74 79 20 70 61  t every dirty pa
cec0: 67 65 20 69 6e 74 6f 20 61 20 64 69 72 74 79 20  ge into a dirty 
ced0: 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74 75  list and.** retu
cee0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
cef0: 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 61 74  the head of that
cf00: 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61 67 65   list.  All page
cf10: 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74  s are.** collect
cf20: 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 79 20  ed even if they 
cf30: 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 75 73 65  are still in use
cf40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
cf50: 72 20 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c  r *pager_get_all
cf60: 5f 64 69 72 74 79 5f 70 61 67 65 73 28 50 61 67  _dirty_pages(Pag
cf70: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
cf80: 67 48 64 72 20 2a 70 2c 20 2a 70 4c 69 73 74 3b  gHdr *p, *pList;
cf90: 0a 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20  .  pList = 0;.  
cfa0: 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41  for(p=pPager->pA
cfb0: 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  ll; p; p=p->pNex
cfc0: 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70  tAll){.    if( p
cfd0: 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20  ->dirty ){.     
cfe0: 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 70 4c 69   p->pDirty = pLi
cff0: 73 74 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 20  st;.      pList 
d000: 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = p;.    }.  }. 
d010: 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
d020: 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
d030: 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  a page..**.** A 
d040: 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
d050: 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f 62   disk file is ob
d060: 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65 20  tained when the 
d070: 66 69 72 73 74 20 70 61 67 65 20 69 73 20 61 63  first page is ac
d080: 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73  quired. .** This
d090: 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 64 72   read lock is dr
d0a0: 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65 20 6c  opped when the l
d0b0: 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65  ast page is rele
d0c0: 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f 67  ased..**.** A _g
d0d0: 65 74 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79  et works for any
d0e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65   page number gre
d0f0: 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66  ater than 0.  If
d100: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
d110: 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72   file is smaller
d120: 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
d130: 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e  ted page, then n
d140: 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a  o actual disk.**
d150: 20 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64   read occurs and
d160: 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67   the memory imag
d170: 65 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 73  e of the page is
d180: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a   initialized to.
d190: 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54  ** all zeros.  T
d1a0: 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70  he extra data ap
d1b0: 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65  pended to a page
d1c0: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69   is always initi
d1d0: 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72  alized.** to zer
d1e0: 6f 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  os the first tim
d1f0: 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64  e a page is load
d200: 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a  ed into memory..
d210: 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73  **.** The acquis
d220: 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c  ition might fail
d230: 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61   for several rea
d240: 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61  sons.  In all ca
d250: 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f  ses,.** an appro
d260: 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
d270: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
d280: 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  d *ppPage is set
d290: 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
d2a0: 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
d2b0: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 29 2e 20  pager_lookup(). 
d2c0: 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69   Both this routi
d2d0: 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b 75 70 28 29  ne and _lookup()
d2e0: 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66   attempt.** to f
d2f0: 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
d300: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
d310: 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65  e first.  If the
d320: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
d330: 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  eady.** in memor
d340: 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
d350: 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20  goes to disk to 
d360: 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65  read it in where
d370: 61 73 20 5f 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20  as _lookup().** 
d380: 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20  just returns 0. 
d390: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
d3a0: 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f  quires a read-lo
d3b0: 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
d3c0: 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67  e it.** has to g
d3d0: 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63  o to disk, and c
d3e0: 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61  ould also playba
d3f0: 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ck an old journa
d400: 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  l if necessary..
d410: 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f 6f 6b 75 70  ** Since _lookup
d420: 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f  () never goes to
d430: 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20   disk, it never 
d440: 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68  has to deal with
d450: 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75   locks.** or jou
d460: 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69  rnal files..*/.i
d470: 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
d480: 67 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  get(Pager *pPage
d490: 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f  r, Pgno pgno, vo
d4a0: 69 64 20 2a 2a 70 70 50 61 67 65 29 7b 0a 20 20  id **ppPage){.  
d4b0: 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e  PgHdr *pPg;.  in
d4c0: 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  t rc;..  /* Make
d4d0: 20 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f   sure we have no
d4e0: 74 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63  t hit any critic
d4f0: 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20  al errors..  */ 
d500: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
d510: 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
d520: 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 2a  ( pgno!=0 );.  *
d530: 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66  ppPage = 0;.  if
d540: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
d550: 6b 20 26 20 7e 28 50 41 47 45 52 5f 45 52 52 5f  k & ~(PAGER_ERR_
d560: 46 55 4c 4c 29 20 29 7b 0a 20 20 20 20 72 65 74  FULL) ){.    ret
d570: 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64  urn pager_errcod
d580: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  e(pPager);.  }..
d590: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
d5a0: 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 61  the first page a
d5b0: 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65  ccessed, then ge
d5c0: 74 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a  t a SHARED lock.
d5d0: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61    ** on the data
d5e0: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
d5f0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52    if( pPager->nR
d600: 65 66 3d 3d 30 20 26 26 20 21 70 50 61 67 65 72  ef==0 && !pPager
d610: 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 69  ->memDb ){.    i
d620: 6e 74 20 62 75 73 79 20 3d 20 31 3b 0a 20 20 20  nt busy = 1;.   
d630: 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d   do {.      rc =
d640: 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26   sqlite3OsLock(&
d650: 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52  pPager->fd, SHAR
d660: 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 77  ED_LOCK);.    }w
d670: 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
d680: 5f 42 55 53 59 20 26 26 20 0a 20 20 20 20 20 20  _BUSY && .      
d690: 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48    pPager->pBusyH
d6a0: 61 6e 64 6c 65 72 20 26 26 20 0a 20 20 20 20 20  andler && .     
d6b0: 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79     pPager->pBusy
d6c0: 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 20 26  Handler->xFunc &
d6d0: 26 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  & .        pPage
d6e0: 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d  r->pBusyHandler-
d6f0: 3e 78 46 75 6e 63 28 70 50 61 67 65 72 2d 3e 70  >xFunc(pPager->p
d700: 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 70 41 72  BusyHandler->pAr
d710: 67 2c 20 22 22 2c 20 62 75 73 79 2b 2b 29 0a 20  g, "", busy++). 
d720: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63     );.    if( rc
d730: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
d740: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
d750: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
d760: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
d770: 53 48 41 52 45 44 3b 0a 0a 20 20 20 20 2f 2a 20  SHARED;..    /* 
d780: 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  If a journal fil
d790: 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68  e exists, and th
d7a0: 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56  ere is no RESERV
d7b0: 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  ED lock on the. 
d7c0: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
d7d0: 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74  ile, then it eit
d7e0: 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  her needs to be 
d7f0: 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64  played back or d
d800: 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
d810: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75     if( pPager->u
d820: 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 0a 20 20  seJournal && .  
d830: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46        sqlite3OsF
d840: 69 6c 65 45 78 69 73 74 73 28 70 50 61 67 65 72  ileExists(pPager
d850: 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20 26 26 0a 20  ->zJournal) &&. 
d860: 20 20 20 20 20 20 20 21 73 71 6c 69 74 65 33 4f         !sqlite3O
d870: 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
d880: 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 20  ck(&pPager->fd) 
d890: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 69  .    ){.       i
d8a0: 6e 74 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 2f  nt rc;..       /
d8b0: 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49  * Get an EXCLUSI
d8c0: 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
d8d0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
d8e0: 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  .       rc = sql
d8f0: 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67  ite3OsLock(&pPag
d900: 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56  er->fd, EXCLUSIV
d910: 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  E_LOCK);.       
d920: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d930: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 73 71  K ){.         sq
d940: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70  lite3OsUnlock(&p
d950: 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f  Pager->fd, NO_LO
d960: 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 70 50  CK);.         pP
d970: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
d980: 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  GER_UNLOCK;.    
d990: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
d9a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d9b0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
d9c0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
d9d0: 0a 0a 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ..       /* Open
d9e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
d9f0: 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79 2e 20 20   reading only.  
da00: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  Return SQLITE_BU
da10: 53 59 20 69 66 0a 20 20 20 20 20 20 20 2a 2a 20  SY if.       ** 
da20: 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
da30: 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   open the journa
da40: 6c 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20 20  l file. .       
da50: 2a 2a 0a 20 20 20 20 20 20 20 2a 2a 20 54 68 65  **.       ** The
da60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
da70: 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
da80: 65 20 6c 6f 63 6b 65 64 20 69 74 73 65 6c 66 2e  e locked itself.
da90: 20 20 54 68 65 0a 20 20 20 20 20 20 20 2a 2a 20    The.       ** 
daa0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
dab0: 6e 65 76 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73  never open unles
dac0: 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  s the main datab
dad0: 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20  ase file holds. 
dae0: 20 20 20 20 20 20 2a 2a 20 61 20 77 72 69 74 65        ** a write
daf0: 20 6c 6f 63 6b 2c 20 73 6f 20 74 68 65 72 65 20   lock, so there 
db00: 69 73 20 6e 65 76 65 72 20 61 6e 79 20 63 68 61  is never any cha
db10: 6e 63 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f  nce of two or mo
db20: 72 65 0a 20 20 20 20 20 20 20 2a 2a 20 70 72 6f  re.       ** pro
db30: 63 65 73 73 65 73 20 6f 70 65 6e 69 6e 67 20 74  cesses opening t
db40: 68 65 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68  he journal at th
db50: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20  e same time..   
db60: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63      */.       rc
db70: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
db80: 52 65 61 64 4f 6e 6c 79 28 70 50 61 67 65 72 2d  ReadOnly(pPager-
db90: 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67  >zJournal, &pPag
dba0: 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
dbb0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
dbc0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 73  OK ){.         s
dbd0: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26  qlite3OsUnlock(&
dbe0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c  pPager->fd, NO_L
dbf0: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 70  OCK);.         p
dc00: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
dc10: 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  AGER_UNLOCK;.   
dc20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
dc30: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
dc40: 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67 65 72   }.       pPager
dc50: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
dc60: 31 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  1;.       pPager
dc70: 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
dc80: 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 2f 2a   = 0;..       /*
dc90: 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65   Playback and de
dca0: 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
dcb0: 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61  .  Drop the data
dcc0: 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20  base write.     
dcd0: 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65    ** lock and re
dce0: 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64  acquire the read
dcf0: 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2f   lock..       */
dd00: 0a 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  .       rc = pag
dd10: 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
dd20: 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 69  er, 0);.       i
dd30: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
dd40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 72 65 74   ){.         ret
dd50: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 7d  urn rc;.       }
dd60: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d  .    }.    pPg =
dd70: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
dd80: 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 70   /* Search for p
dd90: 61 67 65 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a  age in cache */.
dda0: 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
ddb0: 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
ddc0: 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 70 50  gno);.    if( pP
ddd0: 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70  ager->memDb && p
dde0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
ddf0: 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
de00: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
de10: 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
de20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
de30: 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
de40: 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
de50: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
de60: 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
de70: 2a 2f 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20  */.    int h;.  
de80: 20 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 2b    pPager->nMiss+
de90: 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  +;.    if( pPage
dea0: 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65 72 2d  r->nPage<pPager-
deb0: 3e 6d 78 50 61 67 65 20 7c 7c 20 70 50 61 67 65  >mxPage || pPage
dec0: 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20 7c 7c 20  r->pFirst==0 || 
ded0: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
dee0: 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65  .      /* Create
def0: 20 61 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a 20   a new page */. 
df00: 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74       pPg = sqlit
df10: 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65  eMallocRaw( size
df20: 6f 66 28 2a 70 50 67 29 20 2b 20 53 51 4c 49 54  of(*pPg) + SQLIT
df30: 45 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20  E_PAGE_SIZE .   
df40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df50: 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a             + siz
df60: 65 6f 66 28 75 33 32 29 20 2b 20 70 50 61 67 65  eof(u32) + pPage
df70: 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20  r->nExtra.      
df80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df90: 20 20 20 20 20 20 20 20 2b 20 70 50 61 67 65 72          + pPager
dfa0: 2d 3e 6d 65 6d 44 62 2a 73 69 7a 65 6f 66 28 50  ->memDb*sizeof(P
dfb0: 67 48 69 73 74 6f 72 79 29 20 29 3b 0a 20 20 20  gHistory) );.   
dfc0: 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b     if( pPg==0 ){
dfd0: 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 75  .        pager_u
dfe0: 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
dff0: 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  r);.        pPag
e000: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50  er->errMask |= P
e010: 41 47 45 52 5f 45 52 52 5f 4d 45 4d 3b 0a 20 20  AGER_ERR_MEM;.  
e020: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
e030: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
e040: 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
e050: 70 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  pPg, 0, sizeof(*
e060: 70 50 67 29 29 3b 0a 20 20 20 20 20 20 69 66 28  pPg));.      if(
e070: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29   pPager->memDb )
e080: 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
e090: 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  (PGHDR_TO_HIST(p
e0a0: 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20  Pg, pPager), 0, 
e0b0: 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79  sizeof(PgHistory
e0c0: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
e0d0: 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20    pPg->pPager = 
e0e0: 70 50 61 67 65 72 3b 0a 20 20 20 20 20 20 70 50  pPager;.      pP
e0f0: 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50  g->pNextAll = pP
e100: 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20  ager->pAll;.    
e110: 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d    pPager->pAll =
e120: 20 70 50 67 3b 0a 20 20 20 20 20 20 70 50 61 67   pPg;.      pPag
e130: 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  er->nPage++;.   
e140: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
e150: 20 46 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20   Find a page to 
e160: 72 65 63 79 63 6c 65 2e 20 20 54 72 79 20 74 6f  recycle.  Try to
e170: 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 74   locate a page t
e180: 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20  hat does not.   
e190: 20 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75 73     ** require us
e1a0: 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63 28   to do an fsync(
e1b0: 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ) on the journal
e1c0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
e1d0: 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70   pPg = pPager->p
e1e0: 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20  FirstSynced;..  
e1f0: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75      /* If we cou
e200: 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61  ld not find a pa
e210: 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ge that does not
e220: 20 72 65 71 75 69 72 65 20 61 6e 20 66 73 79 6e   require an fsyn
e230: 63 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20  c().      ** on 
e240: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e250: 20 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20   then fsync the 
e260: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54  journal file.  T
e270: 68 69 73 20 69 73 20 61 0a 20 20 20 20 20 20 2a  his is a.      *
e280: 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65 72  * very slow oper
e290: 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f 72  ation, so we wor
e2a0: 6b 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64 20  k hard to avoid 
e2b0: 69 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69 6d  it.  But sometim
e2c0: 65 73 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63  es.      ** it c
e2d0: 61 6e 27 74 20 62 65 20 68 65 6c 70 65 64 2e 0a  an't be helped..
e2e0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
e2f0: 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
e300: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 79       int rc = sy
e310: 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
e320: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
e330: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
e340: 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
e350: 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
e360: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  r);.          re
e370: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
e380: 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
e390: 20 20 20 20 20 70 50 67 20 3d 20 70 50 61 67 65       pPg = pPage
e3a0: 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 20 20 20  r->pFirst;.     
e3b0: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
e3c0: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b   pPg->nRef==0 );
e3d0: 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ..      /* Write
e3e0: 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65   the page to the
e3f0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
e400: 66 20 69 74 20 69 73 20 64 69 72 74 79 2e 0a 20  f it is dirty.. 
e410: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
e420: 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a  ( pPg->dirty ){.
e430: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
e440: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
e450: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 67 2d   );.        pPg-
e460: 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  >pDirty = 0;.   
e470: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
e480: 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 20  write_pagelist( 
e490: 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 69  pPg );.        i
e4a0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e4b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
e4c0: 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
e4d0: 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
e4e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
e4f0: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
e500: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
e510: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
e520: 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20  >dirty==0 );..  
e530: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
e540: 67 65 20 77 65 20 61 72 65 20 72 65 63 79 63 6c  ge we are recycl
e550: 69 6e 67 20 69 73 20 6d 61 72 6b 65 64 20 61 73  ing is marked as
e560: 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c   alwaysRollback,
e570: 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 73   then.      ** s
e580: 65 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c  et the global al
e590: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61  waysRollback fla
e5a0: 67 2c 20 74 68 75 73 20 64 69 73 61 62 6c 69 6e  g, thus disablin
e5b0: 67 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73  g the.      ** s
e5c0: 71 6c 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62  qlite_dont_rollb
e5d0: 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69  ack() optimizati
e5e0: 6f 6e 20 66 6f 72 20 74 68 65 20 72 65 73 74 20  on for the rest 
e5f0: 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  of this transact
e600: 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 49 74  ion..      ** It
e610: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
e620: 20 64 6f 20 74 68 69 73 20 62 65 63 61 75 73 65   do this because
e630: 20 74 68 65 20 70 61 67 65 20 6d 61 72 6b 65 64   the page marked
e640: 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a   alwaysRollback.
e650: 20 20 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 62        ** might b
e660: 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20 61 20  e reloaded at a 
e670: 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74 20 61  later time but a
e680: 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 20  t that point we 
e690: 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a 20  won't remember. 
e6a0: 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20       ** that is 
e6b0: 77 61 73 20 6d 61 72 6b 65 64 20 61 6c 77 61 79  was marked alway
e6c0: 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73  sRollback.  This
e6d0: 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20   means that all 
e6e0: 70 61 67 65 73 20 6d 75 73 74 0a 20 20 20 20 20  pages must.     
e6f0: 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73   ** be marked as
e700: 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
e710: 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74  from here on out
e720: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
e730: 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73   if( pPg->always
e740: 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Rollback ){.    
e750: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61      pPager->alwa
e760: 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  ysRollback = 1;.
e770: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
e780: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64  * Unlink the old
e790: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
e7a0: 72 65 65 20 6c 69 73 74 20 61 6e 64 20 74 68 65  ree list and the
e7b0: 20 68 61 73 68 20 74 61 62 6c 65 0a 20 20 20 20   hash table.    
e7c0: 20 20 2a 2f 0a 20 20 20 20 20 20 75 6e 6c 69 6e    */.      unlin
e7d0: 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  kPage(pPg);.    
e7e0: 20 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 2b    pPager->nOvfl+
e7f0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67  +;.    }.    pPg
e800: 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
e810: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61     if( pPager->a
e820: 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e  InJournal && (in
e830: 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  t)pgno<=pPager->
e840: 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
e850: 20 20 20 20 73 71 6c 69 74 65 33 43 68 65 63 6b      sqlite3Check
e860: 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 61  Memory(pPager->a
e870: 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f  InJournal, pgno/
e880: 38 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  8);.      assert
e890: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
e8a0: 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 70  lOpen );.      p
e8b0: 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
e8c0: 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
e8d0: 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31  nal[pgno/8] & (1
e8e0: 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b  <<(pgno&7)))!=0;
e8f0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
e900: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Sync = 0;.    }e
e910: 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
e920: 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
e930: 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
e940: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  nc = 0;.    }.  
e950: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
e960: 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 67  nStmt && (int)pg
e970: 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74  no<=pPager->stmt
e980: 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20  Size.           
e990: 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 61 49    && (pPager->aI
e9a0: 6e 53 74 6d 74 5b 70 67 6e 6f 2f 38 5d 20 26 20  nStmt[pgno/8] & 
e9b0: 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d  (1<<(pgno&7)))!=
e9c0: 30 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 5f  0 ){.      page_
e9d0: 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
e9e0: 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pPg);.    }else
e9f0: 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 72 65 6d  {.      page_rem
ea00: 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69  ove_from_stmt_li
ea10: 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  st(pPg);.    }. 
ea20: 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
ea30: 30 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65 66  0;.    pPg->nRef
ea40: 20 3d 20 31 3b 0a 20 20 20 20 52 45 46 49 4e 46   = 1;.    REFINF
ea50: 4f 28 70 50 67 29 3b 0a 20 20 20 20 70 50 61 67  O(pPg);.    pPag
ea60: 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  er->nRef++;.    
ea70: 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70  h = pager_hash(p
ea80: 67 6e 6f 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  gno);.    pPg->p
ea90: 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65  NextHash = pPage
eaa0: 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20  r->aHash[h];.   
eab0: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
eac0: 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28  ] = pPg;.    if(
ead0: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
eae0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
eaf0: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d   pPg->pNextHash-
eb00: 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b  >pPrevHash==0 );
eb10: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
eb20: 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
eb30: 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
eb40: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 45    if( pPager->nE
eb50: 78 74 72 61 3e 30 20 29 7b 0a 20 20 20 20 20 20  xtra>0 ){.      
eb60: 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
eb70: 45 58 54 52 41 28 70 50 67 29 2c 20 30 2c 20 70  EXTRA(pPg), 0, p
eb80: 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a  Pager->nExtra);.
eb90: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
eba0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20 29  ager->dbSize<0 )
ebb0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
ebc0: 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
ebd0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
ebe0: 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20  >errMask!=0 ){. 
ebf0: 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
ec00: 72 5f 75 6e 72 65 66 28 50 47 48 44 52 5f 54 4f  r_unref(PGHDR_TO
ec10: 5f 44 41 54 41 28 70 50 67 29 29 3b 0a 20 20 20  _DATA(pPg));.   
ec20: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72     rc = pager_er
ec30: 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  rcode(pPager);. 
ec40: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
ec50: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
ec60: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e  ager->dbSize<(in
ec70: 74 29 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  t)pgno ){.      
ec80: 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
ec90: 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 53 51  DATA(pPg), 0, SQ
eca0: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
ecb0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ecc0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
ecd0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
ece0: 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20  memDb==0 );.    
ecf0: 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
ed00: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67  &pPager->fd, (pg
ed10: 6e 6f 2d 31 29 2a 28 6f 66 66 5f 74 29 53 51 4c  no-1)*(off_t)SQL
ed20: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
ed30: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
ed40: 65 33 4f 73 52 65 61 64 28 26 70 50 61 67 65 72  e3OsRead(&pPager
ed50: 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ->fd, PGHDR_TO_D
ed60: 41 54 41 28 70 50 67 29 2c 20 53 51 4c 49 54 45  ATA(pPg), SQLITE
ed70: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
ed80: 20 20 20 54 52 41 43 45 32 28 22 46 45 54 43 48     TRACE2("FETCH
ed90: 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50 67   page %d\n", pPg
eda0: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43  ->pgno);.      C
edb0: 4f 44 45 43 28 70 50 61 67 65 72 2c 20 50 47 48  ODEC(pPager, PGH
edc0: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
edd0: 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a   pPg->pgno, 3);.
ede0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
edf0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
ee00: 20 20 20 6f 66 66 5f 74 20 66 69 6c 65 53 69 7a     off_t fileSiz
ee10: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  e;.        if( s
ee20: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
ee30: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 26 66 69  (&pPager->fd,&fi
ee40: 6c 65 53 69 7a 65 29 21 3d 53 51 4c 49 54 45 5f  leSize)!=SQLITE_
ee50: 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  OK.             
ee60: 20 20 7c 7c 20 66 69 6c 65 53 69 7a 65 3e 3d 70    || fileSize>=p
ee70: 67 6e 6f 2a 53 51 4c 49 54 45 5f 50 41 47 45 5f  gno*SQLITE_PAGE_
ee80: 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
ee90: 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
eea0: 6e 72 65 66 28 50 47 48 44 52 5f 54 4f 5f 44 41  nref(PGHDR_TO_DA
eeb0: 54 41 28 70 50 67 29 29 3b 0a 20 20 20 20 20 20  TA(pPg));.      
eec0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
eed0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
eee0: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50          memset(P
eef0: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
ef00: 29 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50 41 47  ), 0, SQLITE_PAG
ef10: 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20  E_SIZE);.       
ef20: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
ef30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
ef40: 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70   The requested p
ef50: 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 70 61  age is in the pa
ef60: 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  ge cache. */.   
ef70: 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 2b 2b 3b   pPager->nHit++;
ef80: 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28 70 50  .    page_ref(pP
ef90: 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67  g);.  }.  *ppPag
efa0: 65 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  e = PGHDR_TO_DAT
efb0: 41 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e  A(pPg);.  return
efc0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
efd0: 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70  *.** Acquire a p
efe0: 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72  age if it is alr
eff0: 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d  eady in the in-m
f000: 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f  emory cache.  Do
f010: 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65  .** not read the
f020: 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e   page from disk.
f030: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
f040: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a  er to the page,.
f050: 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70  ** or 0 if the p
f060: 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
f070: 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  che..**.** See a
f080: 6c 73 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72  lso sqlite3pager
f090: 5f 67 65 74 28 29 2e 20 20 54 68 65 20 64 69 66  _get().  The dif
f0a0: 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
f0b0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
f0c0: 61 6e 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  and sqlite3pager
f0d0: 5f 67 65 74 28 29 20 69 73 20 74 68 61 74 20 5f  _get() is that _
f0e0: 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f  get() will go to
f0f0: 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65   the disk and re
f100: 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67  ad.** in the pag
f110: 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
f120: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
f130: 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
f140: 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
f150: 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65  NULL if the page
f160: 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
f170: 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f   or if a disk I/
f180: 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20  O error .** has 
f190: 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a  ever happened..*
f1a0: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 70  /.void *sqlite3p
f1b0: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65  ager_lookup(Page
f1c0: 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
f1d0: 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
f1e0: 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pPg;..  assert( 
f1f0: 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
f200: 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
f210: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
f220: 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45  errMask & ~(PAGE
f230: 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20  R_ERR_FULL) ){. 
f240: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
f250: 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c  .  pPg = pager_l
f260: 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
f270: 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d  no);.  if( pPg==
f280: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
f290: 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
f2a0: 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f   return PGHDR_TO
f2b0: 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f  _DATA(pPg);.}../
f2c0: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70  *.** Release a p
f2d0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  age..**.** If th
f2e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
f2f0: 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
f300: 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c  ge drop to zero,
f310: 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67   then the.** pag
f320: 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
f330: 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65  e LRU list.  Whe
f340: 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  n all references
f350: 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a   to all pages.**
f360: 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61   are released, a
f370: 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
f380: 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
f390: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
f3a0: 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a  .** removed..*/.
f3b0: 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
f3c0: 5f 75 6e 72 65 66 28 76 6f 69 64 20 2a 70 44 61  _unref(void *pDa
f3d0: 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
f3e0: 67 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65  g;..  /* Decreme
f3f0: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
f400: 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73 20   count for this 
f410: 70 61 67 65 0a 20 20 2a 2f 0a 20 20 70 50 67 20  page.  */.  pPg 
f420: 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
f430: 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74  pData);.  assert
f440: 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
f450: 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a  .  pPg->nRef--;.
f460: 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
f470: 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e  .  /* When the n
f480: 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
f490: 63 65 73 20 74 6f 20 61 20 70 61 67 65 20 72 65  ces to a page re
f4a0: 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a  ach 0, call the.
f4b0: 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20    ** destructor 
f4c0: 61 6e 64 20 61 64 64 20 74 68 65 20 70 61 67 65  and add the page
f4d0: 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
f4e0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
f4f0: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
f500: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
f510: 20 20 20 20 70 50 61 67 65 72 20 3d 20 70 50 67      pPager = pPg
f520: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50  ->pPager;.    pP
f530: 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 30  g->pNextFree = 0
f540: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  ;.    pPg->pPrev
f550: 46 72 65 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Free = pPager->p
f560: 4c 61 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72  Last;.    pPager
f570: 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20  ->pLast = pPg;. 
f580: 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65     if( pPg->pPre
f590: 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70  vFree ){.      p
f5a0: 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70  Pg->pPrevFree->p
f5b0: 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 3b 0a  NextFree = pPg;.
f5c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f5d0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
f5e0: 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
f5f0: 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79   if( pPg->needSy
f600: 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  nc==0 && pPager-
f610: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30  >pFirstSynced==0
f620: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
f630: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
f640: 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
f650: 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73  if( pPager->xDes
f660: 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 20  tructor ){.     
f670: 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
f680: 63 74 6f 72 28 70 44 61 74 61 2c 20 70 50 61 67  ctor(pData, pPag
f690: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
f6a0: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57     }.  .    /* W
f6b0: 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65  hen all pages re
f6c0: 61 63 68 20 74 68 65 20 66 72 65 65 6c 69 73 74  ach the freelist
f6d0: 2c 20 64 72 6f 70 20 74 68 65 20 72 65 61 64 20  , drop the read 
f6e0: 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  lock from.    **
f6f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
f700: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  le..    */.    p
f710: 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  Pager->nRef--;. 
f720: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
f730: 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20  r->nRef>=0 );.  
f740: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52    if( pPager->nR
f750: 65 66 3d 3d 30 20 26 26 20 21 70 50 61 67 65 72  ef==0 && !pPager
f760: 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20  ->memDb ){.     
f770: 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
f780: 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
f790: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f7a0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
f7b0: 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ate a journal fi
f7c0: 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20  le for pPager.  
f7d0: 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72  There should alr
f7e0: 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56  eady be a RESERV
f7f0: 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49  ED.** or EXCLUSI
f800: 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
f810: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65  atabase file whe
f820: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
f830: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
f840: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
f850: 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20   if everything. 
f860: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
f870: 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73   code and releas
f880: 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c  e the.** write l
f890: 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ock if anything 
f8a0: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  goes wrong..*/.s
f8b0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
f8c0: 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67  open_journal(Pag
f8d0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
f8e0: 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
f8f0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
f900: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
f910: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
f920: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
f930: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
f940: 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
f950: 61 6c 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 70  al );.  sqlite3p
f960: 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70  ager_pagecount(p
f970: 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72  Pager);.  pPager
f980: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73  ->aInJournal = s
f990: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61  qliteMalloc( pPa
f9a0: 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20  ger->dbSize/8 + 
f9b0: 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  1 );.  if( pPage
f9c0: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
f9d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
f9e0: 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d  sUnlock(&pPager-
f9f0: 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
fa00: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
fa10: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
fa20: 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  RED;.    return 
fa30: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
fa40: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
fa50: 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
fa60: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
fa70: 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 70  , &pPager->jfd,p
fa80: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
fa90: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
faa0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
fab0: 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
fac0: 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  aInJournal);.   
fad0: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
fae0: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  nal = 0;.    sql
faf0: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50  ite3OsUnlock(&pP
fb00: 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44  ager->fd, SHARED
fb10: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67  _LOCK);.    pPag
fb20: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
fb30: 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65  R_SHARED;.    re
fb40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
fb50: 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  OPEN;.  }.  sqli
fb60: 74 65 33 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f  te3OsOpenDirecto
fb70: 72 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  ry(pPager->zDire
fb80: 63 74 6f 72 79 2c 20 26 70 50 61 67 65 72 2d 3e  ctory, &pPager->
fb90: 6a 66 64 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  jfd);.  pPager->
fba0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b  journalOpen = 1;
fbb0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
fbc0: 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
fbd0: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
fbe0: 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  c = 0;.  pPager-
fbf0: 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
fc00: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
fc10: 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Rec = 0;.  if( p
fc20: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d  Pager->errMask!=
fc30: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  0 ){.    rc = pa
fc40: 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67  ger_errcode(pPag
fc50: 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
fc60: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  rc;.  }.  pPager
fc70: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70  ->origDbSize = p
fc80: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a  Pager->dbSize;..
fc90: 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
fca0: 68 65 61 64 65 72 20 66 6f 72 20 74 68 65 20 6a  header for the j
fcb0: 6f 75 72 6e 61 6c 3a 0a 20 20 2a 2a 20 2d 20 38  ournal:.  ** - 8
fcc0: 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64   bytes: Magic id
fcd0: 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61  entifying journa
fce0: 6c 20 66 6f 72 6d 61 74 2e 0a 20 20 2a 2a 20 2d  l format..  ** -
fcf0: 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72   4 bytes: Number
fd00: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a   of records in j
fd10: 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f  ournal, or -1 no
fd20: 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e  -sync mode is on
fd30: 2e 0a 20 20 2a 2a 20 2d 20 34 20 62 79 74 65 73  ..  ** - 4 bytes
fd40: 3a 20 4d 61 67 69 63 20 75 73 65 64 20 66 6f 72  : Magic used for
fd50: 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d 73 2e   page checksums.
fd60: 0a 20 20 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  .  ** - 4 bytes:
fd70: 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   Initial databas
fd80: 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 20 20  e page count..  
fd90: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75  ** - 4 bytes: Nu
fda0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
fdb0: 73 65 72 76 65 64 20 66 6f 72 20 6d 61 73 74 65  served for maste
fdc0: 72 20 6a 6f 75 72 6e 61 6c 20 70 74 72 20 28 6e  r journal ptr (n
fdd0: 4d 61 73 74 65 72 29 0a 20 20 2a 2a 20 2d 20 6e  Master).  ** - n
fde0: 4d 61 73 74 65 72 20 62 79 74 65 73 3a 20 53 70  Master bytes: Sp
fdf0: 61 63 65 20 66 6f 72 20 61 20 6d 61 73 74 65 72  ace for a master
fe00: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
fe10: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
fe20: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50  lite3OsWrite(&pP
fe30: 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72  ager->jfd, aJour
fe40: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
fe50: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
fe60: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
fe70: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
fe80: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70  = write32bits(&p
fe90: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
fea0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66  er->noSync ? 0xf
feb0: 66 66 66 66 66 66 66 20 3a 20 30 29 3b 0a 20 20  fffffff : 0);.  
fec0: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
fed0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
fee0: 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73  ite3Randomness(s
fef0: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b  izeof(pPager->ck
ff00: 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65  sumInit), &pPage
ff10: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
ff20: 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
ff30: 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  its(&pPager->jfd
ff40: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
ff50: 6e 69 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nit);.  }.  if( 
ff60: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
ff70: 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33  .    rc = write3
ff80: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
ff90: 66 64 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  fd, pPager->dbSi
ffa0: 7a 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ze);.  }.  if( r
ffb0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
ffc0: 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
ffd0: 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66  bits(&pPager->jf
ffe0: 64 2c 20 70 50 61 67 65 72 2d 3e 6e 4d 61 73 74  d, pPager->nMast
fff0: 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  er);.  }.  if( r
10000 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
10010 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65      sqlite3OsSee
10020 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  k(&pPager->jfd, 
10030 32 34 20 2b 20 70 50 61 67 65 72 2d 3e 6e 4d 61  24 + pPager->nMa
10040 73 74 65 72 20 2d 20 31 29 3b 0a 20 20 20 20 72  ster - 1);.    r
10050 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
10060 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  te(&pPager->jfd,
10070 20 22 5c 30 30 30 22 2c 20 31 29 3b 0a 20 20 7d   "\000", 1);.  }
10080 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
10090 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26 20 72  tmtAutoopen && r
100a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
100b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
100c0 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e  pager_stmt_begin
100d0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
100e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
100f0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
10100 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
10110 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
10120 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
10130 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
10140 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a  ITE_FULL;.    }.
10150 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
10160 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75    .}../*.** Acqu
10170 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ire a write-lock
10180 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
10190 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72  .  The lock is r
101a0 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74  emoved when.** t
101b0 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  he any of the fo
101c0 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a  llowing happen:.
101d0 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  **.**   *  sqlit
101e0 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29  e3pager_commit()
101f0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
10200 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72   *  sqlite3pager
10210 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63  _rollback() is c
10220 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
10230 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73  qlite3pager_clos
10240 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
10250 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61  *   *  sqlite3pa
10260 67 65 72 5f 75 6e 72 65 66 28 29 20 69 73 20 63  ger_unref() is c
10270 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65 72  alled to on ever
10280 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  y outstanding pa
10290 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ge..**.** The fi
102a0 72 73 74 20 70 61 72 61 6d 65 74 65 72 20 74 6f  rst parameter to
102b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
102c0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
102d0 79 20 6f 70 65 6e 20 70 61 67 65 20 6f 66 20 74  y open page of t
102e0 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
102f0 69 6c 65 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68  ile.  Nothing ch
10300 61 6e 67 65 73 20 61 62 6f 75 74 20 74 68 65 20  anges about the 
10310 70 61 67 65 20 2d 20 69 74 20 69 73 20 75 73 65  page - it is use
10320 64 20 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61  d merely to.** a
10330 63 71 75 69 72 65 20 61 20 70 6f 69 6e 74 65 72  cquire a pointer
10340 20 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74   to the Pager st
10350 72 75 63 74 75 72 65 20 61 6e 64 20 61 73 20 70  ructure and as p
10360 72 6f 6f 66 20 74 68 61 74 20 74 68 65 72 65 20  roof that there 
10370 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 61 20  is.** already a 
10380 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  read-lock on the
10390 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
103a0 20 54 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   The second para
103b0 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20  meter indicates 
103c0 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69  how much space i
103d0 6e 20 62 79 74 65 73 20 74 6f 20 72 65 73 65 72  n bytes to reser
103e0 76 65 20 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74  ve for a.** mast
103f0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d  er journal file-
10400 6e 61 6d 65 20 61 74 20 74 68 65 20 73 74 61 72  name at the star
10410 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
10420 20 77 68 65 6e 20 69 74 20 69 73 20 63 72 65 61   when it is crea
10430 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75  ted..**.** A jou
10440 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
10450 6e 65 64 20 69 66 20 74 68 69 73 20 69 73 20 6e  ned if this is n
10460 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ot a temporary f
10470 69 6c 65 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72  ile.  For tempor
10480 61 72 79 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68  ary.** files, th
10490 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68 65  e opening of the
104a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
104b0 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20   deferred until 
104c0 74 68 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61  there is an.** a
104d0 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 77 72  ctual need to wr
104e0 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ite to the journ
104f0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  al..**.** If the
10500 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72   database is alr
10510 65 61 64 79 20 72 65 73 65 72 76 65 64 20 66 6f  eady reserved fo
10520 72 20 77 72 69 74 69 6e 67 2c 20 74 68 69 73 20  r writing, this 
10530 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
10540 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
10550 65 33 70 61 67 65 72 5f 62 65 67 69 6e 28 76 6f  e3pager_begin(vo
10560 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e  id *pData, int n
10570 4d 61 73 74 65 72 29 7b 0a 20 20 50 67 48 64 72  Master){.  PgHdr
10580 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
10590 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
105a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
105b0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
105c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
105d0 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  K;.  assert( pPg
105e0 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73  ->nRef>0 );.  as
105f0 73 65 72 74 28 20 6e 4d 61 73 74 65 72 3e 3d 30  sert( nMaster>=0
10600 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
10610 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
10620 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69  ER_UNLOCK );.  i
10630 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
10640 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  ==PAGER_SHARED )
10650 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
10660 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
10670 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
10680 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
10690 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
106a0 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
106b0 55 53 49 56 45 3b 0a 20 20 20 20 20 20 70 50 61  USIVE;.      pPa
106c0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
106d0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
106e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
106f0 20 20 20 69 6e 74 20 62 75 73 79 20 3d 20 31 3b     int busy = 1;
10700 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  .      do {.    
10710 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10720 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  OsLock(&pPager->
10730 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  fd, RESERVED_LOC
10740 4b 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  K);.      }while
10750 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
10760 59 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  Y && .          
10770 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
10780 64 6c 65 72 20 26 26 20 0a 20 20 20 20 20 20 20  dler && .       
10790 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79     pPager->pBusy
107a0 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 20 26  Handler->xFunc &
107b0 26 20 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  & .          pPa
107c0 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
107d0 72 2d 3e 78 46 75 6e 63 28 70 50 61 67 65 72 2d  r->xFunc(pPager-
107e0 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 70  >pBusyHandler->p
107f0 41 72 67 2c 20 22 22 2c 20 62 75 73 79 2b 2b 29  Arg, "", busy++)
10800 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
10810 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10820 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
10830 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
10840 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d        pPager->nM
10850 61 73 74 65 72 20 3d 20 6e 4d 61 73 74 65 72 3b  aster = nMaster;
10860 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
10870 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53  tate = PAGER_RES
10880 45 52 56 45 44 3b 0a 20 20 20 20 20 20 70 50 61  ERVED;.      pPa
10890 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
108a0 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45  = 0;.      TRACE
108b0 33 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25  3("TRANSACTION %
108c0 64 20 6e 4d 61 73 74 65 72 3d 25 64 5c 6e 22 2c  d nMaster=%d\n",
108d0 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 2c 20 6e   pPager->fd.h, n
108e0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69  Master);.      i
108f0 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  f( pPager->useJo
10900 75 72 6e 61 6c 20 26 26 20 21 70 50 61 67 65 72  urnal && !pPager
10910 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
10920 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
10930 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50  _open_journal(pP
10940 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
10950 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
10960 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
10970 61 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20  ark a data page 
10980 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54  as writeable.  T
10990 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
109a0 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
109b0 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73  nal .** if it is
109c0 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61   not there alrea
109d0 64 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  dy.  This routin
109e0 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  e must be called
109f0 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a   before making.*
10a00 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70  * changes to a p
10a10 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  age..**.** The f
10a20 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72  irst time this r
10a30 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
10a40 2c 20 74 68 65 20 70 61 67 65 72 20 63 72 65 61  , the pager crea
10a50 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75  tes a new.** jou
10a60 72 6e 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65  rnal and acquire
10a70 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
10a80 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
10a90 65 2e 20 20 49 66 20 74 68 65 20 52 45 53 45 52  e.  If the RESER
10aa0 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c  VED.** lock coul
10ab0 64 20 6e 6f 74 20 62 65 20 61 63 71 75 69 72 65  d not be acquire
10ac0 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
10ad0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42  returns SQLITE_B
10ae0 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c  USY.  The.** cal
10af0 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75 73  ling routine mus
10b00 74 20 63 68 65 63 6b 20 66 6f 72 20 74 68 61 74  t check for that
10b10 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 61 6e   return value an
10b20 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74  d be careful not
10b30 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e   to.** change an
10b40 79 20 70 61 67 65 20 64 61 74 61 20 75 6e 74 69  y page data unti
10b50 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  l this routine r
10b60 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
10b70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
10b80 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c  ournal file coul
10b90 64 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e  d not be written
10ba0 20 62 65 63 61 75 73 65 20 74 68 65 20 64 69 73   because the dis
10bb0 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68  k is full,.** th
10bc0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
10bd0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 46  returns SQLITE_F
10be0 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e 20  ULL and does an 
10bf0 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62 61  immediate rollba
10c00 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65  ck..** All subse
10c10 71 75 65 6e 74 20 77 72 69 74 65 20 61 74 74 65  quent write atte
10c20 6d 70 74 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  mpts also return
10c30 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74   SQLITE_FULL unt
10c40 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61  il there.** is a
10c50 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
10c60 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20 6f  pager_commit() o
10c70 72 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  r sqlite3pager_r
10c80 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20  ollback() to.** 
10c90 72 65 73 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  reset..*/.int sq
10ca0 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
10cb0 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
10cc0 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41   PgHdr *pPg = DA
10cd0 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
10ce0 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  a);.  Pager *pPa
10cf0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
10d00 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
10d10 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43  LITE_OK;..  /* C
10d20 68 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a  heck for errors.
10d30 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
10d40 72 2d 3e 65 72 72 4d 61 73 6b 20 29 7b 20 0a 20  r->errMask ){ . 
10d50 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
10d60 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
10d70 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
10d80 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  r->readOnly ){. 
10d90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10da0 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _PERM;.  }..  /*
10db0 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   Mark the page a
10dc0 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65  s dirty.  If the
10dd0 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64   page has alread
10de0 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20  y been written. 
10df0 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e   ** to the journ
10e00 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72  al then we can r
10e10 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79  eturn right away
10e20 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 64 69  ..  */.  pPg->di
10e30 72 74 79 20 3d 20 31 3b 0a 20 20 69 66 28 20 70  rty = 1;.  if( p
10e40 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26  Pg->inJournal &&
10e50 20 28 70 50 67 2d 3e 69 6e 53 74 6d 74 20 7c 7c   (pPg->inStmt ||
10e60 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
10e70 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 50  se==0) ){.    pP
10e80 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
10e90 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
10ea0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
10eb0 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20  .  /* If we get 
10ec0 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61  this far, it mea
10ed0 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
10ee0 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 2a   needs to be.  *
10ef0 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  * written to the
10f00 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
10f10 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63  rnal or the ckec
10f20 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20  kpoint journal. 
10f30 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a   ** or both..  *
10f40 2a 0a 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65  *.  ** First che
10f50 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 74  ck to see that t
10f60 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
10f70 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e  ournal exists an
10f80 64 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74  d.  ** create it
10f90 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e   if it does not.
10fa0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
10fb0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
10fc0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
10fd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
10fe0 65 72 5f 62 65 67 69 6e 28 70 44 61 74 61 2c 20  er_begin(pData, 
10ff0 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
11000 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
11010 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
11020 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
11030 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
11040 45 52 56 45 44 20 29 3b 0a 20 20 69 66 28 20 21  ERVED );.  if( !
11050 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11060 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 75  pen && pPager->u
11070 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  seJournal ){.   
11080 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
11090 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
110a0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
110b0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
110c0 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
110d0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
110e0 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65  alOpen || !pPage
110f0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
11100 0a 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79  .  pPager->dirty
11110 43 61 63 68 65 20 3d 20 31 3b 0a 0a 20 20 2f 2a  Cache = 1;..  /*
11120 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   The transaction
11130 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69   journal now exi
11140 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20  sts and we have 
11150 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e  a RESERVED or an
11160 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20  .  ** EXCLUSIVE 
11170 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e  lock on the main
11180 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
11190 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65   Write the curre
111a0 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 2a 2a 20  nt page to.  ** 
111b0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
111c0 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73  journal if it is
111d0 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61   not there alrea
111e0 64 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  dy..  */.  if( !
111f0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26  pPg->inJournal &
11200 26 20 28 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  & (pPager->useJo
11210 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d  urnal || pPager-
11220 3e 6d 65 6d 44 62 29 20 29 7b 0a 20 20 20 20 69  >memDb) ){.    i
11230 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  f( (int)pPg->pgn
11240 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  o <= pPager->ori
11250 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  gDbSize ){.     
11260 20 69 6e 74 20 73 7a 50 67 3b 0a 20 20 20 20 20   int szPg;.     
11270 20 75 33 32 20 73 61 76 65 64 3b 0a 20 20 20 20   u32 saved;.    
11280 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65    if( pPager->me
11290 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20 50  mDb ){.        P
112a0 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
112b0 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
112c0 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
112d0 20 20 20 20 20 20 54 52 41 43 45 32 28 22 4a 4f        TRACE2("JO
112e0 55 52 4e 41 4c 20 70 61 67 65 20 25 64 5c 6e 22  URNAL page %d\n"
112f0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
11300 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48        assert( pH
11310 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b  ist->pOrig==0 );
11320 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e  .        pHist->
11330 70 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 4d 61  pOrig = sqliteMa
11340 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72 2d  llocRaw( pPager-
11350 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
11360 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e       if( pHist->
11370 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20  pOrig ){.       
11380 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d     memcpy(pHist-
11390 3e 70 4f 72 69 67 2c 20 50 47 48 44 52 5f 54 4f  >pOrig, PGHDR_TO
113a0 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67  _DATA(pPg), pPag
113b0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
113c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
113d0 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
113e0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
113f0 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6b  {.        u32 ck
11400 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75  sum = pager_cksu
11410 6d 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  m(pPager, pPg->p
11420 67 6e 6f 2c 20 70 44 61 74 61 29 3b 0a 20 20 20  gno, pData);.   
11430 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a 28 75       saved = *(u
11440 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45 58 54  32*)PGHDR_TO_EXT
11450 52 41 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  RA(pPg);.       
11460 20 73 74 6f 72 65 33 32 62 69 74 73 28 63 6b 73   store32bits(cks
11470 75 6d 2c 20 70 50 67 2c 20 53 51 4c 49 54 45 5f  um, pPg, SQLITE_
11480 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
11490 20 20 20 20 73 7a 50 67 20 3d 20 53 51 4c 49 54      szPg = SQLIT
114a0 45 5f 50 41 47 45 5f 53 49 5a 45 2b 38 3b 0a 20  E_PAGE_SIZE+8;. 
114b0 20 20 20 20 20 20 20 73 74 6f 72 65 33 32 62 69         store32bi
114c0 74 73 28 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ts(pPg->pgno, pP
114d0 67 2c 20 2d 34 29 3b 0a 20 20 20 20 20 20 20 20  g, -4);.        
114e0 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44  CODEC(pPager, pD
114f0 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
11500 37 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  7);.        rc =
11510 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
11520 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 28  &pPager->jfd, &(
11530 28 63 68 61 72 2a 29 70 44 61 74 61 29 5b 2d 34  (char*)pData)[-4
11540 5d 2c 20 73 7a 50 67 29 3b 0a 20 20 20 20 20 20  ], szPg);.      
11550 20 20 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41    TRACE3("JOURNA
11560 4c 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  L page %d needSy
11570 6e 63 3d 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70  nc=%d\n", pPg->p
11580 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
11590 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44  nc);.        COD
115a0 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  EC(pPager, pData
115b0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b  , pPg->pgno, 0);
115c0 0a 20 20 20 20 20 20 20 20 2a 28 75 33 32 2a 29  .        *(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 20 3d 20 73 61 76 65 64 3b 0a 20 20 20  Pg) = saved;.   
115f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
11600 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11610 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
11620 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
11630 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
11640 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
11650 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a  PAGER_ERR_FULL;.
11660 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
11670 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
11680 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
11690 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61  Rec++;.        a
116a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
116b0 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
116c0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
116d0 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e  aInJournal[pPg->
116e0 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
116f0 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
11700 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
11710 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f  nc = !pPager->no
11720 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 70 50  Sync;.        pP
11730 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
11740 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
11750 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
11760 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  ){.          pPa
11770 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67  ger->aInStmt[pPg
11780 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
11790 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
117a0 20 20 20 20 20 20 20 20 20 70 61 67 65 5f 61 64           page_ad
117b0 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
117c0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Pg);.        }. 
117d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
117e0 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  {.      pPg->nee
117f0 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d  dSync = !pPager-
11800 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
11810 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
11820 6e 63 3b 0a 20 20 20 20 20 20 54 52 41 43 45 33  nc;.      TRACE3
11830 28 22 41 50 50 45 4e 44 20 70 61 67 65 20 25 64  ("APPEND page %d
11840 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c   needSync=%d\n",
11850 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d   pPg->pgno, pPg-
11860 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20  >needSync);.    
11870 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e  }.    if( pPg->n
11880 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
11890 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
118a0 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
118b0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74  ..  /* If the st
118c0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
118d0 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
118e0 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69  page is not in i
118f0 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 72 69  t,.  ** then wri
11900 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
11910 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65  age to the state
11920 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e  ment journal.  N
11930 6f 74 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ote that.  ** th
11940 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
11950 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65  nal format diffe
11960 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e  rs from the stan
11970 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  dard journal for
11980 6d 61 74 0a 20 20 2a 2a 20 69 6e 20 74 68 61 74  mat.  ** in that
11990 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68   it omits the ch
119a0 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20  ecksums and the 
119b0 68 65 61 64 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  header..  */.  i
119c0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
119d0 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e  nUse && !pPg->in
119e0 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67  Stmt && (int)pPg
119f0 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
11a00 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20  stmtSize ){.    
11a10 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a  assert( pPg->inJ
11a20 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70  ournal || (int)p
11a30 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
11a40 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
11a50 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d     if( pPager->m
11a60 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 50 67  emDb ){.      Pg
11a70 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
11a80 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
11a90 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
11aa0 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74     assert( pHist
11ab0 2d 3e 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  ->pStmt==0 );.  
11ac0 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
11ad0 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
11ae0 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65  aw( pPager->page
11af0 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66  Size );.      if
11b00 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29  ( pHist->pStmt )
11b10 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
11b20 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50  (pHist->pStmt, P
11b30 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
11b40 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
11b50 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
11b60 20 20 20 20 54 52 41 43 45 32 28 22 53 54 4d 54      TRACE2("STMT
11b70 2d 4a 4f 55 52 4e 41 4c 20 70 61 67 65 20 25 64  -JOURNAL page %d
11b80 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  \n", pPg->pgno);
11b90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
11ba0 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 70 50    store32bits(pP
11bb0 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d 34  g->pgno, pPg, -4
11bc0 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70  );.      CODEC(p
11bd0 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
11be0 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20  g->pgno, 7);.   
11bf0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
11c00 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
11c10 73 74 66 64 2c 20 28 28 63 68 61 72 2a 29 70 44  stfd, ((char*)pD
11c20 61 74 61 29 2d 34 2c 20 53 51 4c 49 54 45 5f 50  ata)-4, SQLITE_P
11c30 41 47 45 5f 53 49 5a 45 2b 34 29 3b 0a 20 20 20  AGE_SIZE+4);.   
11c40 20 20 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d     TRACE2("STMT-
11c50 4a 4f 55 52 4e 41 4c 20 70 61 67 65 20 25 64 5c  JOURNAL page %d\
11c60 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  n", pPg->pgno);.
11c70 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
11c80 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
11c90 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20  pgno, 0);.      
11ca0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11cb0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
11cc0 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
11cd0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
11ce0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
11cf0 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
11d00 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 72  _FULL;.        r
11d10 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
11d20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
11d30 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20  stmtNRec++;.    
11d40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11d50 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a  ->aInStmt!=0 );.
11d60 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
11d70 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
11d80 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
11d90 67 6e 6f 26 37 29 3b 0a 20 20 20 20 7d 0a 20 20  gno&7);.    }.  
11da0 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
11db0 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
11dc0 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
11dd0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
11de0 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
11df0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
11e00 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d  dbSize<(int)pPg-
11e10 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  >pgno ){.    pPa
11e20 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
11e30 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72  g->pgno;.  }.  r
11e40 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11e50 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
11e60 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  f the page given
11e70 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
11e80 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
11e90 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c  passed.** to sql
11ea0 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
11eb0 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  ).  In other wor
11ec0 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20  ds, return TRUE 
11ed0 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74  if it is ok.** t
11ee0 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e  o change the con
11ef0 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
11f00 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11f10 70 61 67 65 72 5f 69 73 77 72 69 74 65 61 62 6c  pager_iswriteabl
11f20 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  e(void *pData){.
11f30 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44    PgHdr *pPg = D
11f40 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
11f50 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  ta);.  return pP
11f60 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a  g->dirty;.}../*.
11f70 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 63  ** Replace the c
11f80 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73 69 6e 67  ontent of a sing
11f90 6c 65 20 70 61 67 65 20 77 69 74 68 20 74 68 65  le page with the
11fa0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
11fb0 74 68 65 20 74 68 69 72 64 0a 2a 2a 20 61 72 67  the third.** arg
11fc0 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ument..*/.int sq
11fd0 6c 69 74 65 33 70 61 67 65 72 5f 6f 76 65 72 77  lite3pager_overw
11fe0 72 69 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  rite(Pager *pPag
11ff0 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76  er, Pgno pgno, v
12000 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 76  oid *pData){.  v
12010 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e  oid *pPage;.  in
12020 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  t rc;..  rc = sq
12030 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70  lite3pager_get(p
12040 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50  Pager, pgno, &pP
12050 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  age);.  if( rc==
12060 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12070 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
12080 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b  er_write(pPage);
12090 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
120a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
120b0 6d 65 6d 63 70 79 28 70 50 61 67 65 2c 20 70 44  memcpy(pPage, pD
120c0 61 74 61 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  ata, SQLITE_PAGE
120d0 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20  _SIZE);.    }.  
120e0 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
120f0 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 7d  nref(pPage);.  }
12100 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12110 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
12120 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
12130 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
12140 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  at it is not nec
12150 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69  essary to.** wri
12160 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  te the informati
12170 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70 67 6e 6f  on on page "pgno
12180 22 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69  " back to the di
12190 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a  sk, even though.
121a0 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67  ** that page mig
121b0 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ht be marked as 
121c0 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dirty..**.** The
121d0 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77   overlying softw
121e0 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20  are layer calls 
121f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
12200 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74  n all of the dat
12210 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65  a.** on the give
12220 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64  n page is unused
12230 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d 61 72  .  The pager mar
12240 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63  ks the page as c
12250 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20  lean so.** that 
12260 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20  it does not get 
12270 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
12280 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f  .**.** Tests sho
12290 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69  w that this opti
122a0 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68  mization, togeth
122b0 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73  er with the.** s
122c0 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74  qlite3pager_dont
122d0 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f  _rollback() belo
122e0 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75  w, more than dou
122f0 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a  ble the speed.**
12300 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54   of large INSERT
12310 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20   operations and 
12320 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70  quadruple the sp
12330 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c  eed of large DEL
12340 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ETEs..**.** When
12350 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
12360 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65   called, set the
12370 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
12380 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a  flag to true..**
12390 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
123a0 73 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65  s to sqlite3page
123b0 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  r_dont_rollback(
123c0 29 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70  ) for the same p
123d0 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72  age.** will ther
123e0 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65  eafter be ignore
123f0 64 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  d.  This is nece
12400 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61  ssary to avoid a
12410 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72   problem.** wher
12420 65 20 61 20 70 61 67 65 20 77 69 74 68 20 64 61  e a page with da
12430 74 61 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ta is added to t
12440 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69  he freelist duri
12450 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a  ng one part of.*
12460 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  * a transaction 
12470 74 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f  then removed fro
12480 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64  m the freelist d
12490 75 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61  uring a later pa
124a0 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d  rt.** of the sam
124b0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  e transaction an
124c0 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d  d reused for som
124d0 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e  e other purpose.
124e0 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20    When it.** is 
124f0 66 69 72 73 74 20 61 64 64 65 64 20 74 6f 20 74  first added to t
12500 68 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69  he freelist, thi
12510 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
12520 6c 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65  led.  When reuse
12530 64 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e 74 5f 72  d,.** the dont_r
12540 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  ollback() routin
12550 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75  e is called.  Bu
12560 74 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  t because the pa
12570 67 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 63  ge contains.** c
12580 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65  ritical data, we
12590 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62   still need to b
125a0 65 20 73 75 72 65 20 69 74 20 67 65 74 73 20 72  e sure it gets r
125b0 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70  olled back in sp
125c0 69 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 6f  ite.** of the do
125d0 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 63 61  nt_rollback() ca
125e0 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ll..*/.void sqli
125f0 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 77 72  te3pager_dont_wr
12600 69 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ite(Pager *pPage
12610 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
12620 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
12630 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
12640 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
12650 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52  ;.  pPg->alwaysR
12660 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69  ollback = 1;.  i
12670 66 28 20 70 50 67 20 26 26 20 70 50 67 2d 3e 64  f( pPg && pPg->d
12680 69 72 74 79 20 29 7b 0a 20 20 20 20 69 66 28 20  irty ){.    if( 
12690 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
126a0 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26  (int)pPg->pgno &
126b0 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  & pPager->origDb
126c0 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53  Size<pPager->dbS
126d0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
126e0 49 66 20 74 68 69 73 20 70 61 67 65 73 20 69 73  If this pages is
126f0 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
12700 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74  n the file and t
12710 68 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77  he file has grow
12720 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e  n.      ** durin
12730 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  g the current tr
12740 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
12750 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20  do NOT mark the 
12760 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20  page as clean.. 
12770 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65       ** When the
12780 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 67   database file g
12790 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61  rows, we must ma
127a0 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
127b0 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20 20   last page.     
127c0 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e   ** gets written
127d0 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73   at least once s
127e0 6f 20 74 68 61 74 20 74 68 65 20 64 69 73 6b 20  o that the disk 
127f0 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65  file will be the
12800 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a   correct.      *
12810 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64  * size. If you d
12820 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73  o not write this
12830 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 73 69   page and the si
12840 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20  ze of the file. 
12850 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64       ** on the d
12860 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e  isk ends up bein
12870 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61  g too small, tha
12880 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  t can lead to da
12890 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
128a0 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e  corruption durin
128b0 67 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73  g the next trans
128c0 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
128d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
128e0 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 57    TRACE3("DONT_W
128f0 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20  RITE page %d of 
12900 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20 70 50 61  %d\n", pgno, pPa
12910 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20 20  ger->fd.h);.    
12920 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
12930 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
12940 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
12950 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
12960 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
12970 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   if a rollback o
12980 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20  ccurs,.** it is 
12990 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
129a0 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
129b0 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  a on the given p
129c0 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65  age.  This.** me
129d0 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
129e0 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  er does not have
129f0 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67   to record the g
12a00 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65  iven page in the
12a10 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  .** rollback jou
12a20 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  rnal..*/.void sq
12a30 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f  lite3pager_dont_
12a40 72 6f 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  rollback(void *p
12a50 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
12a60 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
12a70 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61  HDR(pData);.  Pa
12a80 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
12a90 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 69 66  g->pPager;..  if
12aa0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
12ab0 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
12ac0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
12ad0 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74  nalOpen==0 ) ret
12ae0 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  urn;.  if( pPg->
12af0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c  alwaysRollback |
12b00 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73  | pPager->always
12b10 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67  Rollback || pPag
12b20 65 72 2d 3e 6d 65 6d 44 62 20 29 20 72 65 74 75  er->memDb ) retu
12b30 72 6e 3b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e  rn;.  if( !pPg->
12b40 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e  inJournal && (in
12b50 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70  t)pPg->pgno <= p
12b60 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
12b70 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
12b80 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
12b90 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  nal!=0 );.    pP
12ba0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
12bb0 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
12bc0 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
12bd0 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  );.    pPg->inJo
12be0 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 69  urnal = 1;.    i
12bf0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
12c00 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 70 50  nUse ){.      pP
12c10 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
12c20 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
12c30 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
12c40 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74        page_add_t
12c50 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
12c60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43  ;.    }.    TRAC
12c70 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43  E3("DONT_ROLLBAC
12c80 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c  K page %d of %d\
12c90 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  n", pPg->pgno, p
12ca0 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20  Pager->fd.h);.  
12cb0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
12cc0 73 74 6d 74 49 6e 55 73 65 20 26 26 20 21 70 50  stmtInUse && !pP
12cd0 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28 69 6e  g->inStmt && (in
12ce0 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61  t)pPg->pgno<=pPa
12cf0 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 7b  ger->stmtSize ){
12d00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
12d10 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28  ->inJournal || (
12d20 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50  int)pPg->pgno>pP
12d30 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
12d40 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12d50 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21  pPager->aInStmt!
12d60 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
12d70 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70  ->aInStmt[pPg->p
12d80 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
12d90 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
12da0 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
12db0 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 7d 0a  _list(pPg);.  }.
12dc0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  }.../*.** Clear 
12dd0 61 20 50 67 48 69 73 74 6f 72 79 20 62 6c 6f 63  a PgHistory bloc
12de0 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  k.*/.static void
12df0 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 67   clearHistory(Pg
12e00 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 29 7b  History *pHist){
12e10 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48  .  sqliteFree(pH
12e20 69 73 74 2d 3e 70 4f 72 69 67 29 3b 0a 20 20 73  ist->pOrig);.  s
12e30 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d  qliteFree(pHist-
12e40 3e 70 53 74 6d 74 29 3b 0a 20 20 70 48 69 73 74  >pStmt);.  pHist
12e50 2d 3e 70 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70  ->pOrig = 0;.  p
12e60 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Hist->pStmt = 0;
12e70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
12e80 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20   all changes to 
12e90 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
12ea0 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
12eb0 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  te lock..**.** I
12ec0 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69  f the commit fai
12ed0 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f  ls for any reaso
12ee0 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74  n, a rollback at
12ef0 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a  tempt is made.**
12f00 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
12f10 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
12f20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77   If the commit w
12f30 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b  orked, SQLITE_OK
12f40 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
12f50 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
12f60 61 67 65 72 5f 63 6f 6d 6d 69 74 28 50 61 67 65  ager_commit(Page
12f70 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
12f80 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
12f90 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  Pg;..  if( pPage
12fa0 72 2d 3e 65 72 72 4d 61 73 6b 3d 3d 50 41 47 45  r->errMask==PAGE
12fb0 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20  R_ERR_FULL ){.  
12fc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
12fd0 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
12fe0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
12ff0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13000 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
13010 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20  _FULL;.    }.   
13020 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
13030 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
13040 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20  rMask!=0 ){.    
13050 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f  rc = pager_errco
13060 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  de(pPager);.    
13070 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
13080 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
13090 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45  te<PAGER_RESERVE
130a0 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
130b0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
130c0 7d 0a 20 20 54 52 41 43 45 32 28 22 43 4f 4d 4d  }.  TRACE2("COMM
130d0 49 54 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  IT %d\n", pPager
130e0 2d 3e 66 64 2e 68 29 3b 0a 20 20 69 66 28 20 70  ->fd.h);.  if( p
130f0 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
13100 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
13110 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
13120 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ges(pPager);.   
13130 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b 0a 20   while( pPg ){. 
13140 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72       clearHistor
13150 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  y(PGHDR_TO_HIST(
13160 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b 0a 20  pPg, pPager));. 
13170 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20       pPg->dirty 
13180 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
13190 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
131a0 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74       pPg->inStmt
131b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
131c0 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67  >pPrevStmt = pPg
131d0 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
131e0 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 67  .      pPg = pPg
131f0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a  ->pDirty;.    }.
13200 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
13210 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  t = 0;.    pPage
13220 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
13230 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74  _SHARED;.    ret
13240 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
13250 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
13260 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 29  >dirtyCache==0 )
13270 7b 0a 20 20 20 20 2f 2a 20 45 78 69 74 20 65 61  {.    /* Exit ea
13280 72 6c 79 20 28 77 69 74 68 6f 75 74 20 64 6f 69  rly (without doi
13290 6e 67 20 74 68 65 20 74 69 6d 65 2d 63 6f 6e 73  ng the time-cons
132a0 75 6d 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 53  uming sqlite3OsS
132b0 79 6e 63 28 29 20 63 61 6c 6c 73 29 0a 20 20 20  ync() calls).   
132c0 20 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 76   ** if there hav
132d0 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65  e been no change
132e0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
132f0 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61  e file. */.    a
13300 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
13310 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  eedSync==0 );.  
13320 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77    rc = pager_unw
13330 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
13340 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
13350 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72  Size = -1;.    r
13360 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
13370 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
13380 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 23  journalOpen );.#
13390 69 66 20 30 0a 20 20 72 63 20 3d 20 73 79 6e 63  if 0.  rc = sync
133a0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
133b0 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
133c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
133d0 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74  oto commit_abort
133e0 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20 70 61  ;.  }.  pPg = pa
133f0 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74  ger_get_all_dirt
13400 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29 3b  y_pages(pPager);
13410 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
13420 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
13430 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29  te_pagelist(pPg)
13440 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20  ;.    if( rc || 
13450 28 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  (!pPager->noSync
13460 20 26 26 20 73 71 6c 69 74 65 33 4f 73 53 79 6e   && sqlite3OsSyn
13470 63 28 26 70 50 61 67 65 72 2d 3e 66 64 29 21 3d  c(&pPager->fd)!=
13480 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20  SQLITE_OK) ){.  
13490 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f      goto commit_
134a0 61 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  abort;.    }.  }
134b0 0a 23 65 6e 64 69 66 0a 20 20 72 63 20 3d 20 73  .#endif.  rc = s
134c0 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e 63  qlite3pager_sync
134d0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 69  (pPager, 0);.  i
134e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
134f0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 6f 6d   ){.    goto com
13500 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20 7d 0a 20  mit_abort;.  }. 
13510 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
13520 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
13530 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
13540 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e  e = -1;.  return
13550 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20   rc;..  /* Jump 
13560 68 65 72 65 20 69 66 20 61 6e 79 74 68 69 6e 67  here if anything
13570 20 67 6f 65 73 20 77 72 6f 6e 67 20 64 75 72 69   goes wrong duri
13580 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72  ng the commit pr
13590 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d  ocess..  */.comm
135a0 69 74 5f 61 62 6f 72 74 3a 0a 20 20 72 63 20 3d  it_abort:.  rc =
135b0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
135c0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
135d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
135e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
135f0 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d  SQLITE_FULL;.  }
13600 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13610 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
13620 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20 54 68  all changes.  Th
13630 65 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73  e database falls
13640 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53   back to PAGER_S
13650 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41  HARED mode..** A
13660 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  ll in-memory cac
13670 68 65 20 70 61 67 65 73 20 72 65 76 65 72 74 20  he pages revert 
13680 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61  to their origina
13690 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e  l data contents.
136a0 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
136b0 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a  is deleted..**.*
136c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
136d0 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73  annot fail unles
136e0 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  s some other pro
136f0 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c  cess is not foll
13700 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72  owing.** the cor
13710 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f  rect locking pro
13720 74 6f 63 6f 6c 20 28 53 51 4c 49 54 45 5f 50 52  tocol (SQLITE_PR
13730 4f 54 4f 43 4f 4c 29 20 6f 72 20 75 6e 6c 65 73  OTOCOL) or unles
13740 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  s some other.** 
13750 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69  process is writi
13760 6e 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68  ng trash into th
13770 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
13780 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20  SQLITE_CORRUPT) 
13790 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70  or.** unless a p
137a0 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61  rior malloc() fa
137b0 69 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d  iled (SQLITE_NOM
137c0 45 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74  EM).  Appropriat
137d0 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73  e error.** codes
137e0 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f   are returned fo
137f0 72 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61  r all these occa
13800 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73  sions.  Otherwis
13810 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  e,.** SQLITE_OK 
13820 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
13830 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
13840 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  _rollback(Pager 
13850 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
13860 72 63 3b 0a 20 20 54 52 41 43 45 32 28 22 52 4f  rc;.  TRACE2("RO
13870 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 70 50  LLBACK %d\n", pP
13880 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 69  ager->fd.h);.  i
13890 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  f( pPager->memDb
138a0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
138b0 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67  ;.    for(p=pPag
138c0 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70  er->pAll; p; p=p
138d0 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
138e0 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
138f0 69 73 74 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ist;.      if( !
13900 70 2d 3e 64 69 72 74 79 20 29 20 63 6f 6e 74 69  p->dirty ) conti
13910 6e 75 65 3b 0a 20 20 20 20 20 20 70 48 69 73 74  nue;.      pHist
13920 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
13930 28 70 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  (p, pPager);.   
13940 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f     if( pHist->pO
13950 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  rig ){.        m
13960 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44  emcpy(PGHDR_TO_D
13970 41 54 41 28 70 29 2c 20 70 48 69 73 74 2d 3e 70  ATA(p), pHist->p
13980 4f 72 69 67 2c 20 70 50 61 67 65 72 2d 3e 70 61  Orig, pPager->pa
13990 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
139a0 20 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43   TRACE2("ROLLBAC
139b0 4b 2d 50 41 47 45 20 25 64 5c 6e 22 2c 20 70 2d  K-PAGE %d\n", p-
139c0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 65  >pgno);.      }e
139d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 54 52 41  lse{.        TRA
139e0 43 45 32 28 22 50 41 47 45 20 25 64 20 69 73 20  CE2("PAGE %d is 
139f0 63 6c 65 61 6e 5c 6e 22 2c 20 70 2d 3e 70 67 6e  clean\n", p->pgn
13a00 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  o);.      }.    
13a10 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70    clearHistory(p
13a20 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  Hist);.      p->
13a30 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  dirty = 0;.     
13a40 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20   p->inJournal = 
13a50 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 53 74  0;.      p->inSt
13a60 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  mt = 0;.      p-
13a70 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 2d 3e  >pPrevStmt = p->
13a80 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20  pNextStmt = 0;. 
13a90 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
13aa0 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  >pStmt = 0;.    
13ab0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
13ac0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
13ad0 69 7a 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54  ize;.    memoryT
13ae0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b  runcate(pPager);
13af0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
13b00 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20  tInUse = 0;.    
13b10 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
13b20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
13b30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13b40 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  OK;.  }..  if( !
13b50 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
13b60 68 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a  he || !pPager->j
13b70 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
13b80 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77    rc = pager_unw
13b90 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
13ba0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
13bb0 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72  Size = -1;.    r
13bc0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
13bd0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
13be0 4d 61 73 6b 21 3d 30 20 26 26 20 70 50 61 67 65  Mask!=0 && pPage
13bf0 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 50 41 47 45  r->errMask!=PAGE
13c00 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20  R_ERR_FULL ){.  
13c10 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
13c20 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
13c30 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70 61  SIVE ){.      pa
13c40 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
13c50 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  ger, 1);.    }. 
13c60 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
13c70 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
13c80 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
13c90 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
13ca0 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
13cb0 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 72 63 20  int rc2;.    rc 
13cc0 3d 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63  = pager_reload_c
13cd0 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20  ache(pPager);.  
13ce0 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f 75 6e    rc2 = pager_un
13cf0 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
13d00 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
13d10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13d20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
13d30 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
13d40 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
13d50 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  ck(pPager, 1);. 
13d60 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
13d70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
13d80 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
13d90 54 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  T;.    pPager->e
13da0 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f  rrMask |= PAGER_
13db0 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d  ERR_CORRUPT;.  }
13dc0 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
13dd0 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e  e = -1;.  return
13de0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
13df0 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
13e00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
13e10 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e  s opened read-on
13e20 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  ly.  Return FALS
13e30 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61  E.** if the data
13e40 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f  base is (in theo
13e50 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f  ry) writable..*/
13e60 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
13e70 72 5f 69 73 72 65 61 64 6f 6e 6c 79 28 50 61 67  r_isreadonly(Pag
13e80 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
13e90 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65  eturn pPager->re
13ea0 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  adOnly;.}../*.**
13eb0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
13ec0 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
13ed0 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
13ee0 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c  nly..*/.int *sql
13ef0 69 74 65 33 70 61 67 65 72 5f 73 74 61 74 73 28  ite3pager_stats(
13f00 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
13f10 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b 39    static int a[9
13f20 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61 67  ];.  a[0] = pPag
13f30 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d  er->nRef;.  a[1]
13f40 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65   = pPager->nPage
13f50 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61 67 65  ;.  a[2] = pPage
13f60 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33  r->mxPage;.  a[3
13f70 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ] = pPager->dbSi
13f80 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61  ze;.  a[4] = pPa
13f90 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b  ger->state;.  a[
13fa0 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  5] = pPager->err
13fb0 4d 61 73 6b 3b 0a 20 20 61 5b 36 5d 20 3d 20 70  Mask;.  a[6] = p
13fc0 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61  Pager->nHit;.  a
13fd0 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d  [7] = pPager->nM
13fe0 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 70 50  iss;.  a[8] = pP
13ff0 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 72  ager->nOvfl;.  r
14000 65 74 75 72 6e 20 61 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn a;.}../*.*
14010 2a 20 53 65 74 20 74 68 65 20 73 74 61 74 65 6d  * Set the statem
14020 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69  ent rollback poi
14030 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  nt..**.** This r
14040 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65  outine should be
14050 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65   called with the
14060 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
14070 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20  rnal already.** 
14080 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73 74 61  open.  A new sta
14090 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
140a0 73 20 63 72 65 61 74 65 64 20 74 68 61 74 20 63  s created that c
140b0 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72 6f  an be used to ro
140c0 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65  llback.** change
140d0 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53 51  s of a single SQ
140e0 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e  L command within
140f0 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73 61   a larger transa
14100 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
14110 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f  lite3pager_stmt_
14120 62 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61  begin(Pager *pPa
14130 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
14140 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c    char zTemp[SQL
14150 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a  ITE_TEMPNAME_SIZ
14160 45 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  E];.  assert( !p
14170 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
14180 20 29 3b 0a 20 20 54 52 41 43 45 32 28 22 53 54   );.  TRACE2("ST
14190 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22 2c 20  MT-BEGIN %d\n", 
141a0 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20  pPager->fd.h);. 
141b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d   if( pPager->mem
141c0 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  Db ){.    pPager
141d0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b  ->stmtInUse = 1;
141e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
141f0 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  tSize = pPager->
14200 64 62 53 69 7a 65 3b 0a 20 20 20 20 72 65 74 75  dbSize;.    retu
14210 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
14220 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  }.  if( !pPager-
14230 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
14240 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
14250 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20  Autoopen = 1;.  
14260 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14270 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OK;.  }.  assert
14280 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
14290 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 50 61 67 65  lOpen );.  pPage
142a0 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 73 71 6c  r->aInStmt = sql
142b0 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65  iteMalloc( pPage
142c0 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20  r->dbSize/8 + 1 
142d0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
142e0 3e 61 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20  >aInStmt==0 ){. 
142f0 20 20 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b     sqlite3OsLock
14300 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48  (&pPager->fd, SH
14310 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
14320 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
14330 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  MEM;.  }.#ifndef
14340 20 4e 44 45 42 55 47 0a 20 20 72 63 20 3d 20 73   NDEBUG.  rc = s
14350 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
14360 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  (&pPager->jfd, &
14370 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
14380 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  e);.  if( rc ) g
14390 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66  oto stmt_begin_f
143a0 61 69 6c 65 64 3b 0a 20 20 61 73 73 65 72 74 28  ailed;.  assert(
143b0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
143c0 7a 65 20 3d 3d 20 0a 20 20 20 20 70 50 61 67 65  ze == .    pPage
143d0 72 2d 3e 6e 52 65 63 2a 4a 4f 55 52 4e 41 4c 5f  r->nRec*JOURNAL_
143e0 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20  PG_SZ(pPager) + 
143f0 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
14400 50 61 67 65 72 29 20 29 3b 0a 23 65 6e 64 69 66  Pager) );.#endif
14410 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  .  pPager->stmtJ
14420 53 69 7a 65 20 3d 0a 20 20 20 20 20 70 50 61 67  Size =.     pPag
14430 65 72 2d 3e 6e 52 65 63 2a 4a 4f 55 52 4e 41 4c  er->nRec*JOURNAL
14440 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20 2b  _PG_SZ(pPager) +
14450 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
14460 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
14470 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50  r->stmtSize = pP
14480 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
14490 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d  if( !pPager->stm
144a0 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  tOpen ){.    rc 
144b0 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f  = sqlite3pager_o
144c0 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26  pentemp(zTemp, &
144d0 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20  pPager->stfd);. 
144e0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
144f0 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c   stmt_begin_fail
14500 65 64 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ed;.    pPager->
14510 73 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  stmtOpen = 1;.  
14520 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
14530 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50  ec = 0;.  }.  pP
14540 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
14550 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
14560 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f  LITE_OK;. .stmt_
14570 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20  begin_failed:.  
14580 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  if( pPager->aInS
14590 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  tmt ){.    sqlit
145a0 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49  eFree(pPager->aI
145b0 6e 53 74 6d 74 29 3b 0a 20 20 20 20 70 50 61 67  nStmt);.    pPag
145c0 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b  er->aInStmt = 0;
145d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
145e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
145f0 74 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  t a statement..*
14600 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
14610 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 50  er_stmt_commit(P
14620 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
14630 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
14640 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 67  tInUse ){.    Pg
14650 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74  Hdr *pPg, *pNext
14660 3b 0a 20 20 20 20 54 52 41 43 45 32 28 22 53 54  ;.    TRACE2("ST
14670 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c  MT-COMMIT %d\n",
14680 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a   pPager->fd.h);.
14690 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
146a0 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20  >memDb ){.      
146b0 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
146c0 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b  Pager->stfd, 0);
146d0 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  .      /* sqlite
146e0 33 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50 61  3OsTruncate(&pPa
146f0 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a  ger->stfd, 0); *
14700 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  /.      sqliteFr
14710 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  ee( pPager->aInS
14720 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50 61  tmt );.      pPa
14730 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30  ger->aInStmt = 0
14740 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
14750 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d  pPg=pPager->pStm
14760 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78  t; pPg; pPg=pNex
14770 74 29 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20  t){.      pNext 
14780 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  = pPg->pNextStmt
14790 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
147a0 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20  pPg->inStmt );. 
147b0 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74       pPg->inStmt
147c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
147d0 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67  >pPrevStmt = pPg
147e0 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
147f0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
14800 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
14810 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
14820 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
14830 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
14840 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
14850 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74  eFree(pHist->pSt
14860 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69  mt);.        pHi
14870 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  st->pStmt = 0;. 
14880 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
14890 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
148a0 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  c = 0;.    pPage
148b0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
148c0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  ;.    pPager->pS
148d0 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  tmt = 0;.  }.  p
148e0 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
148f0 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  pen = 0;.  retur
14900 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
14910 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
14920 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69   statement..*/.i
14930 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
14940 73 74 6d 74 5f 72 6f 6c 6c 62 61 63 6b 28 50 61  stmt_rollback(Pa
14950 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
14960 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50  int rc;.  if( pP
14970 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
14980 29 7b 0a 20 20 20 20 54 52 41 43 45 32 28 22 53  ){.    TRACE2("S
14990 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c  TMT-ROLLBACK %d\
149a0 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68  n", pPager->fd.h
149b0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
149c0 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
149d0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
149e0 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
149f0 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20  er->pStmt; pPg; 
14a00 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 53 74  pPg=pPg->pNextSt
14a10 6d 74 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48  mt){.        PgH
14a20 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
14a30 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
14a40 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
14a50 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70      if( pHist->p
14a60 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Stmt ){.        
14a70 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54    memcpy(PGHDR_T
14a80 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 48 69  O_DATA(pPg), pHi
14a90 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65  st->pStmt, pPage
14aa0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
14ab0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
14ac0 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29  ee(pHist->pStmt)
14ad0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48 69 73  ;.          pHis
14ae0 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t->pStmt = 0;.  
14af0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
14b00 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
14b10 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73  Size = pPager->s
14b20 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20 20 20 6d  tmtSize;.      m
14b30 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50  emoryTruncate(pP
14b40 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20  ager);.      rc 
14b50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
14b60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
14b70 20 3d 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c   = pager_stmt_pl
14b80 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  ayback(pPager);.
14b90 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
14ba0 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d  3pager_stmt_comm
14bb0 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65  it(pPager);.  }e
14bc0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
14bd0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
14be0 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
14bf0 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  pen = 0;.  retur
14c00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
14c10 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70  eturn the full p
14c20 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  athname of the d
14c30 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
14c40 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
14c50 69 74 65 33 70 61 67 65 72 5f 66 69 6c 65 6e 61  ite3pager_filena
14c60 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
14c70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
14c80 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d  er->zFilename;.}
14c90 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
14ca0 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20 70  codec for this p
14cb0 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ager.*/.void sql
14cc0 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 63 6f  ite3pager_set_co
14cd0 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50  dec(.  Pager *pP
14ce0 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 28 2a 78  ager,.  void (*x
14cf0 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
14d00 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20  d*,Pgno,int),.  
14d10 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a  void *pCodecArg.
14d20 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  ){.  pPager->xCo
14d30 64 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20  dec = xCodec;.  
14d40 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72  pPager->pCodecAr
14d50 67 20 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d  g = pCodecArg;.}
14d60 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
14d70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
14d80 6f 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61  or the pager pPa
14d90 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  ger. zMaster poi
14da0 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a  nts to the name.
14db0 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  ** of a master j
14dc0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
14dd0 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
14de0 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69  en into the indi
14df0 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61  vidual.** journa
14e00 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20  l file. zMaster 
14e10 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69  may be NULL, whi
14e20 63 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  ch is interprete
14e30 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a  d as no master.*
14e40 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e  * journal (a sin
14e50 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
14e60 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
14e70 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
14e80 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6a  sures that the j
14e90 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
14ea0 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  , all dirty page
14eb0 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20  s written.** to 
14ec0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14ed0 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
14ee0 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20  se file synced. 
14ef0 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74  The only thing t
14f00 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74  hat.** remains t
14f10 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  o commit the tra
14f20 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64  nsaction is to d
14f30 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
14f40 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61  l file (or.** ma
14f50 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
14f60 65 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e  e if specified).
14f70 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
14f80 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c   if zMaster==NUL
14f90 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74  L, this does not
14fa0 20 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65   overwrite a pre
14fb0 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70  vious value.** p
14fc0 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69  assed to an sqli
14fd0 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28 29 20  te3pager_sync() 
14fe0 63 61 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  call..*/.int sql
14ff0 69 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28 50  ite3pager_sync(P
15000 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
15010 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
15020 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
15030 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
15040 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  If this is an in
15050 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e  -memory db, or n
15060 6f 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65  o pages have bee
15070 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 74 68  n written to, th
15080 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
15090 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
150a0 2f 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  /.  if( !pPager-
150b0 3e 6d 65 6d 44 62 20 26 26 20 70 50 61 67 65 72  >memDb && pPager
150c0 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b 0a  ->dirtyCache ){.
150d0 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
150e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
150f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
15100 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20  );..    /* Sync 
15110 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
15120 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 79 6e   */.    rc = syn
15130 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  cJournal(pPager,
15140 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 69   zMaster);.    i
15150 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15160 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
15170 74 3b 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  t;..    /* Write
15180 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
15190 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
151a0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67   file */.    pPg
151b0 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c   = pager_get_all
151c0 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61  _dirty_pages(pPa
151d0 67 65 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  ger);.    rc = p
151e0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
151f0 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 69 66  ist(pPg);.    if
15200 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15210 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
15220 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79  ;..    /* If any
15230 20 70 61 67 65 73 20 77 65 72 65 20 61 63 74 75   pages were actu
15240 61 6c 6c 79 20 77 72 69 74 74 65 6e 2c 20 73 79  ally written, sy
15250 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
15260 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  file */.    if( 
15270 70 50 67 20 26 26 20 21 70 50 61 67 65 72 2d 3e  pPg && !pPager->
15280 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
15290 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
152a0 6e 63 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b  nc(&pPager->fd);
152b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 79 6e 63  .    }.  }..sync
152c0 5f 65 78 69 74 3a 0a 20 20 72 65 74 75 72 6e 20  _exit:.  return 
152d0 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
152e0 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
152f0 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
15300 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65  ent state of the
15310 20 66 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74   file lock for t
15320 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a  he given pager..
15330 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
15340 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f  lue is one of NO
15350 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
15360 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
15370 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f  K,.** PENDING_LO
15380 43 4b 2c 20 6f 72 20 45 58 43 4c 55 53 49 56 45  CK, or EXCLUSIVE
15390 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _LOCK..*/.int sq
153a0 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 63 6b 73  lite3pager_locks
153b0 74 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  tate(Pager *pPag
153c0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
153d0 61 67 65 72 2d 3e 66 64 2e 6c 6f 63 6b 74 79 70  ager->fd.locktyp
153e0 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  e;.}.#endif..#if
153f0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
15400 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69  /*.** Print a li
15410 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66  sting of all ref
15420 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e  erenced pages an
15430 64 20 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e  d their ref coun
15440 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
15450 65 33 70 61 67 65 72 5f 72 65 66 64 75 6d 70 28  e3pager_refdump(
15460 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
15470 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
15480 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
15490 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
154a0 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
154b0 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66     if( pPg->nRef
154c0 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  <=0 ) continue;.
154d0 20 20 20 20 70 72 69 6e 74 66 28 22 50 41 47 45      printf("PAGE
154e0 20 25 33 64 20 61 64 64 72 3d 30 78 25 30 38 78   %3d addr=0x%08x
154f0 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20   nRef=%d\n", .  
15500 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20       pPg->pgno, 
15510 28 69 6e 74 29 50 47 48 44 52 5f 54 4f 5f 44 41  (int)PGHDR_TO_DA
15520 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52  TA(pPg), pPg->nR
15530 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ef);.  }.}.#endi
15540 66 0a                                            f.