/ Hex Artifact Content
Login

Artifact ee2e2fa71584ce402e0266b342f96efbf74cb45f:


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: 35 20 32 30 30 34 2f 30 36 2f 30 39 20 31 37 3a  5 2004/06/09 17:
0360: 33 37 3a 32 38 20 64 72 68 20 45 78 70 20 24 0a  37:28 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 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
2a90: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 70 61  file contains pa
2aa0: 67 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68  ge records in th
2ab0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 66  e following.** f
2ac0: 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 41 63 74  ormat..**.** Act
2ad0: 75 61 6c 6c 79 2c 20 74 68 69 73 20 73 74 72 75  ually, this stru
2ae0: 63 74 75 72 65 20 69 73 20 74 68 65 20 63 6f 6d  cture is the com
2af0: 70 6c 65 74 65 20 70 61 67 65 20 72 65 63 6f 72  plete page recor
2b00: 64 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 66  d for pager.** f
2b10: 6f 72 6d 61 74 73 20 6c 65 73 73 20 74 68 61 6e  ormats less than
2b20: 20 33 2e 20 20 42 65 67 69 6e 6e 69 6e 67 20 77   3.  Beginning w
2b30: 69 74 68 20 66 6f 72 6d 61 74 20 33 2c 20 74 68  ith format 3, th
2b40: 69 73 20 72 65 63 6f 72 64 20 69 73 20 73 75 72  is record is sur
2b50: 72 6f 75 6e 64 65 64 0a 2a 2a 20 62 79 20 74 77  rounded.** by tw
2b60: 6f 20 63 68 65 63 6b 73 75 6d 73 2e 0a 2a 2f 0a  o checksums..*/.
2b70: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
2b80: 61 67 65 52 65 63 6f 72 64 20 50 61 67 65 52 65  ageRecord PageRe
2b90: 63 6f 72 64 3b 0a 73 74 72 75 63 74 20 50 61 67  cord;.struct Pag
2ba0: 65 52 65 63 6f 72 64 20 7b 0a 20 20 50 67 6e 6f  eRecord {.  Pgno
2bb0: 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2bd0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  he page number *
2be0: 2f 0a 20 20 63 68 61 72 20 61 44 61 74 61 5b 53  /.  char aData[S
2bf0: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 5d  QLITE_PAGE_SIZE]
2c00: 3b 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20  ;   /* Original 
2c10: 64 61 74 61 20 66 6f 72 20 70 61 67 65 20 70 67  data for page pg
2c20: 6e 6f 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  no */.};../*.** 
2c30: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
2c40: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
2c50: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
2c60: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
2c70: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
2c80: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
2c90: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
2ca0: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
2cb0: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  eck..**.** There
2cc0: 20 61 72 65 20 74 68 72 65 65 20 6a 6f 75 72 6e   are three journ
2cd0: 61 6c 20 66 6f 72 6d 61 74 73 20 28 73 6f 20 66  al formats (so f
2ce0: 61 72 29 2e 20 54 68 65 20 31 73 74 20 6a 6f 75  ar). The 1st jou
2cf0: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 77 72 69 74  rnal format writ
2d00: 65 73 0a 2a 2a 20 33 32 2d 62 69 74 20 69 6e 74  es.** 32-bit int
2d10: 65 67 65 72 73 20 69 6e 20 74 68 65 20 62 79 74  egers in the byt
2d20: 65 2d 6f 72 64 65 72 20 6f 66 20 74 68 65 20 68  e-order of the h
2d30: 6f 73 74 20 6d 61 63 68 69 6e 65 2e 20 20 4e 65  ost machine.  Ne
2d40: 77 0a 2a 2a 20 66 6f 72 6d 61 74 73 20 77 72 69  w.** formats wri
2d50: 74 65 73 20 69 6e 74 65 67 65 72 73 20 61 73 20  tes integers as 
2d60: 62 69 67 2d 65 6e 64 69 61 6e 2e 20 20 41 6c 6c  big-endian.  All
2d70: 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 73 20 75 73   new journals us
2d80: 65 20 74 68 65 0a 2a 2a 20 6e 65 77 20 66 6f 72  e the.** new for
2d90: 6d 61 74 2c 20 62 75 74 20 77 65 20 68 61 76 65  mat, but we have
2da0: 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 72   to be able to r
2db0: 65 61 64 20 61 6e 20 6f 6c 64 65 72 20 6a 6f 75  ead an older jou
2dc0: 72 6e 61 6c 20 69 6e 20 6f 72 64 65 72 0a 2a 2a  rnal in order.**
2dd0: 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75   to rollback jou
2de0: 72 6e 61 6c 73 20 63 72 65 61 74 65 64 20 62 79  rnals created by
2df0: 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20   older versions 
2e00: 6f 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a  of the library..
2e10: 2a 2a 0a 2a 2a 20 54 68 65 20 33 72 64 20 6a 6f  **.** The 3rd jo
2e20: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 28 61 64  urnal format (ad
2e30: 64 65 64 20 66 6f 72 20 32 2e 38 2e 30 29 20 61  ded for 2.8.0) a
2e40: 64 64 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73  dds additional s
2e50: 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e  anity.** checkin
2e60: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  g information to
2e70: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
2e80: 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c  f the power fail
2e90: 73 20 77 68 69 6c 65 20 74 68 65 0a 2a 2a 20 6a  s while the.** j
2ea0: 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20  ournal is being 
2eb0: 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61  written, semi-ra
2ec0: 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74  ndom garbage dat
2ed0: 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69  a might appear i
2ee0: 6e 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n.** the journal
2ef0: 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65   file after powe
2f00: 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20  r is restored.  
2f10: 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  If an attempt is
2f20: 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f   then made.** to
2f30: 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61   roll the journa
2f40: 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  l back, the data
2f50: 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f  base could be co
2f60: 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64  rrupted.  The ad
2f70: 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69  ditional.** sani
2f80: 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61  ty checking data
2f90: 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74   is an attempt t
2fa0: 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67  o discover the g
2fb0: 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  arbage in the.**
2fc0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e   journal and ign
2fd0: 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ore it..**.** Th
2fe0: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
2ff0: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
3000: 72 20 74 68 65 20 33 72 64 20 6a 6f 75 72 6e 61  r the 3rd journa
3010: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74  l format consist
3020: 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74  s.** of a 32-bit
3030: 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63   checksum on eac
3040: 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20  h page of data. 
3050: 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f   The checksum co
3060: 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65  vers both.** the
3070: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
3080: 20 74 68 65 20 53 51 4c 49 54 45 5f 50 41 47 45   the SQLITE_PAGE
3090: 5f 53 49 5a 45 20 62 79 74 65 73 20 6f 66 20 64  _SIZE bytes of d
30a0: 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65  ata for the page
30b0: 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20  ..** This cksum 
30c0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
30d0: 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f  o a 32-bit rando
30e0: 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70  m value that app
30f0: 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a  ears in the.** j
3100: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68  ournal file righ
3110: 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64  t after the head
3120: 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20  er.  The random 
3130: 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69  initializer is i
3140: 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63  mportant,.** bec
3150: 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74  ause garbage dat
3160: 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  a that appears a
3170: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a  t the end of a j
3180: 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79  ournal is likely
3190: 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61  .** data that wa
31a0: 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20  s once in other 
31b0: 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20  files that have 
31c0: 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64  now been deleted
31d0: 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72  .  If the.** gar
31e0: 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66  bage data came f
31f0: 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20  rom an obsolete 
3200: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
3210: 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68  e checksums migh
3220: 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e  t.** be correct.
3230: 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c    But by initial
3240: 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73  izing the checks
3250: 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c  um to random val
3260: 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64  ue which.** is d
3270: 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65  ifferent for eve
3280: 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d  ry journal, we m
3290: 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73  inimize that ris
32a0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  k..*/.static con
32b0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
32c0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 31 5b   aJournalMagic1[
32d0: 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78  ] = {.  0xd9, 0x
32e0: 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20  d5, 0x05, 0xf9, 
32f0: 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33  0x20, 0xa1, 0x63
3300: 2c 20 30 78 64 34 2c 0a 7d 3b 0a 73 74 61 74 69  , 0xd4,.};.stati
3310: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
3320: 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61   char aJournalMa
3330: 67 69 63 32 5b 5d 20 3d 20 7b 0a 20 20 30 78 64  gic2[] = {.  0xd
3340: 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30  9, 0xd5, 0x05, 0
3350: 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c  xf9, 0x20, 0xa1,
3360: 20 30 78 36 33 2c 20 30 78 64 35 2c 0a 7d 3b 0a   0x63, 0xd5,.};.
3370: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
3380: 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72  igned char aJour
3390: 6e 61 6c 4d 61 67 69 63 33 5b 5d 20 3d 20 7b 0a  nalMagic3[] = {.
33a0: 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78    0xd9, 0xd5, 0x
33b0: 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20  05, 0xf9, 0x20, 
33c0: 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 36  0xa1, 0x63, 0xd6
33d0: 2c 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 4a 4f 55  ,.};.#define JOU
33e0: 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 31 20 31 0a  RNAL_FORMAT_1 1.
33f0: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
3400: 46 4f 52 4d 41 54 5f 32 20 32 0a 23 64 65 66 69  FORMAT_2 2.#defi
3410: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41  ne JOURNAL_FORMA
3420: 54 5f 33 20 33 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  T_3 3../*.** The
3430: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 74 65 67   following integ
3440: 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  er determines wh
3450: 61 74 20 66 6f 72 6d 61 74 20 74 6f 20 75 73 65  at format to use
3460: 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 0a 2a   when creating.*
3470: 2a 20 6e 65 77 20 70 72 69 6d 61 72 79 20 6a 6f  * new primary jo
3480: 75 72 6e 61 6c 20 66 69 6c 65 73 2e 20 20 42 79  urnal files.  By
3490: 20 64 65 66 61 75 6c 74 20 77 65 20 61 6c 77 61   default we alwa
34a0: 79 73 20 75 73 65 20 66 6f 72 6d 61 74 20 33 2e  ys use format 3.
34b0: 0a 2a 2a 20 57 68 65 6e 20 74 65 73 74 69 6e 67  .** When testing
34c0: 2c 20 77 65 20 63 61 6e 20 73 65 74 20 74 68 69  , we can set thi
34d0: 73 20 76 61 6c 75 65 20 74 6f 20 6f 6c 64 65 72  s value to older
34e0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 73   journal formats
34f0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20   in order to.** 
3500: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 6e  make sure that n
3510: 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  ewer versions of
3520: 20 74 68 65 20 6c 69 62 72 61 72 79 20 61 72 65   the library are
3530: 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63   able to rollbac
3540: 6b 20 6f 6c 64 65 72 0a 2a 2a 20 6a 6f 75 72 6e  k older.** journ
3550: 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  al files..**.** 
3560: 4e 6f 74 65 20 74 68 61 74 20 73 74 61 74 65 6d  Note that statem
3570: 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 61 6c 77  ent journals alw
3580: 61 79 73 20 75 73 65 20 66 6f 72 6d 61 74 20 32  ays use format 2
3590: 20 61 6e 64 20 6f 6d 69 74 20 74 68 65 20 68 65   and omit the he
35a0: 61 64 65 72 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ader..*/.#ifdef 
35b0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
35c0: 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 20 3d  journal_format =
35d0: 20 33 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69   3;.#else.# defi
35e0: 6e 65 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61  ne journal_forma
35f0: 74 20 33 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  t 3.#endif../*.*
3600: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
3610: 65 20 68 65 61 64 65 72 20 61 6e 64 20 6f 66 20  e header and of 
3620: 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65  each page in the
3630: 20 6a 6f 75 72 6e 61 6c 20 76 61 72 69 65 73 20   journal varies 
3640: 61 63 63 6f 72 64 69 6e 67 0a 2a 2a 20 74 6f 20  according.** to 
3650: 77 68 69 63 68 20 6a 6f 75 72 6e 61 6c 20 66 6f  which journal fo
3660: 72 6d 61 74 20 69 73 20 62 65 69 6e 67 20 75 73  rmat is being us
3670: 65 64 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ed.  The followi
3680: 6e 67 20 6d 61 63 72 6f 73 20 66 69 67 75 72 65  ng macros figure
3690: 20 6f 75 74 0a 2a 2a 20 74 68 65 20 73 69 7a 65   out.** the size
36a0: 73 20 62 61 73 65 64 20 6f 6e 20 66 6f 72 6d 61  s based on forma
36b0: 74 20 6e 75 6d 62 65 72 73 2e 0a 2a 2f 0a 2f 2a  t numbers..*/./*
36c0: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
36d0: 5f 48 44 52 5f 53 5a 28 58 29 20 5c 0a 20 20 20  _HDR_SZ(X) \.   
36e0: 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  (sizeof(aJournal
36f0: 4d 61 67 69 63 31 29 20 2b 20 73 69 7a 65 6f 66  Magic1) + sizeof
3700: 28 50 67 6e 6f 29 20 2b 20 28 28 58 29 3e 3d 33  (Pgno) + ((X)>=3
3710: 29 2a 32 2a 73 69 7a 65 6f 66 28 75 33 32 29 29  )*2*sizeof(u32))
3720: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
3730: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
3740: 72 2c 20 58 29 20 28 5c 0a 20 20 20 73 69 7a 65  r, X) (\.   size
3750: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
3760: 31 29 20 2b 20 5c 0a 20 20 20 73 69 7a 65 6f 66  1) + \.   sizeof
3770: 28 50 67 6e 6f 29 20 2b 20 5c 0a 20 20 20 28 28  (Pgno) + \.   ((
3780: 58 29 3e 3d 33 3f 33 2a 73 69 7a 65 6f 66 28 75  X)>=3?3*sizeof(u
3790: 33 32 29 2b 28 70 50 61 67 65 72 29 2d 3e 6e 4d  32)+(pPager)->nM
37a0: 61 73 74 65 72 3a 30 29 20 29 0a 23 64 65 66 69  aster:0) ).#defi
37b0: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ne JOURNAL_PG_SZ
37c0: 28 58 29 20 5c 0a 20 20 20 28 53 51 4c 49 54 45  (X) \.   (SQLITE
37d0: 5f 50 41 47 45 5f 53 49 5a 45 20 2b 20 73 69 7a  _PAGE_SIZE + siz
37e0: 65 6f 66 28 50 67 6e 6f 29 20 2b 20 28 28 58 29  eof(Pgno) + ((X)
37f0: 3e 3d 33 29 2a 73 69 7a 65 6f 66 28 75 33 32 29  >=3)*sizeof(u32)
3800: 29 0a 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  ).../*.** Enable
3810: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
3820: 20 74 72 61 63 6b 69 6e 67 20 68 65 72 65 3a 0a   tracking here:.
3830: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
3840: 5f 54 45 53 54 0a 20 20 69 6e 74 20 70 61 67 65  _TEST.  int page
3850: 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c  r3_refinfo_enabl
3860: 65 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  e = 0;.  static 
3870: 76 6f 69 64 20 70 61 67 65 72 5f 72 65 66 69 6e  void pager_refin
3880: 66 6f 28 50 67 48 64 72 20 2a 70 29 7b 0a 20 20  fo(PgHdr *p){.  
3890: 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74    static int cnt
38a0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 70   = 0;.    if( !p
38b0: 61 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e  ager3_refinfo_en
38c0: 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  able ) return;. 
38d0: 20 20 20 70 72 69 6e 74 66 28 0a 20 20 20 20 20     printf(.     
38e0: 20 20 22 52 45 46 43 4e 54 3a 20 25 34 64 20 61    "REFCNT: %4d a
38f0: 64 64 72 3d 30 78 25 30 38 78 20 6e 52 65 66 3d  ddr=0x%08x nRef=
3900: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d  %d\n",.       p-
3910: 3e 70 67 6e 6f 2c 20 28 69 6e 74 29 50 47 48 44  >pgno, (int)PGHD
3920: 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d  R_TO_DATA(p), p-
3930: 3e 6e 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20  >nRef.    );.   
3940: 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d   cnt++;   /* Som
3950: 65 74 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20  ething to set a 
3960: 62 72 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f  breakpoint on */
3970: 0a 20 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45  .  }.# define RE
3980: 46 49 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f  FINFO(X)  pager_
3990: 72 65 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65  refinfo(X).#else
39a0: 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46  .# define REFINF
39b0: 4f 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  O(X).#endif../*.
39c0: 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74  ** Read a 32-bit
39d0: 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68   integer from th
39e0: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
39f0: 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20  criptor.  Store 
3a00: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74  the integer.** t
3a10: 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a  hat is read in *
3a20: 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  pRes.  Return SQ
3a30: 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
3a40: 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72  thing worked, or
3a50: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   an.** error cod
3a60: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
3a70: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
3a80: 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
3a90: 66 6f 72 6d 61 74 20 69 73 20 32 20 6f 72 20 33  format is 2 or 3
3aa0: 2c 20 72 65 61 64 20 61 20 62 69 67 2d 65 6e 64  , read a big-end
3ab0: 69 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 49 66  ian integer.  If
3ac0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
3ad0: 66 6f 72 6d 61 74 20 69 73 20 31 2c 20 72 65 61  format is 1, rea
3ae0: 64 20 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 20  d an integer in 
3af0: 74 68 65 20 6e 61 74 69 76 65 20 62 79 74 65 2d  the native byte-
3b00: 6f 72 64 65 72 20 6f 66 20 74 68 65 0a 2a 2a 20  order of the.** 
3b10: 68 6f 73 74 20 6d 61 63 68 69 6e 65 2e 0a 2a 2f  host machine..*/
3b20: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
3b30: 33 32 62 69 74 73 28 69 6e 74 20 66 6f 72 6d 61  32bits(int forma
3b40: 74 2c 20 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75  t, OsFile *fd, u
3b50: 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 33 32  32 *pRes){.  u32
3b60: 20 72 65 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   res;.  int rc;.
3b70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
3b80: 52 65 61 64 28 66 64 2c 20 26 72 65 73 2c 20 73  Read(fd, &res, s
3b90: 69 7a 65 6f 66 28 72 65 73 29 29 3b 0a 20 20 69  izeof(res));.  i
3ba0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
3bb0: 20 26 26 20 66 6f 72 6d 61 74 3e 4a 4f 55 52 4e   && format>JOURN
3bc0: 41 4c 5f 46 4f 52 4d 41 54 5f 31 20 29 7b 0a 20  AL_FORMAT_1 ){. 
3bd0: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
3be0: 20 61 63 5b 34 5d 3b 0a 20 20 20 20 6d 65 6d 63   ac[4];.    memc
3bf0: 70 79 28 61 63 2c 20 26 72 65 73 2c 20 34 29 3b  py(ac, &res, 4);
3c00: 0a 20 20 20 20 72 65 73 20 3d 20 28 61 63 5b 30  .    res = (ac[0
3c10: 5d 3c 3c 32 34 29 20 7c 20 28 61 63 5b 31 5d 3c  ]<<24) | (ac[1]<
3c20: 3c 31 36 29 20 7c 20 28 61 63 5b 32 5d 3c 3c 38  <16) | (ac[2]<<8
3c30: 29 20 7c 20 61 63 5b 33 5d 3b 0a 20 20 7d 0a 20  ) | ac[3];.  }. 
3c40: 20 2a 70 52 65 73 20 3d 20 72 65 73 3b 0a 20 20   *pRes = res;.  
3c50: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
3c60: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
3c70: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
3c80: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
3c90: 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75  escriptor.  Retu
3ca0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
3cb0: 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
3cc0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
3cd0: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
3ce0: 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ong..**.** If th
3cf0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  e journal format
3d00: 20 69 73 20 32 20 6f 72 20 33 2c 20 77 72 69 74   is 2 or 3, writ
3d10: 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 61 73  e the integer as
3d20: 20 34 20 62 69 67 2d 65 6e 64 69 61 6e 0a 2a 2a   4 big-endian.**
3d30: 20 62 79 74 65 73 2e 20 20 49 66 20 74 68 65 20   bytes.  If the 
3d40: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 69  journal format i
3d50: 73 20 31 2c 20 77 72 69 74 65 20 74 68 65 20 69  s 1, write the i
3d60: 6e 74 65 67 65 72 20 69 6e 20 74 68 65 20 6e 61  nteger in the na
3d70: 74 69 76 65 0a 2a 2a 20 62 79 74 65 20 6f 72 64  tive.** byte ord
3d80: 65 72 2e 20 20 49 6e 20 6e 6f 72 6d 61 6c 20 6f  er.  In normal o
3d90: 70 65 72 61 74 69 6f 6e 2c 20 6f 6e 6c 79 20 66  peration, only f
3da0: 6f 72 6d 61 74 73 20 32 20 61 6e 64 20 33 20 61  ormats 2 and 3 a
3db0: 72 65 20 75 73 65 64 2e 0a 2a 2a 20 4a 6f 75 72  re used..** Jour
3dc0: 6e 61 6c 20 66 6f 72 6d 61 74 20 31 20 69 73 20  nal format 1 is 
3dd0: 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 74 65  only used for te
3de0: 73 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  sting..*/.static
3df0: 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73   int write32bits
3e00: 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32  (OsFile *fd, u32
3e10: 20 76 61 6c 29 7b 0a 20 20 75 6e 73 69 67 6e 65   val){.  unsigne
3e20: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
3e30: 69 66 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d  if( journal_form
3e40: 61 74 3c 3d 31 20 29 7b 0a 20 20 20 20 72 65 74  at<=1 ){.    ret
3e50: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69  urn sqlite3OsWri
3e60: 74 65 28 66 64 2c 20 26 76 61 6c 2c 20 34 29 3b  te(fd, &val, 4);
3e70: 0a 20 20 7d 0a 20 20 61 63 5b 30 5d 20 3d 20 28  .  }.  ac[0] = (
3e80: 76 61 6c 3e 3e 32 34 29 20 26 20 30 78 66 66 3b  val>>24) & 0xff;
3e90: 0a 20 20 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e  .  ac[1] = (val>
3ea0: 3e 31 36 29 20 26 20 30 78 66 66 3b 0a 20 20 61  >16) & 0xff;.  a
3eb0: 63 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20  c[2] = (val>>8) 
3ec0: 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20  & 0xff;.  ac[3] 
3ed0: 3d 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 20 20  = val & 0xff;.  
3ee0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
3ef0: 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 29  Write(fd, ac, 4)
3f00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
3f10: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
3f20: 72 20 69 6e 74 6f 20 61 20 70 61 67 65 20 68 65  r into a page he
3f30: 61 64 65 72 20 72 69 67 68 74 20 62 65 66 6f 72  ader right befor
3f40: 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 64 61  e the.** page da
3f50: 74 61 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 6f  ta.  This will o
3f60: 76 65 72 77 72 69 74 65 20 74 68 65 20 50 67 48  verwrite the PgH
3f70: 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65  dr.pDirty pointe
3f80: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74  r..**.** The int
3f90: 65 67 65 72 20 69 73 20 62 69 67 2d 65 6e 64 69  eger is big-endi
3fa0: 61 6e 20 66 6f 72 20 66 6f 72 6d 61 74 73 20 32  an for formats 2
3fb0: 20 61 6e 64 20 33 20 61 6e 64 20 6e 61 74 69 76   and 3 and nativ
3fc0: 65 20 62 79 74 65 20 6f 72 64 65 72 0a 2a 2a 20  e byte order.** 
3fd0: 66 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  for journal form
3fe0: 61 74 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  at 1..*/.static 
3ff0: 76 6f 69 64 20 73 74 6f 72 65 33 32 62 69 74 73  void store32bits
4000: 28 75 33 32 20 76 61 6c 2c 20 50 67 48 64 72 20  (u32 val, PgHdr 
4010: 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b  *p, int offset){
4020: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
4030: 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26 28 28   *ac;.  ac = &((
4040: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 50  unsigned char*)P
4050: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 29  GHDR_TO_DATA(p))
4060: 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20  [offset];.  if( 
4070: 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 3c 3d  journal_format<=
4080: 31 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  1 ){.    memcpy(
4090: 61 63 2c 20 26 76 61 6c 2c 20 34 29 3b 0a 20 20  ac, &val, 4);.  
40a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 63 5b 30 5d  }else{.    ac[0]
40b0: 20 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26 20 30   = (val>>24) & 0
40c0: 78 66 66 3b 0a 20 20 20 20 61 63 5b 31 5d 20 3d  xff;.    ac[1] =
40d0: 20 28 76 61 6c 3e 3e 31 36 29 20 26 20 30 78 66   (val>>16) & 0xf
40e0: 66 3b 0a 20 20 20 20 61 63 5b 32 5d 20 3d 20 28  f;.    ac[2] = (
40f0: 76 61 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b 0a  val>>8) & 0xff;.
4100: 20 20 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20      ac[3] = val 
4110: 26 20 30 78 66 66 3b 0a 20 20 7d 0a 7d 0a 0a 0a  & 0xff;.  }.}...
4120: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68  /*.** Convert th
4130: 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 70 50  e bits in the pP
4140: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 69 6e  ager->errMask in
4150: 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 61 74 65  to an approprate
4160: 0a 2a 2a 20 72 65 74 75 72 6e 20 63 6f 64 65 2e  .** return code.
4170: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
4180: 61 67 65 72 5f 65 72 72 63 6f 64 65 28 50 61 67  ager_errcode(Pag
4190: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
41a0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
41b0: 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
41c0: 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52  >errMask & PAGER
41d0: 5f 45 52 52 5f 4c 4f 43 4b 20 29 20 20 20 20 72  _ERR_LOCK )    r
41e0: 63 20 3d 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f  c = SQLITE_PROTO
41f0: 43 4f 4c 3b 0a 20 20 69 66 28 20 70 50 61 67 65  COL;.  if( pPage
4200: 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47  r->errMask & PAG
4210: 45 52 5f 45 52 52 5f 44 49 53 4b 20 29 20 20 20  ER_ERR_DISK )   
4220: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
4230: 52 52 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  RR;.  if( pPager
4240: 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45  ->errMask & PAGE
4250: 52 5f 45 52 52 5f 46 55 4c 4c 20 29 20 20 20 20  R_ERR_FULL )    
4260: 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
4270: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
4280: 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f  errMask & PAGER_
4290: 45 52 52 5f 4d 45 4d 20 29 20 20 20 20 20 72 63  ERR_MEM )     rc
42a0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
42b0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
42c0: 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45  rrMask & PAGER_E
42d0: 52 52 5f 43 4f 52 52 55 50 54 20 29 20 72 63 20  RR_CORRUPT ) rc 
42e0: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
42f0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
4300: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72  ../*.** Add or r
4310: 65 6d 6f 76 65 20 61 20 70 61 67 65 20 66 72 6f  emove a page fro
4320: 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  m the list of al
4330: 6c 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  l pages that are
4340: 20 69 6e 20 74 68 65 0a 2a 2a 20 73 74 61 74 65   in the.** state
4350: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ment journal..**
4360: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 20 6b 65  .** The Pager ke
4370: 65 70 73 20 61 20 73 65 70 61 72 61 74 65 20 6c  eps a separate l
4380: 69 73 74 20 6f 66 20 70 61 67 65 73 20 74 68 61  ist of pages tha
4390: 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  t are currently 
43a0: 69 6e 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 6d  in.** the statem
43b0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ent journal.  Th
43c0: 69 73 20 68 65 6c 70 73 20 74 68 65 20 73 71 6c  is helps the sql
43d0: 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63  ite3pager_stmt_c
43e0: 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69  ommit().** routi
43f0: 6e 65 20 72 75 6e 20 4d 55 43 48 20 66 61 73 74  ne run MUCH fast
4400: 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  er for the commo
4410: 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65  n case where the
4420: 72 65 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70  re are many.** p
4430: 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62  ages in memory b
4440: 75 74 20 6f 6e 6c 79 20 61 20 66 65 77 20 61 72  ut only a few ar
4450: 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  e in the stateme
4460: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73  nt journal..*/.s
4470: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f  tatic void page_
4480: 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
4490: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
44a0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
44b0: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
44c0: 66 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29  f( pPg->inStmt )
44d0: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
44e0: 74 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d  t( pPg->pPrevStm
44f0: 74 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 4e 65  t==0 && pPg->pNe
4500: 78 74 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 70  xtStmt==0 );.  p
4510: 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  Pg->pPrevStmt = 
4520: 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
4530: 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 70 50  >pStmt ){.    pP
4540: 61 67 65 72 2d 3e 70 53 74 6d 74 2d 3e 70 50 72  ager->pStmt->pPr
4550: 65 76 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20  evStmt = pPg;.  
4560: 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  }.  pPg->pNextSt
4570: 6d 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 53 74  mt = pPager->pSt
4580: 6d 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 53  mt;.  pPager->pS
4590: 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 70 50 67  tmt = pPg;.  pPg
45a0: 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 7d 0a  ->inStmt = 1;.}.
45b0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
45c0: 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d  _remove_from_stm
45d0: 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50  t_list(PgHdr *pP
45e0: 67 29 7b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e  g){.  if( !pPg->
45f0: 69 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e 3b  inStmt ) return;
4600: 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65  .  if( pPg->pPre
4610: 76 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73  vStmt ){.    ass
4620: 65 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76 53  ert( pPg->pPrevS
4630: 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d  tmt->pNextStmt==
4640: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
4650: 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74  pPrevStmt->pNext
4660: 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Stmt = pPg->pNex
4670: 74 53 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tStmt;.  }else{.
4680: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
4690: 3e 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3d 3d  >pPager->pStmt==
46a0: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
46b0: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
46c0: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a  pPg->pNextStmt;.
46d0: 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
46e0: 4e 65 78 74 53 74 6d 74 20 29 7b 0a 20 20 20 20  NextStmt ){.    
46f0: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65  assert( pPg->pNe
4700: 78 74 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d  xtStmt->pPrevStm
4710: 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  t==pPg );.    pP
4720: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50  g->pNextStmt->pP
4730: 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70  revStmt = pPg->p
4740: 50 72 65 76 53 74 6d 74 3b 0a 20 20 7d 0a 20 20  PrevStmt;.  }.  
4750: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  pPg->pNextStmt =
4760: 20 30 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76   0;.  pPg->pPrev
4770: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d  Stmt = 0;.  pPg-
4780: 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a  >inStmt = 0;.}..
4790: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67  /*.** Find a pag
47a0: 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61  e in the hash ta
47b0: 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61  ble given its pa
47c0: 67 65 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75  ge number.  Retu
47d0: 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  rn.** a pointer 
47e0: 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e  to the page or N
47f0: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
4800: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
4810: 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  r *pager_lookup(
4820: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
4830: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
4840: 64 72 20 2a 70 20 3d 20 70 50 61 67 65 72 2d 3e  dr *p = pPager->
4850: 61 48 61 73 68 5b 70 61 67 65 72 5f 68 61 73 68  aHash[pager_hash
4860: 28 70 67 6e 6f 29 5d 3b 0a 20 20 77 68 69 6c 65  (pgno)];.  while
4870: 28 20 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d  ( p && p->pgno!=
4880: 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20  pgno ){.    p = 
4890: 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  p->pNextHash;.  
48a0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
48b0: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68  ./*.** Unlock th
48c0: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63  e database and c
48d0: 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  lear the in-memo
48e0: 72 79 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  ry cache.  This 
48f0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20  routine.** sets 
4900: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
4910: 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77   pager back to w
4920: 68 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20  hat it was when 
4930: 69 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20  it was first.** 
4940: 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74  opened.  Any out
4950: 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
4960: 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61  re invalidated a
4970: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 74  nd subsequent at
4980: 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63  tempts.** to acc
4990: 65 73 73 20 74 68 6f 73 65 20 70 61 67 65 73 20  ess those pages 
49a0: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75  will likely resu
49b0: 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
49c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
49d0: 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67   pager_reset(Pag
49e0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
49f0: 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78  gHdr *pPg, *pNex
4a00: 74 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  t;.  for(pPg=pPa
4a10: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
4a20: 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  pPg=pNext){.    
4a30: 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pNext = pPg->pNe
4a40: 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74  xtAll;.    sqlit
4a50: 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a  eFree(pPg);.  }.
4a60: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
4a70: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
4a80: 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
4a90: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73  ;.  pPager->pLas
4aa0: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
4ab0: 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 6d 65 6d  >pAll = 0;.  mem
4ac0: 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73  set(pPager->aHas
4ad0: 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61  h, 0, sizeof(pPa
4ae0: 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20  ger->aHash));.  
4af0: 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20  pPager->nPage = 
4b00: 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
4b10: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
4b20: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71  SERVED ){.    sq
4b30: 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
4b40: 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
4b50: 0a 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  .  sqlite3OsUnlo
4b60: 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ck(&pPager->fd, 
4b70: 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67  NO_LOCK);.  pPag
4b80: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
4b90: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67  R_UNLOCK;.  pPag
4ba0: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
4bb0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  .  pPager->nRef 
4bc0: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
4bd0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
4be0: 65 6e 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  en==0 );.}../*.*
4bf0: 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
4c00: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
4c10: 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65  he pager has the
4c20: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70   journal file op
4c30: 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45  en and.** a RESE
4c40: 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
4c50: 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
4c60: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f  tabase.  This ro
4c70: 75 74 69 6e 65 20 72 65 6c 65 61 73 65 73 0a 2a  utine releases.*
4c80: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  * the database l
4c90: 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73  ock and acquires
4ca0: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
4cb0: 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 20 54 68  n its place.  Th
4cc0: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
4cd0: 65 20 69 73 20 64 65 6c 65 74 65 64 20 61 6e 64  e is deleted and
4ce0: 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
4cf0: 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65  ODO: Consider ke
4d00: 65 70 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  eping the journa
4d10: 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20  l file open for 
4d20: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
4d30: 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67  ses..** This mig
4d40: 68 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72  ht give a perfor
4d50: 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e  mance improvemen
4d60: 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68 65  t on windows whe
4d70: 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20  re opening.** a 
4d80: 66 69 6c 65 20 69 73 20 61 6e 20 65 78 70 65 6e  file is an expen
4d90: 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  sive operation..
4da0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
4db0: 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
4dc0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
4dd0: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
4de0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
4df0: 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  e<PAGER_RESERVED
4e00: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
4e10: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
4e20: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d  sqlite3pager_stm
4e30: 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65 72 29  t_commit(pPager)
4e40: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
4e50: 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20  stmtOpen ){.    
4e60: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
4e70: 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20  pPager->stfd);. 
4e80: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f     pPager->stmtO
4e90: 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  pen = 0;.  }.  i
4ea0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
4eb0: 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  alOpen ){.    sq
4ec0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50  lite3OsClose(&pP
4ed0: 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
4ee0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
4ef0: 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  pen = 0;.    sql
4f00: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
4f10: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a  ger->zJournal);.
4f20: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 20      sqliteFree( 
4f30: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
4f40: 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  al );.    pPager
4f50: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->aInJournal = 0
4f60: 3b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  ;.    for(pPg=pP
4f70: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
4f80: 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
4f90: 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  ll){.      pPg->
4fa0: 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
4fb0: 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20       pPg->dirty 
4fc0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
4fd0: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
4fe0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
4ff0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
5000: 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c  >dirtyCache==0 |
5010: 7c 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  | pPager->useJou
5020: 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20  rnal==0 );.  }. 
5030: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
5040: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48  (&pPager->fd, SH
5050: 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50  ARED_LOCK);.  pP
5060: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
5070: 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 72 65  GER_SHARED;.  re
5080: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5090: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
50a0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68   and return a ch
50b0: 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70  ecksum for the p
50c0: 61 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a  age of data..**.
50d0: 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
50e0: 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20   real checksum. 
50f0: 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75   It is really ju
5100: 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  st the sum of th
5110: 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69  e .** random ini
5120: 74 69 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74  tial value and t
5130: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  he page number. 
5140: 20 57 65 20 63 6f 6e 73 69 64 65 72 65 64 20 64   We considered d
5150: 6f 20 61 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 20  o a checksum.** 
5160: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  of the database,
5170: 20 62 75 74 20 74 68 61 74 20 77 61 73 20 66 6f   but that was fo
5180: 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c  und to be too sl
5190: 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  ow..*/.static u3
51a0: 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61  2 pager_cksum(Pa
51b0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
51c0: 6f 20 70 67 6e 6f 2c 20 63 6f 6e 73 74 20 63 68  o pgno, const ch
51d0: 61 72 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33  ar *aData){.  u3
51e0: 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72  2 cksum = pPager
51f0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 2b 20 70 67  ->cksumInit + pg
5200: 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 63 6b 73  no;.  return cks
5210: 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  um;.}../*.** Rea
5220: 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  d a single page 
5230: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
5240: 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20   file opened on 
5250: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
5260: 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63  ** jfd.  Playbac
5270: 6b 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e  k this one page.
5280: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
5290: 20 74 68 72 65 65 20 64 69 66 66 65 72 65 6e 74   three different
52a0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 73   journal formats
52b0: 2e 20 20 54 68 65 20 66 6f 72 6d 61 74 20 70 61  .  The format pa
52c0: 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e  rameter determin
52d0: 65 73 0a 2a 2a 20 77 68 69 63 68 20 66 6f 72 6d  es.** which form
52e0: 61 74 20 69 73 20 75 73 65 64 20 62 79 20 74 68  at is used by th
52f0: 65 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 69  e journal that i
5300: 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a  s played back..*
5310: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
5320: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
5330: 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  page(Pager *pPag
5340: 65 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64 2c  er, OsFile *jfd,
5350: 20 69 6e 74 20 66 6f 72 6d 61 74 29 7b 0a 20 20   int format){.  
5360: 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
5370: 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  *pPg;           
5380: 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e     /* An existin
5390: 67 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61  g page in the ca
53a0: 63 68 65 20 2a 2f 0a 20 20 50 61 67 65 52 65 63  che */.  PageRec
53b0: 6f 72 64 20 70 67 52 65 63 3b 0a 20 20 75 33 32  ord pgRec;.  u32
53c0: 20 63 6b 73 75 6d 3b 0a 0a 20 20 72 63 20 3d 20   cksum;..  rc = 
53d0: 72 65 61 64 33 32 62 69 74 73 28 66 6f 72 6d 61  read32bits(forma
53e0: 74 2c 20 6a 66 64 2c 20 26 70 67 52 65 63 2e 70  t, jfd, &pgRec.p
53f0: 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  gno);.  if( rc!=
5400: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
5410: 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  rn rc;.  rc = sq
5420: 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c  lite3OsRead(jfd,
5430: 20 26 70 67 52 65 63 2e 61 44 61 74 61 2c 20 73   &pgRec.aData, s
5440: 69 7a 65 6f 66 28 70 67 52 65 63 2e 61 44 61 74  izeof(pgRec.aDat
5450: 61 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  a));.  if( rc!=S
5460: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
5470: 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69  n rc;..  /* Sani
5480: 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74  ty checking on t
5490: 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69  he page.  This i
54a0: 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  s more important
54b0: 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c   that I original
54c0: 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e  ly.  ** thought.
54d0: 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69    If a power fai
54e0: 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c  lure occurs whil
54f0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
5500: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a   being written,.
5510: 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61    ** it could ca
5520: 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61  use invalid data
5530: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
5540: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  nto the journal.
5550: 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a    We need to.  *
5560: 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e  * detect this in
5570: 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68  valid data (with
5580: 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
5590: 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  y) and ignore it
55a0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 52  ..  */.  if( pgR
55b0: 65 63 2e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  ec.pgno==0 ){.  
55c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
55d0: 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  DONE;.  }.  if( 
55e0: 70 67 52 65 63 2e 70 67 6e 6f 3e 28 75 6e 73 69  pgRec.pgno>(unsi
55f0: 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53  gned)pPager->dbS
5600: 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
5610: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
5620: 0a 20 20 69 66 28 20 66 6f 72 6d 61 74 3e 3d 4a  .  if( format>=J
5630: 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 33 20  OURNAL_FORMAT_3 
5640: 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  ){.    rc = read
5650: 33 32 62 69 74 73 28 66 6f 72 6d 61 74 2c 20 6a  32bits(format, j
5660: 66 64 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20  fd, &cksum);.   
5670: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
5680: 20 72 63 3b 0a 20 20 20 20 69 66 28 20 70 61 67   rc;.    if( pag
5690: 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
56a0: 20 70 67 52 65 63 2e 70 67 6e 6f 2c 20 70 67 52   pgRec.pgno, pgR
56b0: 65 63 2e 61 44 61 74 61 29 21 3d 63 6b 73 75 6d  ec.aData)!=cksum
56c0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
56d0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
56e0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 6c    }.  }..  /* Pl
56f0: 61 79 62 61 63 6b 20 74 68 65 20 70 61 67 65 2e  ayback the page.
5700: 20 20 55 70 64 61 74 65 20 74 68 65 20 69 6e 2d    Update the in-
5710: 6d 65 6d 6f 72 79 20 63 6f 70 79 20 6f 66 20 74  memory copy of t
5720: 68 65 20 70 61 67 65 0a 20 20 2a 2a 20 61 74 20  he page.  ** at 
5730: 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 69  the same time, i
5740: 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 0a  f there is one..
5750: 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67    */.  pPg = pag
5760: 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
5770: 2c 20 70 67 52 65 63 2e 70 67 6e 6f 29 3b 0a 20  , pgRec.pgno);. 
5780: 20 54 52 41 43 45 32 28 22 50 4c 41 59 42 41 43   TRACE2("PLAYBAC
5790: 4b 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 67  K page %d\n", pg
57a0: 52 65 63 2e 70 67 6e 6f 29 3b 0a 20 20 73 71 6c  Rec.pgno);.  sql
57b0: 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67  ite3OsSeek(&pPag
57c0: 65 72 2d 3e 66 64 2c 20 28 70 67 52 65 63 2e 70  er->fd, (pgRec.p
57d0: 67 6e 6f 2d 31 29 2a 28 6f 66 66 5f 74 29 53 51  gno-1)*(off_t)SQ
57e0: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
57f0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
5800: 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
5810: 66 64 2c 20 70 67 52 65 63 2e 61 44 61 74 61 2c  fd, pgRec.aData,
5820: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
5830: 45 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b  E);.  if( pPg ){
5840: 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20  .    /* No page 
5850: 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20 72  should ever be r
5860: 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20  olled back that 
5870: 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70  is in use, excep
5880: 74 20 66 6f 72 20 70 61 67 65 0a 20 20 20 20 2a  t for page.    *
5890: 2a 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c  * 1 which is hel
58a0: 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65  d in use in orde
58b0: 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f  r to keep the lo
58c0: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
58d0: 73 65 0a 20 20 20 20 2a 2a 20 61 63 74 69 76 65  se.    ** active
58e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69  ..    */.    voi
58f0: 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 61 73  d *pData;.    as
5900: 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d  sert( pPg->nRef=
5910: 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d  =0 || pPg->pgno=
5920: 3d 31 20 29 3b 0a 20 20 20 20 70 44 61 74 61 20  =1 );.    pData 
5930: 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  = PGHDR_TO_DATA(
5940: 70 50 67 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  pPg);.    memcpy
5950: 28 70 44 61 74 61 2c 20 70 67 52 65 63 2e 61 44  (pData, pgRec.aD
5960: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
5970: 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  eSize);.    if( 
5980: 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
5990: 74 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61  tor ){.      pPa
59a0: 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
59b0: 28 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  (pData, pPager->
59c0: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
59d0: 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20  .    pPg->dirty 
59e0: 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 65  = 0;.    pPg->ne
59f0: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
5a00: 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44  CODEC(pPager, pD
5a10: 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
5a20: 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  3);.  }.  return
5a30: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61   rc;.}../*.** Pa
5a40: 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20  rameter zMaster 
5a50: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
5a60: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5a70: 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a  file. A single j
5a80: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74  ournal.** file t
5a90: 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20  hat referred to 
5aa0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
5ab0: 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74  al file has just
5ac0: 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
5ad0: 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  k..** This routi
5ae0: 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20  ne checks if it 
5af0: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
5b00: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
5b10: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a   journal file,.*
5b20: 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66  * and does so if
5b30: 20 69 74 20 69 73 2e 0a 2a 2f 0a 73 74 61 74 69   it is..*/.stati
5b40: 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d  c int pager_delm
5b50: 61 73 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72  aster(const char
5b60: 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
5b70: 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74  t rc;.  int mast
5b80: 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f  er_open = 0;.  O
5b90: 73 46 69 6c 65 20 6d 61 73 74 65 72 3b 0a 20 20  sFile master;.  
5ba0: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75  char *zMasterJou
5bb0: 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e  rnal = 0; /* Con
5bc0: 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20  tents of master 
5bd0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
5be0: 20 20 6f 66 66 5f 74 20 6e 4d 61 73 74 65 72 4a    off_t nMasterJ
5bf0: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 2f 2a 20 53  ournal;     /* S
5c00: 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ize of master jo
5c10: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20  urnal file */.. 
5c20: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73   /* Open the mas
5c30: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
5c40: 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20   exclusively in 
5c50: 63 61 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20  case some other 
5c60: 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20  process.  ** is 
5c70: 72 75 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75  running this rou
5c80: 74 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74  tine also. Not t
5c90: 68 61 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f  hat it makes too
5ca0: 20 6d 75 63 68 20 64 69 66 66 65 72 65 6e 63 65   much difference
5cb0: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
5cc0: 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75  lite3OsOpenExclu
5cd0: 73 69 76 65 28 7a 4d 61 73 74 65 72 2c 20 26 6d  sive(zMaster, &m
5ce0: 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 69 66 28  aster, 0);.  if(
5cf0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5d00: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
5d10: 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70  out;.  master_op
5d20: 65 6e 20 3d 20 31 3b 0a 0a 20 20 72 63 20 3d 20  en = 1;..  rc = 
5d30: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
5d40: 65 28 26 6d 61 73 74 65 72 2c 20 26 6e 4d 61 73  e(&master, &nMas
5d50: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  terJournal);.  i
5d60: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
5d70: 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
5d80: 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d  r_out;..  if( nM
5d90: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29  asterJournal>0 )
5da0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62 3b  {.    char *zDb;
5db0: 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  .    zMasterJour
5dc0: 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71  nal = (char *)sq
5dd0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74  liteMalloc(nMast
5de0: 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  erJournal);.    
5df0: 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72  if( !zMasterJour
5e00: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nal ){.      rc 
5e10: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
5e20: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
5e30: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  ster_out;.    }.
5e40: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
5e50: 4f 73 52 65 61 64 28 26 6d 61 73 74 65 72 2c 20  OsRead(&master, 
5e60: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  zMasterJournal, 
5e70: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
5e80: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
5e90: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
5ea0: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
5eb0: 20 20 7a 44 62 20 3d 20 7a 4d 61 73 74 65 72 4a    zDb = zMasterJ
5ec0: 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c  ournal;.    whil
5ed0: 65 28 20 28 7a 44 62 2d 7a 4d 61 73 74 65 72 4a  e( (zDb-zMasterJ
5ee0: 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a  ournal)<nMasterJ
5ef0: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
5f00: 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 20 3d  char *zJournal =
5f10: 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
5f20: 33 53 65 74 53 74 72 69 6e 67 28 26 7a 4a 6f 75  3SetString(&zJou
5f30: 72 6e 61 6c 2c 20 7a 44 62 2c 20 22 2d 6a 6f 75  rnal, zDb, "-jou
5f40: 72 6e 61 6c 22 2c 20 30 29 3b 0a 20 20 20 20 20  rnal", 0);.     
5f50: 20 69 66 28 20 21 7a 4a 6f 75 72 6e 61 6c 20 29   if( !zJournal )
5f60: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
5f70: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
5f80: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
5f90: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
5fa0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
5fb0: 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a  e3OsFileExists(z
5fc0: 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20  Journal) ){.    
5fd0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
5fe0: 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74  e journals point
5ff0: 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73  ed to by the mas
6000: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ter journal exis
6010: 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  ts..        ** O
6020: 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b  pen it and check
6030: 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74   if it points at
6040: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
6050: 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20  nal. If.        
6060: 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69  ** so, return wi
6070: 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74  thout deleting t
6080: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
6090: 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  l file..        
60a0: 2a 2f 0a 20 20 20 20 20 20 20 20 4f 73 46 69 6c  */.        OsFil
60b0: 65 20 6a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 20  e journal;.     
60c0: 20 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b 0a     int nMaster;.
60d0: 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20 6a 73          off_t js
60e0: 7a 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d  z;..        rc =
60f0: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
6100: 61 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61 6c 2c  adOnly(zJournal,
6110: 20 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20   &journal);.    
6120: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
6130: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  Journal);.      
6140: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
6150: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
6160: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
6170: 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  &journal);.     
6180: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
6190: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
61a0: 20 7d 0a 0a 09 2f 2a 20 43 68 65 63 6b 20 69 66   }.../* Check if
61b0: 20 74 68 65 20 66 69 6c 65 20 69 73 20 62 69 67   the file is big
61c0: 20 65 6e 6f 75 67 68 20 74 6f 20 62 65 20 61 20   enough to be a 
61d0: 66 6f 72 6d 61 74 20 33 20 6a 6f 75 72 6e 61 6c  format 3 journal
61e0: 20 66 69 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a   file.        **
61f0: 20 77 69 74 68 20 74 68 65 20 72 65 71 75 69 72   with the requir
6200: 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ed master journa
6210: 6c 20 6e 61 6d 65 2e 20 49 66 20 6e 6f 74 2c 20  l name. If not, 
6220: 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 20 20 20  ignore it..     
6230: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63     */.        rc
6240: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
6250: 53 69 7a 65 28 26 6a 6f 75 72 6e 61 6c 2c 20 26  Size(&journal, &
6260: 6a 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  jsz);.        if
6270: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6280: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
6290: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6a 6f 75  ite3OsClose(&jou
62a0: 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  rnal);.         
62b0: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
62c0: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
62d0: 20 20 20 20 20 20 20 69 66 28 20 6a 73 7a 3c 28         if( jsz<(
62e0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
62f0: 61 67 69 63 33 29 2b 34 2a 73 69 7a 65 6f 66 28  agic3)+4*sizeof(
6300: 75 33 32 29 2b 73 74 72 6c 65 6e 28 7a 4d 61 73  u32)+strlen(zMas
6310: 74 65 72 29 2b 31 29 20 29 7b 0a 20 20 20 20 20  ter)+1) ){.     
6320: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
6330: 6f 73 65 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20  ose(&journal);. 
6340: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
6350: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
6360: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 2f 2a       .        /*
6370: 20 53 65 65 6b 20 74 6f 20 74 68 65 20 70 6f 69   Seek to the poi
6380: 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  nt in the journa
6390: 6c 20 77 68 65 72 65 20 74 68 65 20 6d 61 73 74  l where the mast
63a0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er journal name.
63b0: 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74          ** is st
63c0: 6f 72 65 64 2e 20 52 65 61 64 20 74 68 65 20 6d  ored. Read the m
63d0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
63e0: 6d 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  me into memory o
63f0: 62 74 61 69 6e 65 64 0a 20 20 20 20 20 20 20 20  btained.        
6400: 2a 2a 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a  ** from malloc..
6410: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
6420: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
6430: 73 53 65 65 6b 28 26 6a 6f 75 72 6e 61 6c 2c 20  sSeek(&journal, 
6440: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
6450: 61 67 69 63 33 29 2b 32 2a 73 69 7a 65 6f 66 28  agic3)+2*sizeof(
6460: 75 33 32 29 29 3b 0a 20 20 20 20 20 20 20 20 69  u32));.        i
6470: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
6480: 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
6490: 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 72  r_out;.        r
64a0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 33  c = read32bits(3
64b0: 2c 20 26 6a 6f 75 72 6e 61 6c 2c 20 28 75 33 32  , &journal, (u32
64c0: 20 2a 29 26 6e 4d 61 73 74 65 72 29 3b 0a 20 20   *)&nMaster);.  
64d0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
64e0: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
64f0: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
6500: 20 20 20 20 20 20 69 66 28 20 6e 4d 61 73 74 65        if( nMaste
6510: 72 3e 30 20 26 26 20 6e 4d 61 73 74 65 72 3d 3d  r>0 && nMaster==
6520: 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29 2b  strlen(zMaster)+
6530: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  1 ){.          c
6540: 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20  har *zMasterPtr 
6550: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
6560: 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 29 3b  Malloc(nMaster);
6570: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
6580: 7a 4d 61 73 74 65 72 50 74 72 20 29 7b 0a 20 20  zMasterPtr ){.  
6590: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
65a0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
65b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
65c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
65d0: 73 52 65 61 64 28 26 6a 6f 75 72 6e 61 6c 2c 20  sRead(&journal, 
65e0: 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73  zMasterPtr, nMas
65f0: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
6600: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
6610: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
6620: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73   sqliteFree(zMas
6630: 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20  terPtr);.       
6640: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
6650: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
6660: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
6670: 66 28 20 30 3d 3d 73 74 72 6e 63 6d 70 28 7a 4d  f( 0==strncmp(zM
6680: 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65  asterPtr, zMaste
6690: 72 2c 20 6e 4d 61 73 74 65 72 29 20 29 7b 0a 20  r, nMaster) ){. 
66a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65             /* We
66b0: 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44   have a match. D
66c0: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
66d0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
66e0: 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  file. */.       
66f0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
6700: 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20  zMasterPtr);.   
6710: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
6720: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
6730: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6740: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
6750: 20 7a 44 62 20 2b 3d 20 28 73 74 72 6c 65 6e 28   zDb += (strlen(
6760: 7a 44 62 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  zDb)+1);.    }. 
6770: 20 7d 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 4f   }.  .  sqlite3O
6780: 73 44 65 6c 65 74 65 28 7a 4d 61 73 74 65 72 29  sDelete(zMaster)
6790: 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  ;..delmaster_out
67a0: 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a  :.  if( zMasterJ
67b0: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71  ournal ){.    sq
67c0: 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72  liteFree(zMaster
67d0: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a  Journal);.  }  .
67e0: 20 20 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65    if( master_ope
67f0: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
6800: 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 29  OsClose(&master)
6810: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
6820: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  c;.}../*.** Make
6830: 20 65 76 65 72 79 20 70 61 67 65 20 69 6e 20 74   every page in t
6840: 68 65 20 63 61 63 68 65 20 61 67 72 65 65 20 77  he cache agree w
6850: 69 74 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64  ith what is on d
6860: 69 73 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  isk.  In other w
6870: 6f 72 64 73 2c 0a 2a 2a 20 72 65 72 65 61 64 20  ords,.** reread 
6880: 74 68 65 20 64 69 73 6b 20 74 6f 20 72 65 73 65  the disk to rese
6890: 74 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  t the state of t
68a0: 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  he cache..**.** 
68b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
68c0: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 72  called after a r
68d0: 6f 6c 6c 62 61 63 6b 20 69 6e 20 77 68 69 63 68  ollback in which
68e0: 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 64 69 72   some of the dir
68f0: 74 79 20 63 61 63 68 65 0a 2a 2a 20 70 61 67 65  ty cache.** page
6900: 73 20 68 61 64 20 6e 65 76 65 72 20 62 65 65 6e  s had never been
6910: 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20   written out to 
6920: 64 69 73 6b 2e 20 20 57 65 20 6e 65 65 64 20 74  disk.  We need t
6930: 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a  o roll back the.
6940: 2a 2a 20 63 61 63 68 65 20 63 6f 6e 74 65 6e 74  ** cache content
6950: 20 61 6e 64 20 74 68 65 20 65 61 73 69 65 73 74   and the easiest
6960: 20 77 61 79 20 74 6f 20 64 6f 20 74 68 61 74 20   way to do that 
6970: 69 73 20 74 6f 20 72 65 72 65 61 64 20 74 68 65  is to reread the
6980: 20 6f 6c 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20   old content.** 
6990: 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 69  back from the di
69a0: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  sk..*/.static in
69b0: 74 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63  t pager_reload_c
69c0: 61 63 68 65 28 50 61 67 65 72 20 2a 70 50 61 67  ache(Pager *pPag
69d0: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
69e0: 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  g;.  int rc = SQ
69f0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70  LITE_OK;.  for(p
6a00: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
6a10: 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
6a20: 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 63 68  NextAll){.    ch
6a30: 61 72 20 7a 42 75 66 5b 53 51 4c 49 54 45 5f 50  ar zBuf[SQLITE_P
6a40: 41 47 45 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 69  AGE_SIZE];.    i
6a50: 66 28 20 21 70 50 67 2d 3e 64 69 72 74 79 20 29  f( !pPg->dirty )
6a60: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
6a70: 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  f( (int)pPg->pgn
6a80: 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  o <= pPager->ori
6a90: 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  gDbSize ){.     
6aa0: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
6ab0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
6ac0: 54 45 5f 50 41 47 45 5f 53 49 5a 45 2a 28 6f 66  TE_PAGE_SIZE*(of
6ad0: 66 5f 74 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31  f_t)(pPg->pgno-1
6ae0: 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ));.      rc = s
6af0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70 50  qlite3OsRead(&pP
6b00: 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20  ager->fd, zBuf, 
6b10: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
6b20: 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 32 28  );.      TRACE2(
6b30: 22 52 45 46 45 54 43 48 20 70 61 67 65 20 25 64  "REFETCH page %d
6b40: 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  \n", pPg->pgno);
6b50: 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61  .      CODEC(pPa
6b60: 67 65 72 2c 20 7a 42 75 66 2c 20 70 50 67 2d 3e  ger, zBuf, pPg->
6b70: 70 67 6e 6f 2c 20 32 29 3b 0a 20 20 20 20 20 20  pgno, 2);.      
6b80: 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
6b90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6ba0: 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c   memset(zBuf, 0,
6bb0: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
6bc0: 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  E);.    }.    if
6bd0: 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c  ( pPg->nRef==0 |
6be0: 7c 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20 50  | memcmp(zBuf, P
6bf0: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
6c00: 29 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  ), SQLITE_PAGE_S
6c10: 49 5a 45 29 20 29 7b 0a 20 20 20 20 20 20 6d 65  IZE) ){.      me
6c20: 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41  mcpy(PGHDR_TO_DA
6c30: 54 41 28 70 50 67 29 2c 20 7a 42 75 66 2c 20 53  TA(pPg), zBuf, S
6c40: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
6c50: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
6c60: 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b  er->xReiniter ){
6c70: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
6c80: 3e 78 52 65 69 6e 69 74 65 72 28 50 47 48 44 52  >xReiniter(PGHDR
6c90: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
6ca0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
6cb0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6cc0: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47         memset(PG
6cd0: 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67  HDR_TO_EXTRA(pPg
6ce0: 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45  ), 0, pPager->nE
6cf0: 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xtra);.      }. 
6d00: 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 6e 65     }.    pPg->ne
6d10: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
6d20: 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
6d30: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
6d40: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  .}.../*.** Playb
6d50: 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ack the journal 
6d60: 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65  and thus restore
6d70: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
6d80: 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61  le to.** the sta
6d90: 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66  te it was in bef
6da0: 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d  ore we started m
6db0: 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20  aking changes.  
6dc0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
6dd0: 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69  al file format i
6de0: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a  s as follows: .*
6df0: 2a 0a 2a 2a 20 20 20 20 2a 20 20 38 20 62 79 74  *.**    *  8 byt
6e00: 65 20 70 72 65 66 69 78 2e 20 20 4f 6e 65 20 6f  e prefix.  One o
6e10: 66 20 74 68 65 20 61 4a 6f 75 72 6e 61 6c 4d 61  f the aJournalMa
6e20: 67 69 63 31 32 33 20 76 65 63 74 6f 72 73 20 64  gic123 vectors d
6e30: 65 66 69 6e 65 64 0a 2a 2a 20 20 20 20 20 20 20  efined.**       
6e40: 61 62 6f 76 65 2e 20 20 54 68 65 20 66 6f 72 6d  above.  The form
6e50: 61 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  at of the journa
6e60: 6c 20 66 69 6c 65 20 69 73 20 64 65 74 65 72 6d  l file is determ
6e70: 69 6e 65 64 20 62 79 20 77 68 69 63 68 0a 2a 2a  ined by which.**
6e80: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 74 68         of the th
6e90: 72 65 65 20 70 72 65 66 69 78 20 76 65 63 74 6f  ree prefix vecto
6ea0: 72 73 20 69 73 20 73 65 65 6e 2e 0a 2a 2a 20 20  rs is seen..**  
6eb0: 20 20 2a 20 20 34 20 62 79 74 65 20 62 69 67 2d    *  4 byte big-
6ec0: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
6ed0: 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
6ee0: 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65  er of valid page
6ef0: 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20   records.**     
6f00: 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c    in the journal
6f10: 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
6f20: 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
6f30: 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65  then compute the
6f40: 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72  .**       number
6f50: 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73   of page records
6f60: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
6f70: 6c 20 73 69 7a 65 2e 20 20 54 68 69 73 20 66 69  l size.  This fi
6f80: 65 6c 64 20 61 70 70 65 61 72 73 0a 2a 2a 20 20  eld appears.**  
6f90: 20 20 20 20 20 69 6e 20 66 6f 72 6d 61 74 20 33       in format 3
6fa0: 20 6f 6e 6c 79 2e 0a 2a 2a 20 20 20 20 2a 20 20   only..**    *  
6fb0: 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
6fc0: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
6fd0: 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  is the initial v
6fe0: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a  alue for the .**
6ff0: 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68         sanity ch
7000: 65 63 6b 73 75 6d 2e 20 20 54 68 69 73 20 66 69  ecksum.  This fi
7010: 65 6c 64 20 61 70 70 65 61 72 73 20 69 6e 20 66  eld appears in f
7020: 6f 72 6d 61 74 20 33 20 6f 6e 6c 79 2e 0a 2a 2a  ormat 3 only..**
7030: 20 20 20 20 2a 20 20 34 20 62 79 74 65 20 69 6e      *  4 byte in
7040: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
7050: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
7060: 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74  es to truncate t
7070: 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61  he.**       data
7080: 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61  base to during a
7090: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 20   rollback..**   
70a0: 20 2a 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65   *  Zero or more
70b0: 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73   pages instances
70c0: 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77  , each as follow
70d0: 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  s:.**        +  
70e0: 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  4 byte page numb
70f0: 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  er..**        + 
7100: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
7110: 45 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e  E bytes of data.
7120: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
7130: 62 79 74 65 20 63 68 65 63 6b 73 75 6d 20 28 66  byte checksum (f
7140: 6f 72 6d 61 74 20 33 20 6f 6e 6c 79 29 0a 2a 2a  ormat 3 only).**
7150: 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61  .** When we spea
7160: 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k of the journal
7170: 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e   header, we mean
7180: 20 74 68 65 20 66 69 72 73 74 20 34 20 62 75 6c   the first 4 bul
7190: 6c 65 74 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45  lets above..** E
71a0: 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ach entry in the
71b0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69   journal is an i
71c0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 35  nstance of the 5
71d0: 74 68 20 62 75 6c 6c 65 74 2e 20 20 4e 6f 74 65  th bullet.  Note
71e0: 20 74 68 61 74 0a 2a 2a 20 62 75 6c 6c 65 74 73   that.** bullets
71f0: 20 32 20 61 6e 64 20 33 20 6f 6e 6c 79 20 61 70   2 and 3 only ap
7200: 70 65 61 72 20 69 6e 20 66 6f 72 6d 61 74 2d 33  pear in format-3
7210: 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a   journals..**.**
7220: 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20   Call the value 
7230: 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20  from the second 
7240: 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20  bullet "nRec".  
7250: 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62  nRec is the numb
7260: 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70  er of.** valid p
7270: 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74  age entries in t
7280: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
7290: 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20  most cases, you 
72a0: 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  can compute the.
72b0: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  ** value of nRec
72c0: 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
72d0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
72e0: 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f  le.  But if a po
72f0: 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f  wer.** failure o
7300: 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68  ccurred while th
7310: 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
7320: 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20  ing written, it 
7330: 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20  could be the.** 
7340: 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69  case that the si
7350: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
7360: 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61  l file had alrea
7370: 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65  dy been increase
7380: 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74  d but.** the ext
7390: 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e  ra entries had n
73a0: 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73  ot yet made it s
73b0: 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20  afely to disk.  
73c0: 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a  In such a case,.
73d0: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
73e0: 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
73f0: 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
7400: 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61   would be too la
7410: 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61  rge.  For.** tha
7420: 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77  t reason, we alw
7430: 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63  ays use the nRec
7440: 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65   value in the he
7450: 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ader..**.** If t
7460: 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73  he nRec value is
7470: 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d   0xffffffff it m
7480: 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73  eans that nRec s
7490: 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
74a0: 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69  d.** from the fi
74b0: 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76  le size.  This v
74c0: 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65  alue is used whe
74d0: 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63  n the user selec
74e0: 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e  ts the.** no-syn
74f0: 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65  c option for the
7500: 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77   journal.  A pow
7510: 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
7520: 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74   lead to corrupt
7530: 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ion.** in this c
7540: 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68  ase.  But for th
7550: 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72  ings like tempor
7560: 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68  ary table (which
7570: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65   will be.** dele
7580: 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77  ted when the pow
7590: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20  er is restored) 
75a0: 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20  we don't care.  
75b0: 0a 2a 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66  .**.** Journal f
75c0: 6f 72 6d 61 74 73 20 31 20 61 6e 64 20 32 20 64  ormats 1 and 2 d
75d0: 6f 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 6e 52  o not have an nR
75e0: 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ec value in the 
75f0: 68 65 61 64 65 72 20 73 6f 20 77 65 0a 2a 2a 20  header so we.** 
7600: 68 61 76 65 20 74 6f 20 63 6f 6d 70 75 74 65 20  have to compute 
7610: 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 66 69  nRec from the fi
7620: 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 68  le size.  This h
7630: 61 73 20 72 69 73 6b 73 20 28 61 73 20 64 65 73  as risks (as des
7640: 63 72 69 62 65 64 0a 2a 2a 20 61 62 6f 76 65 29  cribed.** above)
7650: 20 77 68 69 63 68 20 69 73 20 77 68 79 20 61 6c   which is why al
7660: 6c 20 70 65 72 73 69 73 74 65 6e 74 20 74 61 62  l persistent tab
7670: 6c 65 73 20 68 61 76 65 20 62 65 65 6e 20 63 68  les have been ch
7680: 61 6e 67 65 64 20 74 6f 20 75 73 65 0a 2a 2a 20  anged to use.** 
7690: 66 6f 72 6d 61 74 20 33 2e 0a 2a 2a 0a 2a 2a 20  format 3..**.** 
76a0: 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
76b0: 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  ed as the journa
76c0: 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20  l file is not a 
76d0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a  well-formed.** j
76e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
76f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 69   the database wi
7700: 6c 6c 20 6c 69 6b 65 6c 79 20 61 6c 72 65 61 64  ll likely alread
7710: 79 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65  y be.** corrupte
7720: 64 2c 20 73 6f 20 74 68 65 20 50 41 47 45 52 5f  d, so the PAGER_
7730: 45 52 52 5f 43 4f 52 52 55 50 54 20 62 69 74 20  ERR_CORRUPT bit 
7740: 69 73 20 73 65 74 20 69 6e 20 70 50 61 67 65 72  is set in pPager
7750: 2d 3e 65 72 72 4d 61 73 6b 0a 2a 2a 20 61 6e 64  ->errMask.** and
7760: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
7770: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66  is returned.  If
7780: 20 69 74 20 61 6c 6c 20 77 6f 72 6b 73 2c 20 74   it all works, t
7790: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
77a0: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 53 51 4c 49  .** returns SQLI
77b0: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
77c0: 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
77d0: 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
77e0: 72 2c 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61  r, int useJourna
77f0: 6c 53 69 7a 65 29 7b 0a 20 20 6f 66 66 5f 74 20  lSize){.  off_t 
7800: 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
7810: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
7820: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
7830: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74  n bytes */.  int
7840: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
7850: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7860: 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68  of Records in th
7870: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  e journal */.  i
7880: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
7890: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
78a0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e  counter */.  Pgn
78b0: 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20  o mxPg = 0;     
78c0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
78d0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69   the original fi
78e0: 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20  le in pages */. 
78f0: 20 69 6e 74 20 66 6f 72 6d 61 74 3b 20 20 20 20   int format;    
7900: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
7910: 6d 61 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  mat of the journ
7920: 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 75 6e  al file. */.  un
7930: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
7940: 69 63 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  ic[sizeof(aJourn
7950: 61 6c 4d 61 67 69 63 31 29 5d 3b 0a 20 20 69 6e  alMagic1)];.  in
7960: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 4d  t rc;.  char *zM
7970: 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20  aster = 0;      
7980: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74   /* Name of mast
7990: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
79a0: 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20  if any */..  /* 
79b0: 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
79c0: 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20  any records are 
79d0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
79e0: 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a   Abort early if.
79f0: 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
7a00: 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a   is empty..  */.
7a10: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
7a20: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
7a30: 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b  .  sqlite3OsSeek
7a40: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  (&pPager->jfd, 0
7a50: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
7a60: 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61  3OsFileSize(&pPa
7a70: 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b  ger->jfd, &szJ);
7a80: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
7a90: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
7aa0: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
7ab0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
7ac0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
7ad0: 74 6f 6f 20 73 6d 61 6c 6c 20 74 6f 20 63 6f 6e  too small to con
7ae0: 74 61 69 6e 20 61 20 63 6f 6d 70 6c 65 74 65 20  tain a complete 
7af0: 68 65 61 64 65 72 2c 0a 20 20 2a 2a 20 69 74 20  header,.  ** it 
7b00: 6d 75 73 74 20 6d 65 61 6e 20 74 68 61 74 20 74  must mean that t
7b10: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
7b20: 63 72 65 61 74 65 64 20 74 68 65 20 6a 6f 75 72  created the jour
7b30: 6e 61 6c 20 77 61 73 20 6a 75 73 74 0a 20 20 2a  nal was just.  *
7b40: 2a 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 20 77  * beginning to w
7b50: 72 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  rite the journal
7b60: 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 64 69   file when it di
7b70: 65 64 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  ed.  In that cas
7b80: 65 2c 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61  e,.  ** the data
7b90: 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
7ba0: 20 68 61 76 65 20 73 74 69 6c 6c 20 62 65 65 6e   have still been
7bb0: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 63 68   completely unch
7bc0: 61 6e 67 65 64 2e 0a 20 20 2a 2a 20 4e 6f 74 68  anged..  ** Noth
7bd0: 69 6e 67 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ing needs to be 
7be0: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 57 65  rolled back.  We
7bf0: 20 63 61 6e 20 73 61 66 65 6c 79 20 69 67 6e 6f   can safely igno
7c00: 72 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  re this journal.
7c10: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 7a 4a 20  .  */.  if( szJ 
7c20: 3c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  < sizeof(aMagic)
7c30: 2b 73 69 7a 65 6f 66 28 50 67 6e 6f 29 20 29 7b  +sizeof(Pgno) ){
7c40: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
7c50: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
7c60: 2a 20 52 65 61 64 20 74 68 65 20 62 65 67 69 6e  * Read the begin
7c70: 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72  ning of the jour
7c80: 6e 61 6c 20 61 6e 64 20 74 72 75 6e 63 61 74 65  nal and truncate
7c90: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
7ca0: 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20  se file back to 
7cb0: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
7cc0: 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  e..  */.  rc = s
7cd0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70 50  qlite3OsRead(&pP
7ce0: 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
7cf0: 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
7d00: 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ));.  if( rc!=SQ
7d10: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
7d20: 63 20 3d 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f  c = SQLITE_PROTO
7d30: 43 4f 4c 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  COL;.    goto en
7d40: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
7d50: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61    if( memcmp(aMa
7d60: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
7d70: 69 63 33 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  ic3, sizeof(aMag
7d80: 69 63 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66  ic))==0 ){.    f
7d90: 6f 72 6d 61 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f  ormat = JOURNAL_
7da0: 46 4f 52 4d 41 54 5f 33 3b 0a 20 20 7d 65 6c 73  FORMAT_3;.  }els
7db0: 65 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61  e if( memcmp(aMa
7dc0: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
7dd0: 69 63 32 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  ic2, sizeof(aMag
7de0: 69 63 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66  ic))==0 ){.    f
7df0: 6f 72 6d 61 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f  ormat = JOURNAL_
7e00: 46 4f 52 4d 41 54 5f 32 3b 0a 20 20 7d 65 6c 73  FORMAT_2;.  }els
7e10: 65 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61  e if( memcmp(aMa
7e20: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
7e30: 69 63 31 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  ic1, sizeof(aMag
7e40: 69 63 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66  ic))==0 ){.    f
7e50: 6f 72 6d 61 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f  ormat = JOURNAL_
7e60: 46 4f 52 4d 41 54 5f 31 3b 0a 20 20 7d 65 6c 73  FORMAT_1;.  }els
7e70: 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
7e80: 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 20  TE_PROTOCOL;.   
7e90: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
7ea0: 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6f  ck;.  }.  if( fo
7eb0: 72 6d 61 74 3e 3d 4a 4f 55 52 4e 41 4c 5f 46 4f  rmat>=JOURNAL_FO
7ec0: 52 4d 41 54 5f 33 20 29 7b 0a 20 20 20 20 69 66  RMAT_3 ){.    if
7ed0: 28 20 73 7a 4a 20 3c 20 73 69 7a 65 6f 66 28 61  ( szJ < sizeof(a
7ee0: 4d 61 67 69 63 29 20 2b 20 34 2a 73 69 7a 65 6f  Magic) + 4*sizeo
7ef0: 66 28 75 33 32 29 20 29 7b 0a 20 20 20 20 20 20  f(u32) ){.      
7f00: 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 6a 6f  /* Ignore the jo
7f10: 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 74  urnal if it is t
7f20: 6f 6f 20 73 6d 61 6c 6c 20 74 6f 20 63 6f 6e 74  oo small to cont
7f30: 61 69 6e 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20  ain a complete. 
7f40: 20 20 20 20 20 2a 2a 20 68 65 61 64 65 72 2e 20       ** header. 
7f50: 20 57 65 20 61 6c 72 65 61 64 79 20 64 69 64 20   We already did 
7f60: 74 68 69 73 20 74 65 73 74 20 6f 6e 63 65 20 61  this test once a
7f70: 62 6f 76 65 2c 20 62 75 74 20 61 74 20 74 68 65  bove, but at the
7f80: 20 70 72 69 6f 72 0a 20 20 20 20 20 20 2a 2a 20   prior.      ** 
7f90: 74 65 73 74 2c 20 77 65 20 64 69 64 20 6e 6f 74  test, we did not
7fa0: 20 6b 6e 6f 77 20 74 68 65 20 6a 6f 75 72 6e 61   know the journa
7fb0: 6c 20 66 6f 72 6d 61 74 20 61 6e 64 20 73 6f 20  l format and so 
7fc0: 77 65 20 68 61 64 20 74 6f 20 61 73 73 75 6d 65  we had to assume
7fd0: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 6d  .      ** the sm
7fe0: 61 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c 65 20  allest possible 
7ff0: 68 65 61 64 65 72 2e 20 20 4e 6f 77 20 77 65 20  header.  Now we 
8000: 6b 6e 6f 77 20 74 68 65 20 68 65 61 64 65 72 20  know the header 
8010: 69 73 20 62 69 67 67 65 72 0a 20 20 20 20 20 20  is bigger.      
8020: 2a 2a 20 74 68 61 6e 20 74 68 65 20 6d 69 6e 69  ** than the mini
8030: 6d 75 6d 20 73 6f 20 77 65 20 74 65 73 74 20 61  mum so we test a
8040: 67 61 69 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  gain..      */. 
8050: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
8060: 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  ayback;.    }.  
8070: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
8080: 73 28 66 6f 72 6d 61 74 2c 20 26 70 50 61 67 65  s(format, &pPage
8090: 72 2d 3e 6a 66 64 2c 20 28 75 33 32 2a 29 26 6e  r->jfd, (u32*)&n
80a0: 52 65 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Rec);.    if( rc
80b0: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79   ) goto end_play
80c0: 62 61 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20 72  back;.    rc = r
80d0: 65 61 64 33 32 62 69 74 73 28 66 6f 72 6d 61 74  ead32bits(format
80e0: 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  , &pPager->jfd, 
80f0: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
8100: 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  it);.    if( rc 
8110: 29 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62  ) goto end_playb
8120: 61 63 6b 3b 0a 20 20 20 20 69 66 28 20 6e 52 65  ack;.    if( nRe
8130: 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 7c 7c  c==0xffffffff ||
8140: 20 75 73 65 4a 6f 75 72 6e 61 6c 53 69 7a 65 20   useJournalSize 
8150: 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  ){.      nRec = 
8160: 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48  (szJ - JOURNAL_H
8170: 44 52 5f 53 5a 28 70 50 61 67 65 72 2c 20 33 29  DR_SZ(pPager, 3)
8180: 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
8190: 33 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  3);.    }..    /
81a0: 2a 20 43 68 65 63 6b 20 69 66 20 61 20 6d 61 73  * Check if a mas
81b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
81c0: 20 69 73 20 73 70 65 63 69 66 69 65 64 2e 20 49   is specified. I
81d0: 66 20 6f 6e 65 20 69 73 20 73 70 65 63 69 66 69  f one is specifi
81e0: 65 64 2c 20 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79  ed, .    ** only
81f0: 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 74 68   proceed with th
8200: 65 20 70 6c 61 79 62 61 63 6b 20 69 66 20 69 74  e playback if it
8210: 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0a 20   still exists.. 
8220: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72     */.    rc = r
8230: 65 61 64 33 32 62 69 74 73 28 66 6f 72 6d 61 74  ead32bits(format
8240: 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  , &pPager->jfd, 
8250: 26 70 50 61 67 65 72 2d 3e 6e 4d 61 73 74 65 72  &pPager->nMaster
8260: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
8270: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
8280: 6b 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  k;.    if( pPage
8290: 72 2d 3e 6e 4d 61 73 74 65 72 3e 30 20 29 7b 0a  r->nMaster>0 ){.
82a0: 20 20 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20        zMaster = 
82b0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 70 50 61  sqliteMalloc(pPa
82c0: 67 65 72 2d 3e 6e 4d 61 73 74 65 72 29 3b 0a 20  ger->nMaster);. 
82d0: 20 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65       if( !zMaste
82e0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  r ){.        rc 
82f0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
8300: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
8310: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
8320: 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   }.      rc = sq
8330: 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70 50 61  lite3OsRead(&pPa
8340: 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
8350: 72 2c 20 70 50 61 67 65 72 2d 3e 6e 4d 61 73 74  r, pPager->nMast
8360: 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
8370: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
8380: 28 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29  (strlen(zMaster)
8390: 20 26 26 20 21 73 71 6c 69 74 65 33 4f 73 46 69   && !sqlite3OsFi
83a0: 6c 65 45 78 69 73 74 73 28 7a 4d 61 73 74 65 72  leExists(zMaster
83b0: 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  )) ){.        go
83c0: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
83d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
83e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 52 65 63   }else{.    nRec
83f0: 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41   = (szJ - JOURNA
8400: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 2c  L_HDR_SZ(pPager,
8410: 20 32 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f   2))/JOURNAL_PG_
8420: 53 5a 28 32 29 3b 0a 20 20 20 20 61 73 73 65 72  SZ(2);.    asser
8430: 74 28 20 6e 52 65 63 2a 4a 4f 55 52 4e 41 4c 5f  t( nRec*JOURNAL_
8440: 50 47 5f 53 5a 28 32 29 2b 4a 4f 55 52 4e 41 4c  PG_SZ(2)+JOURNAL
8450: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 2c 20  _HDR_SZ(pPager, 
8460: 32 29 3d 3d 73 7a 4a 20 29 3b 0a 20 20 7d 0a 20  2)==szJ );.  }. 
8470: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
8480: 28 66 6f 72 6d 61 74 2c 20 26 70 50 61 67 65 72  (format, &pPager
8490: 2d 3e 6a 66 64 2c 20 26 6d 78 50 67 29 3b 0a 20  ->jfd, &mxPg);. 
84a0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
84b0: 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  OK ){.    goto e
84c0: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
84d0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
84e0: 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30  r->origDbSize==0
84f0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   || pPager->orig
8500: 44 62 53 69 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a  DbSize==mxPg );.
8510: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
8520: 54 72 75 6e 63 61 74 65 28 26 70 50 61 67 65 72  Truncate(&pPager
8530: 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 50 41 47  ->fd, SQLITE_PAG
8540: 45 5f 53 49 5a 45 2a 28 6f 66 66 5f 74 29 6d 78  E_SIZE*(off_t)mx
8550: 50 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  Pg);.  if( rc!=S
8560: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8570: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
8580: 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  k;.  }.  pPager-
8590: 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a  >dbSize = mxPg;.
85a0: 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69    .  /* Copy ori
85b0: 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20  ginal pages out 
85c0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
85d0: 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
85e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
85f0: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
8600: 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<nRec; i++){.  
8610: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
8620: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
8630: 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
8640: 6a 66 64 2c 20 66 6f 72 6d 61 74 29 3b 0a 20 20  jfd, format);.  
8650: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8660: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
8670: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
8680: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
8690: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
86a0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
86b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
86c0: 20 50 61 67 65 73 20 74 68 61 74 20 68 61 76 65   Pages that have
86d0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
86e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 75 74   the journal but
86f0: 20 6e 65 76 65 72 20 73 79 6e 63 65 64 0a 20 20   never synced.  
8700: 2a 2a 20 77 68 65 72 65 20 6e 6f 74 20 72 65 73  ** where not res
8710: 74 6f 72 65 64 20 62 79 20 74 68 65 20 6c 6f 6f  tored by the loo
8720: 70 20 61 62 6f 76 65 2e 20 20 57 65 20 68 61 76  p above.  We hav
8730: 65 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 6f  e to restore tho
8740: 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 79  se.  ** pages by
8750: 20 72 65 61 64 69 6e 67 20 74 68 65 6d 20 62 61   reading them ba
8760: 63 6b 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67  ck from the orig
8770: 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2e 0a 20  inal database.. 
8780: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
8790: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
87a0: 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68  ager_reload_cach
87b0: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  e(pPager);.  }..
87c0: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  end_playback:.  
87d0: 69 66 28 20 7a 4d 61 73 74 65 72 20 29 7b 0a 20  if( zMaster ){. 
87e0: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77     /* If there w
87f0: 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  as a master jour
8800: 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75  nal and this rou
8810: 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
8820: 20 74 72 75 65 2c 0a 20 20 20 20 2a 2a 20 73 65   true,.    ** se
8830: 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  e if it is possi
8840: 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68  ble to delete th
8850: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
8860: 2e 20 49 66 20 65 72 72 6f 72 73 20 0a 20 20 20  . If errors .   
8870: 20 2a 2a 20 6f 63 63 75 72 20 64 75 72 69 6e 67   ** occur during
8880: 20 74 68 69 73 20 70 72 6f 63 65 73 73 2c 20 69   this process, i
8890: 67 6e 6f 72 65 20 74 68 65 6d 2e 0a 20 20 20 20  gnore them..    
88a0: 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
88b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
88c0: 20 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65    pager_delmaste
88d0: 72 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  r(zMaster);.    
88e0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  }.    sqliteFree
88f0: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20  (zMaster);.  }. 
8900: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8910: 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 46 49 58  OK ){.    /* FIX
8920: 20 4d 45 3a 20 57 65 20 73 68 6f 75 6c 64 6e 27   ME: We shouldn'
8930: 74 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  t delete the jou
8940: 72 6e 61 6c 20 69 66 20 61 6e 20 65 72 72 6f 72  rnal if an error
8950: 20 6f 63 63 75 72 65 64 20 64 75 72 69 6e 67 0a   occured during.
8960: 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e      ** rollback.
8970: 20 49 74 20 6d 61 79 20 68 61 76 65 20 62 65 65   It may have bee
8980: 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20 65 72  n a transient er
8990: 72 6f 72 20 61 6e 64 20 74 68 65 20 72 6f 6c 6c  ror and the roll
89a0: 62 61 63 6b 20 6d 61 79 0a 20 20 20 20 2a 2a 20  back may.    ** 
89b0: 73 75 63 63 65 65 64 20 6e 65 78 74 20 74 69 6d  succeed next tim
89c0: 65 20 69 74 20 69 73 20 61 74 74 65 6d 70 74 65  e it is attempte
89d0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 61  d..    */.    pa
89e0: 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
89f0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61  pPager);.    pPa
8a00: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
8a10: 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50  PAGER_ERR_CORRUP
8a20: 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  T;.    rc = SQLI
8a30: 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 65  TE_CORRUPT;.  }e
8a40: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  lse{.    rc = pa
8a50: 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
8a60: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
8a70: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
8a80: 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  ** Playback the 
8a90: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
8aa0: 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  l..**.** This is
8ab0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79   similar to play
8ac0: 69 6e 67 20 62 61 63 6b 20 74 68 65 20 74 72 61  ing back the tra
8ad0: 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
8ae0: 20 62 75 74 20 77 69 74 68 0a 2a 2a 20 61 20 66   but with.** a f
8af0: 65 77 20 65 78 74 72 61 20 74 77 69 73 74 73 2e  ew extra twists.
8b00: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54  .**.**    (1)  T
8b10: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
8b20: 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
8b30: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73  se file at the s
8b40: 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20  tart of.**      
8b50: 20 20 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74     the statement
8b60: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 50   is stored in pP
8b70: 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 2c 20  ager->stmtSize, 
8b80: 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20  not in the.**   
8b90: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69        journal fi
8ba0: 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a  le itself..**.**
8bb0: 20 20 20 20 28 32 29 20 20 49 6e 20 61 64 64 69      (2)  In addi
8bc0: 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20  tion to playing 
8bd0: 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65  back the stateme
8be0: 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f  nt journal, also
8bf0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 6c 61 79  .**         play
8c00: 62 61 63 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f  back all pages o
8c10: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
8c20: 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e  n journal beginn
8c30: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 61  ing.**         a
8c40: 74 20 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d  t offset pPager-
8c50: 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73  >stmtJSize..*/.s
8c60: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
8c70: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 50 61  stmt_playback(Pa
8c80: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
8c90: 6f 66 66 5f 74 20 73 7a 4a 3b 20 20 20 20 20 20  off_t szJ;      
8ca0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
8cb0: 20 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75   of the full jou
8cc0: 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  rnal */.  int nR
8cd0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
8ce0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8cf0: 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74  Records */.  int
8d00: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
8d10: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
8d20: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
8d30: 63 3b 0a 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74  c;..  /* Truncat
8d40: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  e the database b
8d50: 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
8d60: 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20  nal size..  */. 
8d70: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
8d80: 72 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d  runcate(&pPager-
8d90: 3e 66 64 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  >fd, SQLITE_PAGE
8da0: 5f 53 49 5a 45 2a 28 6f 66 66 5f 74 29 70 50 61  _SIZE*(off_t)pPa
8db0: 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a  ger->stmtSize);.
8dc0: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
8dd0: 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53   = pPager->stmtS
8de0: 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  ize;..  /* Figur
8df0: 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
8e00: 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
8e10: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
8e20: 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  nal..  */.  asse
8e30: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  rt( pPager->stmt
8e40: 49 6e 55 73 65 20 26 26 20 70 50 61 67 65 72 2d  InUse && pPager-
8e50: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
8e60: 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
8e70: 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30  &pPager->stfd, 0
8e80: 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50 61 67  );.  nRec = pPag
8e90: 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20  er->stmtNRec;.  
8ea0: 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69  .  /* Copy origi
8eb0: 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66  nal pages out of
8ec0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
8ed0: 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20  ournal and back 
8ee0: 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  into the.  ** da
8ef0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f  tabase file.  No
8f00: 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74  te that the stat
8f10: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6c  ement journal al
8f20: 77 61 79 73 20 75 73 65 73 20 66 6f 72 6d 61 74  ways uses format
8f30: 0a 20 20 2a 2a 20 32 20 69 6e 73 74 65 61 64 20  .  ** 2 instead 
8f40: 6f 66 20 66 6f 72 6d 61 74 20 33 20 73 69 6e 63  of format 3 sinc
8f50: 65 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  e it does not ne
8f60: 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e  ed to be concern
8f70: 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 70 6f 77  ed with.  ** pow
8f80: 65 72 20 66 61 69 6c 75 72 65 73 20 63 6f 72 72  er failures corr
8f90: 75 70 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  upting the journ
8fa0: 61 6c 20 61 6e 64 20 63 61 6e 20 74 68 75 73 20  al and can thus 
8fb0: 6f 6d 69 74 20 74 68 65 20 63 68 65 63 6b 73 75  omit the checksu
8fc0: 6d 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ms..  */.  for(i
8fd0: 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69  =nRec-1; i>=0; i
8fe0: 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  --){.    rc = pa
8ff0: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
9000: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70  _page(pPager, &p
9010: 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 32 29 3b  Pager->stfd, 2);
9020: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
9030: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
9040: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
9050: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
9060: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
9070: 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65    }..  /* Figure
9080: 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 70 61   out how many pa
9090: 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63  ges need to be c
90a0: 6f 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65  opied out of the
90b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a   transaction.  *
90c0: 2a 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  * journal..  */.
90d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
90e0: 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66  Seek(&pPager->jf
90f0: 64 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  d, pPager->stmtJ
9100: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Size);.  if( rc!
9110: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9120: 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f    goto end_stmt_
9130: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20  playback;.  }.  
9140: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
9150: 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e  leSize(&pPager->
9160: 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66  jfd, &szJ);.  if
9170: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
9180: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
9190: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
91a0: 20 7d 0a 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a   }.  nRec = (szJ
91b0: 20 2d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a   - pPager->stmtJ
91c0: 53 69 7a 65 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47  Size)/JOURNAL_PG
91d0: 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d  _SZ(journal_form
91e0: 61 74 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 52 65  at);.  for(i=nRe
91f0: 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  c-1; i>=0; i--){
9200: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
9210: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
9220: 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
9230: 72 2d 3e 6a 66 64 2c 20 6a 6f 75 72 6e 61 6c 5f  r->jfd, journal_
9240: 66 6f 72 6d 61 74 29 3b 0a 20 20 20 20 69 66 28  format);.    if(
9250: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
9260: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
9270: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
9280: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  );.      goto en
9290: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
92a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 65 6e  .    }.  }.  .en
92b0: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a  d_stmt_playback:
92c0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
92d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
92e0: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50  er->errMask |= P
92f0: 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54  AGER_ERR_CORRUPT
9300: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
9310: 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20  E_CORRUPT;.  }. 
9320: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
9330: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
9340: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
9350: 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
9360: 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77  s that are allow
9370: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  ed..**.** The ma
9380: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 69 73 20  ximum number is 
9390: 74 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c  the absolute val
93a0: 75 65 20 6f 66 20 74 68 65 20 6d 78 50 61 67 65  ue of the mxPage
93b0: 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 49   parameter..** I
93c0: 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61  f mxPage is nega
93d0: 74 69 76 65 2c 20 74 68 65 20 6e 6f 53 79 6e 63  tive, the noSync
93e0: 20 66 6c 61 67 20 69 73 20 61 6c 73 6f 20 73 65   flag is also se
93f0: 74 2e 20 20 6e 6f 53 79 6e 63 20 62 79 70 61 73  t.  noSync bypas
9400: 73 65 73 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  ses.** calls to 
9410: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 2e  sqlite3OsSync().
9420: 20 20 54 68 65 20 70 61 67 65 72 20 72 75 6e 73    The pager runs
9430: 20 6d 75 63 68 20 66 61 73 74 65 72 20 77 69 74   much faster wit
9440: 68 20 6e 6f 53 79 6e 63 20 6f 6e 2c 0a 2a 2a 20  h noSync on,.** 
9450: 62 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61  but if the opera
9460: 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73  ting system cras
9470: 68 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 20  hes or there is 
9480: 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20  an abrupt power 
9490: 0a 2a 2a 20 66 61 69 6c 75 72 65 2c 20 74 68 65  .** failure, the
94a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d   database file m
94b0: 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20  ight be left in 
94c0: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
94d0: 61 6e 64 0a 2a 2a 20 75 6e 72 65 70 61 69 72 61  and.** unrepaira
94e0: 62 6c 65 20 73 74 61 74 65 2e 20 20 0a 2a 2f 0a  ble state.  .*/.
94f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
9500: 72 5f 73 65 74 5f 63 61 63 68 65 73 69 7a 65 28  r_set_cachesize(
9510: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
9520: 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66  nt mxPage){.  if
9530: 28 20 6d 78 50 61 67 65 3e 3d 30 20 29 7b 0a 20  ( mxPage>=0 ){. 
9540: 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e     pPager->noSyn
9550: 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  c = pPager->temp
9560: 46 69 6c 65 3b 0a 20 20 20 20 69 66 28 20 70 50  File;.    if( pP
9570: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70  ager->noSync ) p
9580: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
9590: 3d 20 30 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a 20  = 0; .  }else{. 
95a0: 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e     pPager->noSyn
95b0: 63 20 3d 20 31 3b 0a 20 20 20 20 6d 78 50 61 67  c = 1;.    mxPag
95c0: 65 20 3d 20 2d 6d 78 50 61 67 65 3b 0a 20 20 7d  e = -mxPage;.  }
95d0: 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30  .  if( mxPage>10
95e0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
95f0: 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b  mxPage = mxPage;
9600: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
9610: 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e  just the robustn
9620: 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  ess of the datab
9630: 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75  ase to damage du
9640: 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a  e to OS crashes.
9650: 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
9660: 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67  ures by changing
9670: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
9680: 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69  yncs()s when wri
9690: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  ting.** the roll
96a0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  back journal.  T
96b0: 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c  here are three l
96c0: 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  evels:.**.**    
96d0: 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65  OFF       sqlite
96e0: 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76  3OsSync() is nev
96f0: 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73  er called.  This
9700: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a   is the default.
9710: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
9720: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e  for temporary an
9730: 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  d transient file
9740: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d  s..**.**    NORM
9750: 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61  AL    The journa
9760: 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65  l is synced once
9770: 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
9780: 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
9790: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
97a0: 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e  base.  This is n
97b0: 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65  ormally adequate
97c0: 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74   protection, but
97d0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
97e0: 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63   it is theoretic
97f0: 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74  ally possible, t
9800: 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b  hough very unlik
9810: 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ely,.**         
9820: 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f       that an ino
9830: 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61  pertune power fa
9840: 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76  ilure could leav
9850: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  e the journal.**
9860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
9870: 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77   a state which w
9880: 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67  ould cause damag
9890: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
98a0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
98b0: 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c    when it is rol
98c0: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
98d0: 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65     FULL      The
98e0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
98f0: 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20  ed twice before 
9900: 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
9910: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
9920: 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69      database (wi
9930: 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  th some addition
9940: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  al information -
9950: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
9960: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
9970: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
9980: 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72  eader - being wr
9990: 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e  itten in between
99a0: 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20   the two.**     
99b0: 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e           syncs).
99c0: 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74    If we assume t
99d0: 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a  hat writing a.**
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
99f0: 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
9a00: 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e   is atomic, then
9a10: 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69   this mode provi
9a20: 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  des.**          
9a30: 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68      assurance th
9a40: 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  at the journal w
9a50: 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75  ill not be corru
9a60: 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20  pted to the.**  
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e              poin
9a80: 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d  t of causing dam
9a90: 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
9aa0: 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ase during rollb
9ab0: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72  ack..**.** Numer
9ac0: 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69  ic values associ
9ad0: 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20  ated with these 
9ae0: 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d  states are OFF==
9af0: 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20  1, NORMAL=2,.** 
9b00: 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 76  and FULL=3..*/.v
9b10: 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
9b20: 5f 73 65 74 5f 73 61 66 65 74 79 5f 6c 65 76 65  _set_safety_leve
9b30: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
9b40: 20 69 6e 74 20 6c 65 76 65 6c 29 7b 0a 20 20 70   int level){.  p
9b50: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
9b60: 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61   level==1 || pPa
9b70: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
9b80: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
9b90: 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20  c = level==3 && 
9ba0: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
9bb0: 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  e;.  if( pPager-
9bc0: 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72  >noSync ) pPager
9bd0: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
9be0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
9bf0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
9c00: 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20   Write the name 
9c10: 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f  of the file into
9c20: 20 7a 4e 61 6d 65 0a 2a 2a 20 28 7a 4e 61 6d 65   zName.** (zName
9c30: 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
9c40: 74 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  t SQLITE_TEMPNAM
9c50: 45 5f 53 49 5a 45 20 62 79 74 65 73 20 6c 6f 6e  E_SIZE bytes lon
9c60: 67 2e 29 20 20 57 72 69 74 65 0a 2a 2a 20 74 68  g.)  Write.** th
9c70: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
9c80: 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74  r into *fd.  Ret
9c90: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
9ca0: 20 73 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65   success or some
9cb0: 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20  .** other error 
9cc0: 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e  code if we fail.
9cd0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 53 20 77 69  .**.** The OS wi
9ce0: 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
9cf0: 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70   delete the temp
9d00: 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20  orary file when 
9d10: 69 74 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e  it is.** closed.
9d20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
9d30: 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e  qlite3pager_open
9d40: 74 65 6d 70 28 63 68 61 72 20 2a 7a 46 69 6c 65  temp(char *zFile
9d50: 2c 20 4f 73 46 69 6c 65 20 2a 66 64 29 7b 0a 20  , OsFile *fd){. 
9d60: 20 69 6e 74 20 63 6e 74 20 3d 20 38 3b 0a 20 20   int cnt = 8;.  
9d70: 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 0a 20 20  int rc;.  do{.  
9d80: 20 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c    cnt--;.    sql
9d90: 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61  ite3OsTempFileNa
9da0: 6d 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72  me(zFile);.    r
9db0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
9dc0: 6e 45 78 63 6c 75 73 69 76 65 28 7a 46 69 6c 65  nExclusive(zFile
9dd0: 2c 20 66 64 2c 20 31 29 3b 0a 20 20 7d 77 68 69  , fd, 1);.  }whi
9de0: 6c 65 28 20 63 6e 74 3e 30 20 26 26 20 72 63 21  le( cnt>0 && rc!
9df0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
9e00: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
9e10: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
9e20: 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20   page cache and 
9e30: 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  put a pointer to
9e40: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
9e50: 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20  in *ppPager..** 
9e60: 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  The file to be c
9e70: 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65  ached need not e
9e80: 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20  xist.  The file 
9e90: 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e  is not locked un
9ea0: 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  til.** the first
9eb0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
9ec0: 70 61 67 65 72 5f 67 65 74 28 29 20 61 6e 64 20  pager_get() and 
9ed0: 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65  is only held ope
9ee0: 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c  n until the.** l
9ef0: 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65  ast page is rele
9f00: 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ased using sqlit
9f10: 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29 2e  e3pager_unref().
9f20: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  .**.** If zFilen
9f30: 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e  ame is NULL then
9f40: 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65   a randomly-name
9f50: 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  d temporary file
9f60: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
9f70: 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66  nd used as the f
9f80: 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
9f90: 2e 20 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c  .  The file will
9fa0: 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61   be deleted.** a
9fb0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65  utomatically whe
9fc0: 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
9fd0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
9fe0: 67 65 72 5f 6f 70 65 6e 28 0a 20 20 50 61 67 65  ger_open(.  Page
9ff0: 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20  r **ppPager,    
a000: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
a010: 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
a020: 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
a030: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
a040: 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me,   /* Name of
a050: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
a060: 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
a070: 69 6e 74 20 6d 78 50 61 67 65 2c 20 20 20 20 20  int mxPage,     
a080: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 20           /* Max 
a090: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
a0a0: 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20  ory cache pages 
a0b0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
a0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a0d0: 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70   Extra bytes app
a0e0: 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  end to each in-m
a0f0: 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
a100: 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 2c 20  int useJournal, 
a110: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45           /* TRUE
a120: 20 74 6f 20 75 73 65 20 61 20 72 6f 6c 6c 62 61   to use a rollba
a130: 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68  ck journal on th
a140: 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 76 6f 69  is file */.  voi
a150: 64 20 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  d  *pBusyHandler
a160: 20 20 20 20 20 20 2f 2a 20 42 75 73 79 20 63 61        /* Busy ca
a170: 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 50  llback */.){.  P
a180: 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20  ager *pPager;.  
a190: 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e  char *zFullPathn
a1a0: 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 61 6d 65 4c  ame;.  int nameL
a1b0: 65 6e 3b 0a 20 20 4f 73 46 69 6c 65 20 66 64 3b  en;.  OsFile fd;
a1c0: 0a 20 20 69 6e 74 20 72 63 2c 20 69 3b 0a 20 20  .  int rc, i;.  
a1d0: 69 6e 74 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20  int tempFile;.  
a1e0: 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20  int memDb = 0;. 
a1f0: 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20   int readOnly = 
a200: 30 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b  0;.  char zTemp[
a210: 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
a220: 53 49 5a 45 5d 3b 0a 0a 20 20 2a 70 70 50 61 67  SIZE];..  *ppPag
a230: 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71  er = 0;.  if( sq
a240: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
a250: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
a260: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
a270: 20 20 7d 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e    }.  if( zFilen
a280: 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
a290: 5b 30 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 73  [0] ){.    if( s
a2a0: 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
a2b0: 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29  ":memory:")==0 )
a2c0: 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20  {.      memDb = 
a2d0: 31 3b 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61  1;.      zFullPa
a2e0: 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 4d  thname = sqliteM
a2f0: 61 6c 6c 6f 63 28 34 29 3b 0a 20 20 20 20 20 20  alloc(4);.      
a300: 69 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  if( zFullPathnam
a310: 65 20 29 20 73 74 72 63 70 79 28 7a 46 75 6c 6c  e ) strcpy(zFull
a320: 50 61 74 68 6e 61 6d 65 2c 20 22 6e 69 6c 22 29  Pathname, "nil")
a330: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
a340: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
a350: 65 7b 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61  e{.      zFullPa
a360: 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
a370: 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a  OsFullPathname(z
a380: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
a390: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
a3a0: 70 65 6e 52 65 61 64 57 72 69 74 65 28 7a 46 75  penReadWrite(zFu
a3b0: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66 64 2c  llPathname, &fd,
a3c0: 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20   &readOnly);.   
a3d0: 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b     tempFile = 0;
a3e0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
a3f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
a400: 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a  pager_opentemp(z
a410: 54 65 6d 70 2c 20 26 66 64 29 3b 0a 20 20 20 20  Temp, &fd);.    
a420: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 54 65 6d  zFilename = zTem
a430: 70 3b 0a 20 20 20 20 7a 46 75 6c 6c 50 61 74 68  p;.    zFullPath
a440: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  name = sqlite3Os
a450: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69  FullPathname(zFi
a460: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 74 65 6d  lename);.    tem
a470: 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 7d 0a 20  pFile = 1;.  }. 
a480: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c   if( sqlite3_mal
a490: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20  loc_failed ){.  
a4a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a4b0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
a4c0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
a4d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
a4e0: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
a4f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
a500: 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d  TE_CANTOPEN;.  }
a510: 0a 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72  .  nameLen = str
a520: 6c 65 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  len(zFullPathnam
a530: 65 29 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 73  e);.  pPager = s
a540: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
a550: 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20 6e  eof(*pPager) + n
a560: 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30 20 29 3b  ameLen*3 + 30 );
a570: 0a 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 30  .  if( pPager==0
a580: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
a590: 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20  sClose(&fd);.   
a5a0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c   sqliteFree(zFul
a5b0: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
a5c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
a5d0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 53 45 54 5f 50  MEM;.  }.  SET_P
a5e0: 41 47 45 52 28 70 50 61 67 65 72 29 3b 0a 20 20  AGER(pPager);.  
a5f0: 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
a600: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50 61 67  e = (char*)&pPag
a610: 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d  er[1];.  pPager-
a620: 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d 20 26 70  >zDirectory = &p
a630: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
a640: 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70  [nameLen+1];.  p
a650: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20  Pager->zJournal 
a660: 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  = &pPager->zDire
a670: 63 74 6f 72 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d  ctory[nameLen+1]
a680: 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65  ;.  strcpy(pPage
a690: 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46  r->zFilename, zF
a6a0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
a6b0: 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  strcpy(pPager->z
a6c0: 44 69 72 65 63 74 6f 72 79 2c 20 7a 46 75 6c 6c  Directory, zFull
a6d0: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 66 6f 72  Pathname);.  for
a6e0: 28 69 3d 6e 61 6d 65 4c 65 6e 3b 20 69 3e 30 20  (i=nameLen; i>0 
a6f0: 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  && pPager->zDire
a700: 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b  ctory[i-1]!='/';
a710: 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e   i--){}.  if( i>
a720: 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  0 ) pPager->zDir
a730: 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b  ectory[i-1] = 0;
a740: 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72  .  strcpy(pPager
a750: 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c  ->zJournal, zFul
a760: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 71  lPathname);.  sq
a770: 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61  liteFree(zFullPa
a780: 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70  thname);.  strcp
a790: 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  y(&pPager->zJour
a7a0: 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d  nal[nameLen], "-
a7b0: 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20 20 70 50 61  journal");.  pPa
a7c0: 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20  ger->fd = fd;.  
a7d0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
a7e0: 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  pen = 0;.  pPage
a7f0: 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  r->useJournal = 
a800: 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d  useJournal && !m
a810: 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
a820: 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  stmtOpen = 0;.  
a830: 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
a840: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
a850: 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 70 50 61  >nRef = 0;.  pPa
a860: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 65  ger->dbSize = me
a870: 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d  mDb-1;.  pPager-
a880: 3e 70 61 67 65 53 69 7a 65 20 3d 20 53 51 4c 49  >pageSize = SQLI
a890: 54 45 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20  TE_PAGE_SIZE;.  
a8a0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
a8b0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
a8c0: 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 0a 20  stmtJSize = 0;. 
a8d0: 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
a8e0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78   0;.  pPager->mx
a8f0: 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3e 35 20  Page = mxPage>5 
a900: 3f 20 6d 78 50 61 67 65 20 3a 20 31 30 3b 0a 20  ? mxPage : 10;. 
a910: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
a920: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20   PAGER_UNLOCK;. 
a930: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
a940: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
a950: 74 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70 46  tempFile = tempF
a960: 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ile;.  pPager->m
a970: 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20  emDb = memDb;.  
a980: 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
a990: 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 70   = readOnly;.  p
a9a0: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
a9b0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
a9c0: 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  oSync = pPager->
a9d0: 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65  tempFile || !use
a9e0: 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65  Journal;.  pPage
a9f0: 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20  r->pFirst = 0;. 
aa00: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
aa10: 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61  ynced = 0;.  pPa
aa20: 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a  ger->pLast = 0;.
aa30: 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61    pPager->nExtra
aa40: 20 3d 20 6e 45 78 74 72 61 3b 0a 20 20 70 50 61   = nExtra;.  pPa
aa50: 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
aa60: 72 20 3d 20 28 42 75 73 79 48 61 6e 64 6c 65 72  r = (BusyHandler
aa70: 20 2a 29 70 42 75 73 79 48 61 6e 64 6c 65 72 3b   *)pBusyHandler;
aa80: 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  .  memset(pPager
aa90: 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
aaa0: 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
aab0: 29 29 3b 0a 20 20 2a 70 70 50 61 67 65 72 20 3d  ));.  *ppPager =
aac0: 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72   pPager;.  retur
aad0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
aae0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65  /*.** Set the de
aaf0: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69  structor for thi
ab00: 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74  s pager.  If not
ab10: 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72   NULL, the destr
ab20: 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a  uctor is called.
ab30: 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ** when the refe
ab40: 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65  rence count on e
ab50: 61 63 68 20 70 61 67 65 20 72 65 61 63 68 65 73  ach page reaches
ab60: 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74   zero.  The dest
ab70: 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65  ructor can.** be
ab80: 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75   used to clean u
ab90: 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  p information in
aba0: 20 74 68 65 20 65 78 74 72 61 20 73 65 67 6d 65   the extra segme
abb0: 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65  nt appended to e
abc0: 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ach page..**.** 
abd0: 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  The destructor i
abe0: 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20  s not called as 
abf0: 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33  a result sqlite3
ac00: 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20 20  pager_close().  
ac10: 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20  .** Destructors 
ac20: 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20  are only called 
ac30: 62 79 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  by sqlite3pager_
ac40: 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64  unref()..*/.void
ac50: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
ac60: 74 5f 64 65 73 74 72 75 63 74 6f 72 28 50 61 67  t_destructor(Pag
ac70: 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64  er *pPager, void
ac80: 20 28 2a 78 44 65 73 63 29 28 76 6f 69 64 2a 2c   (*xDesc)(void*,
ac90: 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d  int)){.  pPager-
aca0: 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78  >xDestructor = x
acb0: 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Desc;.}../*.** S
acc0: 65 74 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  et the reinitial
acd0: 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  izer for this pa
ace0: 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c  ger.  If not NUL
acf0: 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  L, the reinitial
ad00: 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  izer.** is calle
ad10: 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  d when the conte
ad20: 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  nt of a page in 
ad30: 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
ad40: 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
ad50: 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20  l.** value as a 
ad60: 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c  result of a roll
ad70: 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62  back.  The callb
ad80: 61 63 6b 20 67 69 76 65 73 20 68 69 67 68 65 72  ack gives higher
ad90: 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61  -level code.** a
ada0: 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
adb0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 45 58 54   restore the EXT
adc0: 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67  RA section to ag
add0: 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
ade0: 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61  tored.** page da
adf0: 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ta..*/.void sqli
ae00: 74 65 33 70 61 67 65 72 5f 73 65 74 5f 72 65 69  te3pager_set_rei
ae10: 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  niter(Pager *pPa
ae20: 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69  ger, void (*xRei
ae30: 6e 69 74 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29  nit)(void*,int))
ae40: 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69  {.  pPager->xRei
ae50: 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b  niter = xReinit;
ae60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
ae70: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
ae80: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
ae90: 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f  e disk file asso
aea0: 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70  ciated with.** p
aeb0: 50 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  Pager..*/.int sq
aec0: 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63  lite3pager_pagec
aed0: 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
aee0: 65 72 29 7b 0a 20 20 6f 66 66 5f 74 20 6e 3b 0a  er){.  off_t n;.
aef0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
af00: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  !=0 );.  if( pPa
af10: 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29  ger->dbSize>=0 )
af20: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  {.    return pPa
af30: 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d  ger->dbSize;.  }
af40: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73  .  if( sqlite3Os
af50: 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72  FileSize(&pPager
af60: 2d 3e 66 64 2c 20 26 6e 29 21 3d 53 51 4c 49 54  ->fd, &n)!=SQLIT
af70: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
af80: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50  er->errMask |= P
af90: 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 3b 0a 20  AGER_ERR_DISK;. 
afa0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
afb0: 0a 20 20 6e 20 2f 3d 20 53 51 4c 49 54 45 5f 50  .  n /= SQLITE_P
afc0: 41 47 45 5f 53 49 5a 45 3b 0a 20 20 69 66 28 20  AGE_SIZE;.  if( 
afd0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
afe0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  AGER_UNLOCK ){. 
aff0: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
b000: 65 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74  e = n;.  }.  ret
b010: 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
b020: 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
b030: 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ion.*/.static in
b040: 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61  t syncJournal(Pa
b050: 67 65 72 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  ger*, const char
b060: 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  *);.../*.** Unli
b070: 6e 6b 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  nk a page from t
b080: 68 65 20 66 72 65 65 20 6c 69 73 74 20 28 74 68  he free list (th
b090: 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  e list of all pa
b0a0: 67 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d  ges where nRef==
b0b0: 30 29 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69  0).** and from i
b0c0: 74 73 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f  ts hash collisio
b0d0: 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74  n chain..*/.stat
b0e0: 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61  ic void unlinkPa
b0f0: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
b100: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
b110: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a  = pPg->pPager;..
b120: 20 20 2f 2a 20 4b 65 65 70 20 74 68 65 20 70 46    /* Keep the pF
b130: 69 72 73 74 53 79 6e 63 65 64 20 70 6f 69 6e 74  irstSynced point
b140: 65 72 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  er pointing at t
b150: 68 65 20 66 69 72 73 74 20 73 79 6e 63 68 72 6f  he first synchro
b160: 6e 69 7a 65 64 20 70 61 67 65 20 2a 2f 0a 20 20  nized page */.  
b170: 69 66 28 20 70 50 67 3d 3d 70 50 61 67 65 72 2d  if( pPg==pPager-
b180: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b  >pFirstSynced ){
b190: 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20  .    PgHdr *p = 
b1a0: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
b1b0: 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20      while( p && 
b1c0: 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70  p->needSync ){ p
b1d0: 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b   = p->pNextFree;
b1e0: 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
b1f0: 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b  FirstSynced = p;
b200: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e  .  }..  /* Unlin
b210: 6b 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  k from the freel
b220: 69 73 74 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ist */.  if( pPg
b230: 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20  ->pPrevFree ){. 
b240: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
b250: 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
b260: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
b270: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
b280: 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72  rt( pPager->pFir
b290: 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  st==pPg );.    p
b2a0: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
b2b0: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
b2c0: 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
b2d0: 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20  NextFree ){.    
b2e0: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e  pPg->pNextFree->
b2f0: 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d  pPrevFree = pPg-
b300: 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 65  >pPrevFree;.  }e
b310: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
b320: 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d   pPager->pLast==
b330: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65  pPg );.    pPage
b340: 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e  r->pLast = pPg->
b350: 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 0a 20  pPrevFree;.  }. 
b360: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20   pPg->pNextFree 
b370: 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
b380: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69   = 0;..  /* Unli
b390: 6e 6b 20 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f  nk from the pgno
b3a0: 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20   hash table */. 
b3b0: 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48   if( pPg->pNextH
b3c0: 61 73 68 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  ash ){.    pPg->
b3d0: 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76  pNextHash->pPrev
b3e0: 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65  Hash = pPg->pPre
b3f0: 76 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28  vHash;.  }.  if(
b400: 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20   pPg->pPrevHash 
b410: 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65  ){.    pPg->pPre
b420: 76 48 61 73 68 2d 3e 70 4e 65 78 74 48 61 73 68  vHash->pNextHash
b430: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73   = pPg->pNextHas
b440: 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  h;.  }else{.    
b450: 69 6e 74 20 68 20 3d 20 70 61 67 65 72 5f 68 61  int h = pager_ha
b460: 73 68 28 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  sh(pPg->pgno);. 
b470: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
b480: 72 2d 3e 61 48 61 73 68 5b 68 5d 3d 3d 70 50 67  r->aHash[h]==pPg
b490: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
b4a0: 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 2d 3e  aHash[h] = pPg->
b4b0: 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20  pNextHash;.  }. 
b4c0: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
b4d0: 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  = pPg->pPrevHash
b4e0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
b4f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
b500: 73 65 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20  sed to truncate 
b510: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
b520: 61 62 61 73 65 2e 20 20 44 65 6c 65 74 65 0a 2a  abase.  Delete.*
b530: 2a 20 65 76 65 72 79 20 70 61 67 65 73 20 77 68  * every pages wh
b540: 6f 73 65 20 70 67 6e 6f 20 69 73 20 6c 61 72 67  ose pgno is larg
b550: 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e  er than pPager->
b560: 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75 6e  dbSize and is un
b570: 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20 52  referenced..** R
b580: 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20  eferenced pages 
b590: 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61 67  larger than pPag
b5a0: 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65 20 7a  er->dbSize are z
b5b0: 65 72 6f 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eroed..*/.static
b5c0: 20 76 6f 69 64 20 6d 65 6d 6f 72 79 54 72 75 6e   void memoryTrun
b5d0: 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
b5e0: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
b5f0: 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50  g;.  PgHdr **ppP
b600: 67 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 20  g;.  int dbSize 
b610: 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
b620: 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26 70 50 61  ;..  ppPg = &pPa
b630: 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68 69  ger->pAll;.  whi
b640: 6c 65 28 20 28 70 50 67 20 3d 20 2a 70 70 50 67  le( (pPg = *ppPg
b650: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )!=0 ){.    if( 
b660: 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a  pPg->pgno<=dbSiz
b670: 65 20 29 7b 0a 20 20 20 20 20 20 70 70 50 67 20  e ){.      ppPg 
b680: 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  = &pPg->pNextAll
b690: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
b6a0: 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20  pPg->nRef>0 ){. 
b6b0: 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
b6c0: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
b6d0: 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
b6e0: 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 70 50 67  ize);.      ppPg
b6f0: 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c   = &pPg->pNextAl
b700: 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  l;.    }else{.  
b710: 20 20 20 20 2a 70 70 50 67 20 3d 20 70 50 67 2d      *ppPg = pPg-
b720: 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20  >pNextAll;.     
b730: 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29   unlinkPage(pPg)
b740: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
b750: 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70  ee(pPg);.      p
b760: 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a  Pager->nPage--;.
b770: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
b780: 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  ** Truncate the 
b790: 66 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d 62  file to the numb
b7a0: 65 72 20 6f 66 20 70 61 67 65 73 20 73 70 65 63  er of pages spec
b7b0: 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ified..*/.int sq
b7c0: 6c 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e 63  lite3pager_trunc
b7d0: 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
b7e0: 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  r, Pgno nPage){.
b7f0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
b800: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30  pPager->dbSize<0
b810: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 70   ){.    sqlite3p
b820: 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70  ager_pagecount(p
b830: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  Pager);.  }.  if
b840: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
b850: 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  k!=0 ){.    rc =
b860: 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70   pager_errcode(p
b870: 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
b880: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
b890: 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65   nPage>=(unsigne
b8a0: 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  d)pPager->dbSize
b8b0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
b8c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
b8d0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  if( pPager->memD
b8e0: 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  b ){.    pPager-
b8f0: 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
b900: 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63  .    memoryTrunc
b910: 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ate(pPager);.   
b920: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b930: 4b 3b 0a 20 20 7d 0a 20 20 73 79 6e 63 4a 6f 75  K;.  }.  syncJou
b940: 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b  rnal(pPager, 0);
b950: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
b960: 73 54 72 75 6e 63 61 74 65 28 26 70 50 61 67 65  sTruncate(&pPage
b970: 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 50 41  r->fd, SQLITE_PA
b980: 47 45 5f 53 49 5a 45 2a 28 6f 66 66 5f 74 29 6e  GE_SIZE*(off_t)n
b990: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  Page);.  if( rc=
b9a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b9b0: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
b9c0: 20 3d 20 6e 50 61 67 65 3b 0a 20 20 7d 0a 20 20   = nPage;.  }.  
b9d0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
b9e0: 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
b9f0: 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72   page cache.  Fr
ba00: 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e  ee all memory an
ba10: 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65  d close all file
ba20: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72  s..**.** If a tr
ba30: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e  ansaction was in
ba40: 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74   progress when t
ba50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
ba60: 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74  alled, that.** t
ba70: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
ba80: 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20  lled back.  All 
ba90: 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
baa0: 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
bab0: 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d  d.** and their m
bac0: 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20  emory is freed. 
bad0: 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
bae0: 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63  use a page assoc
baf0: 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
bb00: 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66  is page cache af
bb10: 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
bb20: 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c  n returns will l
bb30: 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20  ikely.** result 
bb40: 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
bb50: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
bb60: 65 72 5f 63 6c 6f 73 65 28 50 61 67 65 72 20 2a  er_close(Pager *
bb70: 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
bb80: 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20   *pPg, *pNext;. 
bb90: 20 73 77 69 74 63 68 28 20 70 50 61 67 65 72 2d   switch( pPager-
bba0: 3e 73 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61  >state ){.    ca
bbb0: 73 65 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  se PAGER_RESERVE
bbc0: 44 3a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  D:.    case PAGE
bbd0: 52 5f 45 58 43 4c 55 53 49 56 45 3a 20 7b 0a 20  R_EXCLUSIVE: {. 
bbe0: 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
bbf0: 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
bc00: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  r);.      if( !p
bc10: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
bc20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
bc30: 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d  sUnlock(&pPager-
bc40: 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  >fd, NO_LOCK);. 
bc50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
bc60: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
bc70: 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20  rnalOpen==0 );. 
bc80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bc90: 7d 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  }.    case PAGER
bca0: 5f 53 48 41 52 45 44 3a 20 7b 0a 20 20 20 20 20  _SHARED: {.     
bcb0: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65   if( !pPager->me
bcc0: 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73  mDb ){.        s
bcd0: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26  qlite3OsUnlock(&
bce0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c  pPager->fd, NO_L
bcf0: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
bd00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
bd10: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
bd20: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68        /* Do noth
bd30: 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  ing */.      bre
bd40: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
bd50: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
bd60: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
bd70: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
bd80: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
bd90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
bda0: 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28  (pPg);.  }.  if(
bdb0: 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
bdc0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
bdd0: 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 66  Close(&pPager->f
bde0: 64 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  d);.  }.  assert
bdf0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
be00: 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 2f 2a  lOpen==0 );.  /*
be10: 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65 20   Temp files are 
be20: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
be30: 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f 53 0a  leted by the OS.
be40: 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72 2d    ** if( pPager-
be50: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a  >tempFile ){.  *
be60: 2a 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  *   sqlite3OsDel
be70: 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ete(pPager->zFil
be80: 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20  ename);.  ** }. 
be90: 20 2a 2f 0a 20 20 43 4c 52 5f 50 41 47 45 52 28   */.  CLR_PAGER(
bea0: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
beb0: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
bec0: 21 3d 28 63 68 61 72 2a 29 26 70 50 61 67 65 72  !=(char*)&pPager
bed0: 5b 31 5d 20 29 7b 0a 20 20 20 20 61 73 73 65 72  [1] ){.    asser
bee0: 74 28 20 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e  t( 0 );  /* Cann
bef0: 6f 74 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20  ot happen */.   
bf00: 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
bf10: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  er->zFilename);.
bf20: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
bf30: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
bf40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
bf50: 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  (pPager->zDirect
bf60: 6f 72 79 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ory);.  }.  sqli
bf70: 74 65 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a  teFree(pPager);.
bf80: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
bf90: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
bfa0: 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  urn the page num
bfb0: 62 65 72 20 66 6f 72 20 74 68 65 20 67 69 76 65  ber for the give
bfc0: 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a  n page data..*/.
bfd0: 50 67 6e 6f 20 73 71 6c 69 74 65 33 70 61 67 65  Pgno sqlite3page
bfe0: 72 5f 70 61 67 65 6e 75 6d 62 65 72 28 76 6f 69  r_pagenumber(voi
bff0: 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
c000: 64 72 20 2a 70 20 3d 20 44 41 54 41 5f 54 4f 5f  dr *p = DATA_TO_
c010: 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
c020: 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a  return p->pgno;.
c030: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67  }../*.** The pag
c040: 65 5f 72 65 66 28 29 20 66 75 6e 63 74 69 6f 6e  e_ref() function
c050: 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20   increments the 
c060: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
c070: 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49  for a page..** I
c080: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 63 75  f the page is cu
c090: 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66  rrently on the f
c0a0: 72 65 65 6c 69 73 74 20 28 74 68 65 20 72 65 66  reelist (the ref
c0b0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
c0c0: 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65  zero) then.** re
c0d0: 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65  move it from the
c0e0: 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a   freelist..**.**
c0f0: 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79   For non-test sy
c100: 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28  stems, page_ref(
c110: 29 20 69 73 20 61 20 6d 61 63 72 6f 20 74 68 61  ) is a macro tha
c120: 74 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65  t calls _page_re
c130: 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66  f().** online of
c140: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
c150: 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20 46  ount is zero.  F
c160: 6f 72 20 74 65 73 74 20 73 79 73 74 65 6d 73 2c  or test systems,
c170: 20 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69   page_ref().** i
c180: 73 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f  s a real functio
c190: 6e 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  n so that we can
c1a0: 20 73 65 74 20 62 72 65 61 6b 70 6f 69 6e 74 73   set breakpoints
c1b0: 20 61 6e 64 20 74 72 61 63 65 20 69 74 2e 0a 2a   and trace it..*
c1c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f 70  /.static void _p
c1d0: 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70  age_ref(PgHdr *p
c1e0: 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
c1f0: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  nRef==0 ){.    /
c200: 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 63 75  * The page is cu
c210: 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66  rrently on the f
c220: 72 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65  reelist.  Remove
c230: 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   it. */.    if( 
c240: 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72  pPg==pPg->pPager
c250: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29  ->pFirstSynced )
c260: 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  {.      PgHdr *p
c270: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
c280: 65 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  e;.      while( 
c290: 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63  p && p->needSync
c2a0: 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74   ){ p = p->pNext
c2b0: 46 72 65 65 3b 20 7d 0a 20 20 20 20 20 20 70 50  Free; }.      pP
c2c0: 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g->pPager->pFirs
c2d0: 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20  tSynced = p;.   
c2e0: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
c2f0: 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
c300: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
c310: 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
c320: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
c330: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c340: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69  pPg->pPager->pFi
c350: 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  rst = pPg->pNext
c360: 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Free;.    }.    
c370: 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  if( pPg->pNextFr
c380: 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ee ){.      pPg-
c390: 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65  >pNextFree->pPre
c3a0: 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72  vFree = pPg->pPr
c3b0: 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73  evFree;.    }els
c3c0: 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  e{.      pPg->pP
c3d0: 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50  ager->pLast = pP
c3e0: 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20  g->pPrevFree;.  
c3f0: 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61    }.    pPg->pPa
c400: 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d  ger->nRef++;.  }
c410: 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a  .  pPg->nRef++;.
c420: 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
c430: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
c440: 54 45 53 54 0a 20 20 73 74 61 74 69 63 20 76 6f  TEST.  static vo
c450: 69 64 20 70 61 67 65 5f 72 65 66 28 50 67 48 64  id page_ref(PgHd
c460: 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69 66 28  r *pPg){.    if(
c470: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
c480: 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72 65 66  .      _page_ref
c490: 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pPg);.    }else
c4a0: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 52 65  {.      pPg->nRe
c4b0: 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46 49 4e  f++;.      REFIN
c4c0: 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  FO(pPg);.    }. 
c4d0: 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   }.#else.# defin
c4e0: 65 20 70 61 67 65 5f 72 65 66 28 50 29 20 20 20  e page_ref(P)   
c4f0: 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70  ((P)->nRef==0?_p
c500: 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f 69 64  age_ref(P):(void
c510: 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65  )(P)->nRef++).#e
c520: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  ndif../*.** Incr
c530: 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
c540: 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  nce count for a 
c550: 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75 74  page.  The input
c560: 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61   pointer is.** a
c570: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
c580: 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a  e page data..*/.
c590: 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
c5a0: 5f 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74 61  _ref(void *pData
c5b0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
c5c0: 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
c5d0: 70 44 61 74 61 29 3b 0a 20 20 70 61 67 65 5f 72  pData);.  page_r
c5e0: 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72  ef(pPg);.  retur
c5f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
c600: 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a  /*.** Sync the j
c610: 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65  ournal.  In othe
c620: 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75  r words, make su
c630: 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73  re all the pages
c640: 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65   that have.** be
c650: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
c660: 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61  e journal have a
c670: 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20  ctually reached 
c680: 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74  the surface of t
c690: 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20  he.** disk.  It 
c6a0: 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d  is not safe to m
c6b0: 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67 69 6e  odify the origin
c6c0: 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
c6d0: 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20   until after.** 
c6e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
c6f0: 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20 49 66  been synced.  If
c700: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
c710: 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69 66 69  tabase is modifi
c720: 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  ed before.** the
c730: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
c740: 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72 20 66  ed and a power f
c750: 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c 20 74  ailure occurs, t
c760: 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72  he unsynced jour
c770: 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c  nal.** data woul
c780: 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20 77 65  d be lost and we
c790: 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c 65   would be unable
c7a0: 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72   to completely r
c7b0: 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64  ollback the.** d
c7c0: 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e  atabase changes.
c7d0: 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75    Database corru
c7e0: 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75  ption would occu
c7f0: 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72  r..** .** This r
c800: 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70 64 61  outine also upda
c810: 74 65 73 20 74 68 65 20 6e 52 65 63 20 66 69 65  tes the nRec fie
c820: 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ld in the header
c830: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   of the journal.
c840: 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74  .** (See comment
c850: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72 5f 70  s on the pager_p
c860: 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  layback() routin
c870: 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  e for additional
c880: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a   information.).*
c890: 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20 6d 6f  * If the sync mo
c8a0: 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20  de is FULL, two 
c8b0: 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75 72  syncs will occur
c8c0: 2e 20 20 46 69 72 73 74 20 74 68 65 20 77 68 6f  .  First the who
c8d0: 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73  le journal.** is
c8e0: 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20 74 68   synced, then th
c8f0: 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20  e nRec field is 
c900: 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20 61 20  updated, then a 
c910: 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75  second sync occu
c920: 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65  rs..**.** For te
c930: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
c940: 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  s, we do not car
c950: 65 20 69 66 20 77 65 20 61 72 65 20 61 62 6c 65  e if we are able
c960: 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20   to rollback.** 
c970: 61 66 74 65 72 20 61 20 70 6f 77 65 72 20 66 61  after a power fa
c980: 69 6c 75 72 65 2c 20 73 6f 20 73 79 6e 63 20 6f  ilure, so sync o
c990: 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ccurs..**.** Thi
c9a0: 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73  s routine clears
c9b0: 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69   the needSync fi
c9c0: 65 6c 64 20 6f 66 20 65 76 65 72 79 20 70 61 67  eld of every pag
c9d0: 65 20 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69  e current held i
c9e0: 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  n.** memory..*/.
c9f0: 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
ca00: 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
ca10: 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ager, const char
ca20: 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 50 67   *zMaster){.  Pg
ca30: 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
ca40: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
ca50: 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a  .  /* Sync the j
ca60: 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f  ournal before mo
ca70: 64 69 66 79 69 6e 67 20 74 68 65 20 6d 61 69 6e  difying the main
ca80: 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 28   database.  ** (
ca90: 61 73 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69  assuming there i
caa0: 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  s a journal and 
cab0: 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  it needs to be s
cac0: 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69  ynced.).  */.  i
cad0: 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  f( pPager->needS
cae0: 79 6e 63 20 7c 7c 20 7a 4d 61 73 74 65 72 20 29  ync || zMaster )
caf0: 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  {.    if( !pPage
cb00: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
cb10: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
cb20: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
cb30: 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73   );.      /* ass
cb40: 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f  ert( !pPager->no
cb50: 53 79 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e  Sync ); // noSyn
cb60: 63 20 6d 69 67 68 74 20 62 65 20 73 65 74 20 69  c might be set i
cb70: 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20  f synchronous.  
cb80: 20 20 20 20 2a 2a 20 77 61 73 20 74 75 72 6e 65      ** was turne
cb90: 64 20 6f 66 66 20 61 66 74 65 72 20 74 68 65 20  d off after the 
cba0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
cbb0: 73 74 61 72 74 65 64 2e 20 20 54 69 63 6b 65 74  started.  Ticket
cbc0: 20 23 36 31 35 20 2a 2f 0a 23 69 66 6e 64 65 66   #615 */.#ifndef
cbd0: 20 4e 44 45 42 55 47 0a 20 20 20 20 20 20 7b 0a   NDEBUG.      {.
cbe0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
cbf0: 73 75 72 65 20 74 68 65 20 70 50 61 67 65 72 2d  sure the pPager-
cc00: 3e 6e 52 65 63 20 63 6f 75 6e 74 65 72 20 77 65  >nRec counter we
cc10: 20 61 72 65 20 6b 65 65 70 69 6e 67 20 61 67 72   are keeping agr
cc20: 65 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 77  ees.        ** w
cc30: 69 74 68 20 74 68 65 20 6e 52 65 63 20 63 6f 6d  ith the nRec com
cc40: 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73  puted from the s
cc50: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
cc60: 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  al file..       
cc70: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66 5f   */.        off_
cc80: 74 20 68 64 72 53 7a 2c 20 70 67 53 7a 2c 20 6a  t hdrSz, pgSz, j
cc90: 53 7a 3b 0a 20 20 20 20 20 20 20 20 68 64 72 53  Sz;.        hdrS
cca0: 7a 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  z = JOURNAL_HDR_
ccb0: 53 5a 28 70 50 61 67 65 72 2c 20 6a 6f 75 72 6e  SZ(pPager, journ
ccc0: 61 6c 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 20 20  al_format);.    
ccd0: 20 20 20 20 70 67 53 7a 20 3d 20 4a 4f 55 52 4e      pgSz = JOURN
cce0: 41 4c 5f 50 47 5f 53 5a 28 6a 6f 75 72 6e 61 6c  AL_PG_SZ(journal
ccf0: 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 20 20 20 20  _format);.      
cd00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
cd10: 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72  FileSize(&pPager
cd20: 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a 20 20  ->jfd, &jSz);.  
cd30: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
cd40: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
cd50: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
cd60: 67 65 72 2d 3e 6e 52 65 63 2a 70 67 53 7a 2b 68  ger->nRec*pgSz+h
cd70: 64 72 53 7a 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20  drSz==jSz );.   
cd80: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
cd90: 20 20 69 66 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f    if( journal_fo
cda0: 72 6d 61 74 3e 3d 33 20 29 7b 0a 20 20 20 20 20  rmat>=3 ){.     
cdb0: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
cdc0: 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20  nRec value into 
cdd0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
cde0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 20   header */.     
cdf0: 20 20 20 6f 66 66 5f 74 20 73 7a 4a 3b 0a 20 20     off_t szJ;.  
ce00: 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
ce10: 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
ce20: 20 20 20 20 20 20 20 20 54 52 41 43 45 32 28 22          TRACE2("
ce30: 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
ce40: 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66  %d\n", pPager->f
ce50: 64 2e 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20  d.h);.          
ce60: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
ce70: 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  nc(&pPager->jfd)
ce80: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
ce90: 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
cea0: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
ceb0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65       sqlite3OsSe
cec0: 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ek(&pPager->jfd,
ced0: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
cee0: 4d 61 67 69 63 31 29 29 3b 0a 20 20 20 20 20 20  Magic1));.      
cef0: 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
cf00: 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
cf10: 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a   pPager->nRec);.
cf20: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
cf30: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20   return rc;..   
cf40: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
cf50: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6d 61  e name of the ma
cf60: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
cf70: 65 20 69 66 20 6f 6e 65 20 69 73 20 73 70 65 63  e if one is spec
cf80: 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  ified */.       
cf90: 20 69 66 28 20 7a 4d 61 73 74 65 72 20 29 7b 0a   if( zMaster ){.
cfa0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
cfb0: 28 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72  ( strlen(zMaster
cfc0: 29 3c 70 50 61 67 65 72 2d 3e 6e 4d 61 73 74 65  )<pPager->nMaste
cfd0: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  r );.          r
cfe0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
cff0: 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  k(&pPager->jfd, 
d000: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
d010: 61 67 69 63 33 29 20 2b 20 33 2a 34 29 3b 0a 20  agic3) + 3*4);. 
d020: 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
d030: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
d040: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
d050: 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67  te3OsWrite(&pPag
d060: 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
d070: 2c 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72  , strlen(zMaster
d080: 29 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )+1);.          
d090: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
d0a0: 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  rc;.        }.. 
d0b0: 20 20 20 20 20 20 20 73 7a 4a 20 3d 20 4a 4f 55         szJ = JOU
d0c0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d0d0: 65 72 2c 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d  er, journal_form
d0e0: 61 74 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20  at) +.          
d0f0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
d100: 52 65 63 2a 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  Rec*JOURNAL_PG_S
d110: 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74  Z(journal_format
d120: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d130: 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
d140: 2d 3e 6a 66 64 2c 20 73 7a 4a 29 3b 0a 20 20 20  ->jfd, szJ);.   
d150: 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45     }.      TRACE
d160: 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  2("SYNC journal 
d170: 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  of %d\n", pPager
d180: 2d 3e 66 64 2e 68 29 3b 0a 20 20 20 20 20 20 72  ->fd.h);.      r
d190: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
d1a0: 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  c(&pPager->jfd);
d1b0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30  .      if( rc!=0
d1c0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
d1d0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
d1e0: 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a  nalStarted = 1;.
d1f0: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
d200: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
d210: 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74 68  .    /* Erase th
d220: 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  e needSync flag 
d230: 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65 2e  from every page.
d240: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
d250: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
d260: 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
d270: 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
d280: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
d290: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50   0;.    }.    pP
d2a0: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
d2b0: 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  ed = pPager->pFi
d2c0: 72 73 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  rst;.  }..#ifnde
d2d0: 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66  f NDEBUG.  /* If
d2e0: 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   the Pager.needS
d2f0: 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65 61  ync flag is clea
d300: 72 20 74 68 65 6e 20 74 68 65 20 50 67 48 64 72  r then the PgHdr
d310: 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66  .needSync.  ** f
d320: 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  lag must also be
d330: 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20 70   clear for all p
d340: 61 67 65 73 2e 20 20 56 65 72 69 66 79 20 74 68  ages.  Verify th
d350: 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76  at this.  ** inv
d360: 61 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e 0a  ariant is true..
d370: 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20    */.  else{.   
d380: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
d390: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
d3a0: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
d3b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
d3c0: 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29  g->needSync==0 )
d3d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
d3e0: 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72  rt( pPager->pFir
d3f0: 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67 65 72  stSynced==pPager
d400: 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a  ->pFirst );.  }.
d410: 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
d420: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69   rc;.}../*.** Gi
d430: 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 61  ven a list of pa
d440: 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64 20 62  ges (connected b
d450: 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72  y the PgHdr.pDir
d460: 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72 69 74  ty pointer) writ
d470: 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f  e.** every one o
d480: 66 20 74 68 6f 73 65 20 70 61 67 65 73 20 6f 75  f those pages ou
d490: 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
d4a0: 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20  e file and mark 
d4b0: 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63  them all.** as c
d4c0: 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lean..*/.static 
d4d0: 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f  int pager_write_
d4e0: 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a  pagelist(PgHdr *
d4f0: 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20  pList){.  Pager 
d500: 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  *pPager;.  int r
d510: 63 3b 0a 20 20 69 6e 74 20 62 75 73 79 20 3d 20  c;.  int busy = 
d520: 31 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  1;..  if( pList=
d530: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
d540: 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20  TE_OK;.  pPager 
d550: 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b  = pList->pPager;
d560: 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
d570: 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62  oint there may b
d580: 65 20 65 69 74 68 65 72 20 61 20 52 45 53 45 52  e either a RESER
d590: 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
d5a0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a   lock on the.  *
d5b0: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
d5c0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
d5d0: 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56  eady an EXCLUSIV
d5e0: 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c  E lock, the foll
d5f0: 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73  owing.  ** calls
d600: 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63   to sqlite3OsLoc
d610: 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a  k() are no-ops..
d620: 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67    **.  ** Moving
d630: 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52   the lock from R
d640: 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55  ESERVED to EXCLU
d650: 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e  SIVE actually in
d660: 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a  volves going.  *
d670: 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74  * through an int
d680: 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 20  ermediate state 
d690: 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e  PENDING.   A PEN
d6a0: 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e  DING lock preven
d6b0: 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64  ts new.  ** read
d6c0: 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69  ers from attachi
d6d0: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
d6e0: 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66 66  se but is unsuff
d6f0: 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f  icient for us to
d700: 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68  .  ** write.  Th
d710: 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44  e idea of a PEND
d720: 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70  ING lock is to p
d730: 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65  revent new reade
d740: 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d  rs from.  ** com
d750: 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20  ing in while we 
d760: 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e  wait for existin
d770: 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65  g readers to cle
d780: 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  ar..  **.  ** Wh
d790: 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69 73  ile the pager is
d7a0: 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45 44   in the RESERVED
d7b0: 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67   state, the orig
d7c0: 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
d7d0: 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61  le.  ** is uncha
d7e0: 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20  nged and we can 
d7f0: 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74  rollback without
d800: 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62   having to playb
d810: 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75  ack the.  ** jou
d820: 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72  rnal into the or
d830: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
d840: 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74  file.  Once we t
d850: 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a  ransition to.  *
d860: 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20  * EXCLUSIVE, it 
d870: 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
d880: 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  se file has been
d890: 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79   changed and any
d8a0: 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77   rollback.  ** w
d8b0: 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f  ill require a jo
d8c0: 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a  urnal playback..
d8d0: 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20 20 20    */.  do {.    
d8e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
d8f0: 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ck(&pPager->fd, 
d900: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
d910: 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53  .  }while( rc==S
d920: 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 0a 20  QLITE_BUSY && . 
d930: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75       pPager->pBu
d940: 73 79 48 61 6e 64 6c 65 72 20 26 26 20 0a 20 20  syHandler && .  
d950: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73      pPager->pBus
d960: 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 20  yHandler->xFunc 
d970: 26 26 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  && .      pPager
d980: 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e  ->pBusyHandler->
d990: 78 46 75 6e 63 28 70 50 61 67 65 72 2d 3e 70 42  xFunc(pPager->pB
d9a0: 75 73 79 48 61 6e 64 6c 65 72 2d 3e 70 41 72 67  usyHandler->pArg
d9b0: 2c 20 22 22 2c 20 62 75 73 79 2b 2b 29 0a 20 20  , "", busy++).  
d9c0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
d9d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
d9e0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
d9f0: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
da00: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
da10: 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20  .  while( pList 
da20: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
da30: 4c 69 73 74 2d 3e 64 69 72 74 79 20 29 3b 0a 20  List->dirty );. 
da40: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b     sqlite3OsSeek
da50: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70  (&pPager->fd, (p
da60: 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28 6f  List->pgno-1)*(o
da70: 66 66 5f 74 29 53 51 4c 49 54 45 5f 50 41 47 45  ff_t)SQLITE_PAGE
da80: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 43 4f 44 45  _SIZE);.    CODE
da90: 43 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f  C(pPager, PGHDR_
daa0: 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20  TO_DATA(pList), 
dab0: 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b  pList->pgno, 6);
dac0: 0a 20 20 20 20 54 52 41 43 45 32 28 22 53 54 4f  .    TRACE2("STO
dad0: 52 45 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70  RE page %d\n", p
dae0: 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  List->pgno);.   
daf0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
db00: 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64  rite(&pPager->fd
db10: 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
db20: 70 4c 69 73 74 29 2c 20 53 51 4c 49 54 45 5f 50  pList), SQLITE_P
db30: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 43  AGE_SIZE);.    C
db40: 4f 44 45 43 28 70 50 61 67 65 72 2c 20 50 47 48  ODEC(pPager, PGH
db50: 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74  DR_TO_DATA(pList
db60: 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20  ), pList->pgno, 
db70: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
db80: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
db90: 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 3d 20 30  pList->dirty = 0
dba0: 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c  ;.    pList = pL
dbb0: 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d  ist->pDirty;.  }
dbc0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
dbd0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
dbe0: 6c 6c 65 63 74 20 65 76 65 72 79 20 64 69 72 74  llect every dirt
dbf0: 79 20 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69  y page into a di
dc00: 72 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20  rty list and.** 
dc10: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
dc20: 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20   to the head of 
dc30: 74 68 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20  that list.  All 
dc40: 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c  pages are.** col
dc50: 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66 20 74  lected even if t
dc60: 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e  hey are still in
dc70: 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
dc80: 50 67 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74  PgHdr *pager_get
dc90: 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
dca0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
dcb0: 0a 20 20 50 67 48 64 72 20 2a 70 2c 20 2a 70 4c  .  PgHdr *p, *pL
dcc0: 69 73 74 3b 0a 20 20 70 4c 69 73 74 20 3d 20 30  ist;.  pList = 0
dcd0: 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72  ;.  for(p=pPager
dce0: 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e  ->pAll; p; p=p->
dcf0: 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69  pNextAll){.    i
dd00: 66 28 20 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20  f( p->dirty ){. 
dd10: 20 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d       p->pDirty =
dd20: 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 4c   pList;.      pL
dd30: 69 73 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20  ist = p;.    }. 
dd40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73   }.  return pLis
dd50: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  t;.}../*.** Acqu
dd60: 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a  ire a page..**.*
dd70: 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  * A read lock on
dd80: 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69   the disk file i
dd90: 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65 6e 20  s obtained when 
dda0: 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 69  the first page i
ddb0: 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20  s acquired. .** 
ddc0: 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b 20 69  This read lock i
ddd0: 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e 20 74  s dropped when t
dde0: 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 73 20  he last page is 
ddf0: 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  released..**.** 
de00: 41 20 5f 67 65 74 20 77 6f 72 6b 73 20 66 6f 72  A _get works for
de10: 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62 65 72   any page number
de20: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 2e   greater than 0.
de30: 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
de40: 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d 61  e.** file is sma
de50: 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  ller than the re
de60: 71 75 65 73 74 65 64 20 70 61 67 65 2c 20 74 68  quested page, th
de70: 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64 69 73  en no actual dis
de80: 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75 72 73  k.** read occurs
de90: 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20   and the memory 
dea0: 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70 61 67  image of the pag
deb0: 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  e is initialized
dec0: 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73   to.** all zeros
ded0: 2e 20 20 54 68 65 20 65 78 74 72 61 20 64 61 74  .  The extra dat
dee0: 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20  a appended to a 
def0: 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69  page is always i
df00: 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f  nitialized.** to
df10: 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72 73 74   zeros the first
df20: 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20   time a page is 
df30: 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f  loaded into memo
df40: 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63  ry..**.** The ac
df50: 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20  quisition might 
df60: 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c  fail for several
df70: 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c   reasons.  In al
df80: 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61  l cases,.** an a
df90: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
dfa0: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
dfb0: 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73  d and *ppPage is
dfc0: 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
dfd0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
dfe0: 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  ite3pager_lookup
dff0: 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72  ().  Both this r
e000: 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b  outine and _look
e010: 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20  up() attempt.** 
e020: 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
e030: 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
e040: 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66  cache first.  If
e050: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
e060: 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d   already.** in m
e070: 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74  emory, this rout
e080: 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ine goes to disk
e090: 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77   to read it in w
e0a0: 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70 28 29  hereas _lookup()
e0b0: 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73  .** just returns
e0c0: 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e   0.  This routin
e0d0: 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61  e acquires a rea
e0e0: 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74  d-lock the first
e0f0: 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20   time it.** has 
e100: 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61  to go to disk, a
e110: 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c  nd could also pl
e120: 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f  ayback an old jo
e130: 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
e140: 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f  ry..** Since _lo
e150: 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65  okup() never goe
e160: 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65  s to disk, it ne
e170: 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20  ver has to deal 
e180: 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72  with locks.** or
e190: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
e1a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
e1b0: 67 65 72 5f 67 65 74 28 50 61 67 65 72 20 2a 70  ger_get(Pager *p
e1c0: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
e1d0: 2c 20 76 6f 69 64 20 2a 2a 70 70 50 61 67 65 29  , void **ppPage)
e1e0: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
e1f0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
e200: 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  Make sure we hav
e210: 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72  e not hit any cr
e220: 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20  itical errors.. 
e230: 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20 70   */ .  assert( p
e240: 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
e250: 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
e260: 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a  .  *ppPage = 0;.
e270: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
e280: 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45 52 5f  rMask & ~(PAGER_
e290: 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20 20  ERR_FULL) ){.   
e2a0: 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
e2b0: 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  rcode(pPager);. 
e2c0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
e2d0: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 70 61   is the first pa
e2e0: 67 65 20 61 63 63 65 73 73 65 64 2c 20 74 68 65  ge accessed, the
e2f0: 6e 20 67 65 74 20 61 20 53 48 41 52 45 44 20 6c  n get a SHARED l
e300: 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ock.  ** on the 
e310: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
e320: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
e330: 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21 70 50  ->nRef==0 && !pP
e340: 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
e350: 20 20 20 69 6e 74 20 62 75 73 79 20 3d 20 31 3b     int busy = 1;
e360: 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
e370: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
e380: 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ck(&pPager->fd, 
e390: 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
e3a0: 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
e3b0: 4c 49 54 45 5f 42 55 53 59 20 26 26 20 0a 20 20  LITE_BUSY && .  
e3c0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42        pPager->pB
e3d0: 75 73 79 48 61 6e 64 6c 65 72 20 26 26 20 0a 20  usyHandler && . 
e3e0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
e3f0: 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75  BusyHandler->xFu
e400: 6e 63 20 26 26 20 0a 20 20 20 20 20 20 20 20 70  nc && .        p
e410: 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
e420: 6c 65 72 2d 3e 78 46 75 6e 63 28 70 50 61 67 65  ler->xFunc(pPage
e430: 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d  r->pBusyHandler-
e440: 3e 70 41 72 67 2c 20 22 22 2c 20 62 75 73 79 2b  >pArg, "", busy+
e450: 2b 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  +).    );.    if
e460: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e470: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
e480: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  rc;.    }.    pP
e490: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
e4a0: 47 45 52 5f 53 48 41 52 45 44 3b 0a 0a 20 20 20  GER_SHARED;..   
e4b0: 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
e4c0: 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e   file exists, an
e4d0: 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45  d there is no RE
e4e0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
e4f0: 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
e500: 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  se file, then it
e510: 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f   either needs to
e520: 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
e530: 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  or deleted..    
e540: 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
e550: 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26  r->useJournal &&
e560: 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
e570: 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 70 50  3OsFileExists(pP
e580: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20  ager->zJournal) 
e590: 26 26 0a 20 20 20 20 20 20 20 20 21 73 71 6c 69  &&.        !sqli
e5a0: 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
e5b0: 65 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  edLock(&pPager->
e5c0: 66 64 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  fd) .    ){.    
e5d0: 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20     int rc;..    
e5e0: 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43     /* Get an EXC
e5f0: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
e600: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
e610: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d  . */.       rc =
e620: 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26   sqlite3OsLock(&
e630: 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c  pPager->fd, EXCL
e640: 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
e650: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
e660: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
e670: 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63    sqlite3OsUnloc
e680: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  k(&pPager->fd, N
e690: 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  O_LOCK);.       
e6a0: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
e6b0: 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a  = PAGER_UNLOCK;.
e6c0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
e6d0: 72 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20  rc;.       }.   
e6e0: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
e6f0: 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
e700: 49 56 45 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20  IVE;..       /* 
e710: 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
e720: 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c   for reading onl
e730: 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  y.  Return SQLIT
e740: 45 5f 42 55 53 59 20 69 66 0a 20 20 20 20 20 20  E_BUSY if.      
e750: 20 2a 2a 20 77 65 20 61 72 65 20 75 6e 61 62 6c   ** we are unabl
e760: 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f  e to open the jo
e770: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20  urnal file. .   
e780: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 2a 2a      **.       **
e790: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
e7a0: 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  e does not need 
e7b0: 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69 74 73  to be locked its
e7c0: 65 6c 66 2e 20 20 54 68 65 0a 20 20 20 20 20 20  elf.  The.      
e7d0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
e7e0: 20 69 73 20 6e 65 76 65 72 20 6f 70 65 6e 20 75   is never open u
e7f0: 6e 6c 65 73 73 20 74 68 65 20 6d 61 69 6e 20 64  nless the main d
e800: 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c  atabase file hol
e810: 64 73 0a 20 20 20 20 20 20 20 2a 2a 20 61 20 77  ds.       ** a w
e820: 72 69 74 65 20 6c 6f 63 6b 2c 20 73 6f 20 74 68  rite lock, so th
e830: 65 72 65 20 69 73 20 6e 65 76 65 72 20 61 6e 79  ere is never any
e840: 20 63 68 61 6e 63 65 20 6f 66 20 74 77 6f 20 6f   chance of two o
e850: 72 20 6d 6f 72 65 0a 20 20 20 20 20 20 20 2a 2a  r more.       **
e860: 20 70 72 6f 63 65 73 73 65 73 20 6f 70 65 6e 69   processes openi
e870: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  ng the journal a
e880: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
e890: 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  .       */.     
e8a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
e8b0: 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 70 50 61  OpenReadOnly(pPa
e8c0: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26  ger->zJournal, &
e8d0: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
e8e0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
e8f0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
e900: 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f     sqlite3OsUnlo
e910: 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ck(&pPager->fd, 
e920: 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  NO_LOCK);.      
e930: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
e940: 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
e950: 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  .         return
e960: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
e970: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50       }.       pP
e980: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
e990: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 70 50  n = 1;.       pP
e9a0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
e9b0: 72 74 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 20  rted = 0;..     
e9c0: 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e    /* Playback an
e9d0: 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  d delete the jou
e9e0: 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20  rnal.  Drop the 
e9f0: 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20  database write. 
ea00: 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e        ** lock an
ea10: 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  d reacquire the 
ea20: 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20  read lock..     
ea30: 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d    */.       rc =
ea40: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
ea50: 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
ea60: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
ea70: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
ea80: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
ea90: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
eaa0: 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  Pg = 0;.  }else{
eab0: 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66  .    /* Search f
eac0: 6f 72 20 70 61 67 65 20 69 6e 20 63 61 63 68 65  or page in cache
ead0: 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61   */.    pPg = pa
eae0: 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
eaf0: 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  r, pgno);.    if
eb00: 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20  ( pPager->memDb 
eb10: 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  && pPager->state
eb20: 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  ==PAGER_UNLOCK )
eb30: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
eb40: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
eb50: 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ARED;.    }.  }.
eb60: 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a    if( pPg==0 ){.
eb70: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
eb80: 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
eb90: 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
eba0: 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 68  he. */.    int h
ebb0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d  ;.    pPager->nM
ebc0: 69 73 73 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  iss++;.    if( p
ebd0: 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50 61  Pager->nPage<pPa
ebe0: 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c 20 70  ger->mxPage || p
ebf0: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30  Pager->pFirst==0
ec00: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44   || pPager->memD
ec10: 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 72  b ){.      /* Cr
ec20: 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  eate a new page 
ec30: 2a 2f 0a 20 20 20 20 20 20 70 50 67 20 3d 20 73  */.      pPg = s
ec40: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
ec50: 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 53  sizeof(*pPg) + S
ec60: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 20  QLITE_PAGE_SIZE 
ec70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ec80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
ec90: 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70   sizeof(u32) + p
eca0: 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20  Pager->nExtra.  
ecb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecc0: 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 70 50              + pP
ecd0: 61 67 65 72 2d 3e 6d 65 6d 44 62 2a 73 69 7a 65  ager->memDb*size
ece0: 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20 29 3b  of(PgHistory) );
ecf0: 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d  .      if( pPg==
ed00: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67  0 ){.        pag
ed10: 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
ed20: 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
ed30: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
ed40: 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d  |= PAGER_ERR_MEM
ed50: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
ed60: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
ed70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
ed80: 73 65 74 28 70 50 67 2c 20 30 2c 20 73 69 7a 65  set(pPg, 0, size
ed90: 6f 66 28 2a 70 50 67 29 29 3b 0a 20 20 20 20 20  of(*pPg));.     
eda0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d   if( pPager->mem
edb0: 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  Db ){.        me
edc0: 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 48 49  mset(PGHDR_TO_HI
edd0: 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c  ST(pPg, pPager),
ede0: 20 30 2c 20 73 69 7a 65 6f 66 28 50 67 48 69 73   0, sizeof(PgHis
edf0: 74 6f 72 79 29 29 3b 0a 20 20 20 20 20 20 7d 0a  tory));.      }.
ee00: 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
ee10: 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20  r = pPager;.    
ee20: 20 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20    pPg->pNextAll 
ee30: 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a  = pPager->pAll;.
ee40: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41        pPager->pA
ee50: 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20  ll = pPg;.      
ee60: 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b  pPager->nPage++;
ee70: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ee80: 20 20 2f 2a 20 46 69 6e 64 20 61 20 70 61 67 65    /* Find a page
ee90: 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 20 54 72   to recycle.  Tr
eea0: 79 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61  y to locate a pa
eeb0: 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ge that does not
eec0: 0a 20 20 20 20 20 20 2a 2a 20 72 65 71 75 69 72  .      ** requir
eed0: 65 20 75 73 20 74 6f 20 64 6f 20 61 6e 20 66 73  e us to do an fs
eee0: 79 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75  ync() on the jou
eef0: 72 6e 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  rnal..      */. 
ef00: 20 20 20 20 20 70 50 67 20 3d 20 70 50 61 67 65       pPg = pPage
ef10: 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3b  r->pFirstSynced;
ef20: 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65  ..      /* If we
ef30: 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20   could not find 
ef40: 61 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  a page that does
ef50: 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20   not require an 
ef60: 66 73 79 6e 63 28 29 0a 20 20 20 20 20 20 2a 2a  fsync().      **
ef70: 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   on the journal 
ef80: 66 69 6c 65 20 74 68 65 6e 20 66 73 79 6e 63 20  file then fsync 
ef90: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
efa0: 2e 20 20 54 68 69 73 20 69 73 20 61 0a 20 20 20  .  This is a.   
efb0: 20 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20     ** very slow 
efc0: 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65  operation, so we
efd0: 20 77 6f 72 6b 20 68 61 72 64 20 74 6f 20 61 76   work hard to av
efe0: 6f 69 64 20 69 74 2e 20 20 42 75 74 20 73 6f 6d  oid it.  But som
eff0: 65 74 69 6d 65 73 0a 20 20 20 20 20 20 2a 2a 20  etimes.      ** 
f000: 69 74 20 63 61 6e 27 74 20 62 65 20 68 65 6c 70  it can't be help
f010: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
f020: 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b     if( pPg==0 ){
f030: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20  .        int rc 
f040: 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
f050: 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
f060: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
f070: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f080: 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
f090: 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
f0a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f0b0: 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 7d  IOERR;.        }
f0c0: 0a 20 20 20 20 20 20 20 20 70 50 67 20 3d 20 70  .        pPg = p
f0d0: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20  Pager->pFirst;. 
f0e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
f0f0: 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d  ert( pPg->nRef==
f100: 30 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  0 );..      /* W
f110: 72 69 74 65 20 74 68 65 20 70 61 67 65 20 74 6f  rite the page to
f120: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
f130: 6c 65 20 69 66 20 69 74 20 69 73 20 64 69 72 74  le if it is dirt
f140: 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
f150: 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79    if( pPg->dirty
f160: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
f170: 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  rt( pPg->needSyn
f180: 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  c==0 );.        
f190: 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  pPg->pDirty = 0;
f1a0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
f1b0: 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
f1c0: 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 20  st( pPg );.     
f1d0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
f1e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
f1f0: 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72    sqlite3pager_r
f200: 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
f210: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
f220: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
f230: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f240: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
f250: 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b  pPg->dirty==0 );
f260: 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
f270: 65 20 70 61 67 65 20 77 65 20 61 72 65 20 72 65  e page we are re
f280: 63 79 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65  cycling is marke
f290: 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62  d as alwaysRollb
f2a0: 61 63 6b 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  ack, then.      
f2b0: 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62 61  ** set the globa
f2c0: 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  l alwaysRollback
f2d0: 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73 61   flag, thus disa
f2e0: 62 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20  bling the.      
f2f0: 2a 2a 20 73 71 6c 69 74 65 5f 64 6f 6e 74 5f 72  ** sqlite_dont_r
f300: 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d 69  ollback() optimi
f310: 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 72  zation for the r
f320: 65 73 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e  est of this tran
f330: 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
f340: 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73 61 72  * It is necessar
f350: 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 63  y to do this bec
f360: 61 75 73 65 20 74 68 65 20 70 61 67 65 20 6d 61  ause the page ma
f370: 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62  rked alwaysRollb
f380: 61 63 6b 0a 20 20 20 20 20 20 2a 2a 20 6d 69 67  ack.      ** mig
f390: 68 74 20 62 65 20 72 65 6c 6f 61 64 65 64 20 61  ht be reloaded a
f3a0: 74 20 61 20 6c 61 74 65 72 20 74 69 6d 65 20 62  t a later time b
f3b0: 75 74 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ut at that point
f3c0: 20 77 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62   we won't rememb
f3d0: 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  er.      ** that
f3e0: 20 69 73 20 77 61 73 20 6d 61 72 6b 65 64 20 61   is was marked a
f3f0: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20  lwaysRollback.  
f400: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
f410: 61 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 0a 20  all pages must. 
f420: 20 20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65       ** be marke
f430: 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62  d as alwaysRollb
f440: 61 63 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e  ack from here on
f450: 20 6f 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   out..      */. 
f460: 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 61 6c       if( pPg->al
f470: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a  waysRollback ){.
f480: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
f490: 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  alwaysRollback =
f4a0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   1;.      }..   
f4b0: 20 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65     /* Unlink the
f4c0: 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74   old page from t
f4d0: 68 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64  he free list and
f4e0: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a   the hash table.
f4f0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 75        */.      u
f500: 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a  nlinkPage(pPg);.
f510: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4f        pPager->nO
f520: 76 66 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  vfl++;.    }.   
f530: 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e   pPg->pgno = pgn
f540: 6f 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  o;.    if( pPage
f550: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26  r->aInJournal &&
f560: 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67   (int)pgno<=pPag
f570: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
f580: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  {.      sqlite3C
f590: 68 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67 65  heckMemory(pPage
f5a0: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->aInJournal, p
f5b0: 67 6e 6f 2f 38 29 3b 0a 20 20 20 20 20 20 61 73  gno/8);.      as
f5c0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
f5d0: 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20  urnalOpen );.   
f5e0: 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
f5f0: 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e 61 49 6e  l = (pPager->aIn
f600: 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20  Journal[pgno/8] 
f610: 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29  & (1<<(pgno&7)))
f620: 21 3d 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  !=0;.      pPg->
f630: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
f640: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
f650: 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
f660: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  0;.      pPg->ne
f670: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
f680: 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
f690: 2d 3e 61 49 6e 53 74 6d 74 20 26 26 20 28 69 6e  ->aInStmt && (in
f6a0: 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  t)pgno<=pPager->
f6b0: 73 74 6d 74 53 69 7a 65 0a 20 20 20 20 20 20 20  stmtSize.       
f6c0: 20 20 20 20 20 20 26 26 20 28 70 50 61 67 65 72        && (pPager
f6d0: 2d 3e 61 49 6e 53 74 6d 74 5b 70 67 6e 6f 2f 38  ->aInStmt[pgno/8
f6e0: 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29  ] & (1<<(pgno&7)
f6f0: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ))!=0 ){.      p
f700: 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
f710: 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d  list(pPg);.    }
f720: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 61 67 65  else{.      page
f730: 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d  _remove_from_stm
f740: 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
f750: 20 7d 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74   }.    pPg->dirt
f760: 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e  y = 0;.    pPg->
f770: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 52 45  nRef = 1;.    RE
f780: 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20  FINFO(pPg);.    
f790: 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a  pPager->nRef++;.
f7a0: 20 20 20 20 68 20 3d 20 70 61 67 65 72 5f 68 61      h = pager_ha
f7b0: 73 68 28 70 67 6e 6f 29 3b 0a 20 20 20 20 70 50  sh(pgno);.    pP
f7c0: 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  g->pNextHash = p
f7d0: 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b  Pager->aHash[h];
f7e0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61  .    pPager->aHa
f7f0: 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20  sh[h] = pPg;.   
f800: 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48   if( pPg->pNextH
f810: 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ash ){.      ass
f820: 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48  ert( pPg->pNextH
f830: 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d  ash->pPrevHash==
f840: 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  0 );.      pPg->
f850: 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76  pNextHash->pPrev
f860: 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20  Hash = pPg;.    
f870: 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
f880: 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20  ->nExtra>0 ){.  
f890: 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
f8a0: 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 29 2c 20  _TO_EXTRA(pPg), 
f8b0: 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  0, pPager->nExtr
f8c0: 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  a);.    }.    if
f8d0: 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
f8e0: 3c 30 20 29 20 73 71 6c 69 74 65 33 70 61 67 65  <0 ) sqlite3page
f8f0: 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67  r_pagecount(pPag
f900: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  er);.    if( pPa
f910: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20  ger->errMask!=0 
f920: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
f930: 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47 48 44  pager_unref(PGHD
f940: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29 3b  R_TO_DATA(pPg));
f950: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
f960: 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72  r_errcode(pPager
f970: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
f980: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
f990: 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
f9a0: 3c 28 69 6e 74 29 70 67 6e 6f 20 29 7b 0a 20 20  <(int)pgno ){.  
f9b0: 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
f9c0: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30  _TO_DATA(pPg), 0
f9d0: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
f9e0: 5a 45 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ZE);.    }else{.
f9f0: 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20        int rc;.  
fa00: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
fa10: 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a  er->memDb==0 );.
fa20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
fa30: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  eek(&pPager->fd,
fa40: 20 28 70 67 6e 6f 2d 31 29 2a 28 6f 66 66 5f 74   (pgno-1)*(off_t
fa50: 29 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a  )SQLITE_PAGE_SIZ
fa60: 45 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  E);.      rc = s
fa70: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70 50  qlite3OsRead(&pP
fa80: 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f  ager->fd, PGHDR_
fa90: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 53 51  TO_DATA(pPg), SQ
faa0: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
fab0: 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22 46  .      TRACE2("F
fac0: 45 54 43 48 20 70 61 67 65 20 25 64 5c 6e 22 2c  ETCH page %d\n",
fad0: 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
fae0: 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
faf0: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
fb00: 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  Pg), pPg->pgno, 
fb10: 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  3);.      if( rc
fb20: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
fb30: 20 20 20 20 20 20 20 6f 66 66 5f 74 20 66 69 6c         off_t fil
fb40: 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  eSize;.        i
fb50: 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  f( sqlite3OsFile
fb60: 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 66 64  Size(&pPager->fd
fb70: 2c 26 66 69 6c 65 53 69 7a 65 29 21 3d 53 51 4c  ,&fileSize)!=SQL
fb80: 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20  ITE_OK.         
fb90: 20 20 20 20 20 20 7c 7c 20 66 69 6c 65 53 69 7a        || fileSiz
fba0: 65 3e 3d 70 67 6e 6f 2a 53 51 4c 49 54 45 5f 50  e>=pgno*SQLITE_P
fbb0: 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20  AGE_SIZE ){.    
fbc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67        sqlite3pag
fbd0: 65 72 5f 75 6e 72 65 66 28 50 47 48 44 52 5f 54  er_unref(PGHDR_T
fbe0: 4f 5f 44 41 54 41 28 70 50 67 29 29 3b 0a 20 20  O_DATA(pPg));.  
fbf0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
fc00: 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  c;.        }else
fc10: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73  {.          mems
fc20: 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  et(PGHDR_TO_DATA
fc30: 28 70 50 67 29 2c 20 30 2c 20 53 51 4c 49 54 45  (pPg), 0, SQLITE
fc40: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
fc50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
fc60: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
fc70: 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
fc80: 65 64 20 70 61 67 65 20 69 73 20 69 6e 20 74 68  ed page is in th
fc90: 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
fca0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 48 69  .    pPager->nHi
fcb0: 74 2b 2b 3b 0a 20 20 20 20 70 61 67 65 5f 72 65  t++;.    page_re
fcc0: 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70  f(pPg);.  }.  *p
fcd0: 70 50 61 67 65 20 3d 20 50 47 48 44 52 5f 54 4f  pPage = PGHDR_TO
fce0: 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 72 65  _DATA(pPg);.  re
fcf0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
fd00: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
fd10: 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73   a page if it is
fd20: 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
fd30: 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
fd40: 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64    Do.** not read
fd50: 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64   the page from d
fd60: 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70  isk.  Return a p
fd70: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
fd80: 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74  ge,.** or 0 if t
fd90: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
fda0: 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53  n cache..**.** S
fdb0: 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 70  ee also sqlite3p
fdc0: 61 67 65 72 5f 67 65 74 28 29 2e 20 20 54 68 65  ager_get().  The
fdd0: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
fde0: 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
fdf0: 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 70  .** and sqlite3p
fe00: 61 67 65 72 5f 67 65 74 28 29 20 69 73 20 74 68  ager_get() is th
fe10: 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67  at _get() will g
fe20: 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e  o to the disk an
fe30: 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65  d read.** in the
fe40: 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67   page if the pag
fe50: 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
fe60: 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73   in cache.  This
fe70: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
fe80: 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  rns NULL if the 
fe90: 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
fea0: 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73  ache or if a dis
feb0: 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  k I/O error .** 
fec0: 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65  has ever happene
fed0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  d..*/.void *sqli
fee0: 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  te3pager_lookup(
fef0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
ff00: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
ff10: 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65  dr *pPg;..  asse
ff20: 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
ff30: 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
ff40: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  =0 );.  if( pPag
ff50: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28  er->errMask & ~(
ff60: 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20  PAGER_ERR_FULL) 
ff70: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
ff80: 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20 70 61 67  .  }.  pPg = pag
ff90: 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
ffa0: 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
ffb0: 50 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  Pg==0 ) return 0
ffc0: 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67  ;.  page_ref(pPg
ffd0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 50 47 48 44  );.  return PGHD
ffe0: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a  R_TO_DATA(pPg);.
fff0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
10000 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
10010 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
10020 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
10030 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a  e page drop to z
10040 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ero, then the.**
10050 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74   page is added t
10060 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20  o the LRU list. 
10070 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65   When all refere
10080 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65  nces to all page
10090 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65  s.** are release
100a0 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  d, a rollback oc
100b0 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63  curs and the loc
100c0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
100d0 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e  e is.** removed.
100e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
100f0 61 67 65 72 5f 75 6e 72 65 66 28 76 6f 69 64 20  ager_unref(void 
10100 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
10110 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 44 65 63   *pPg;..  /* Dec
10120 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
10130 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 74  ence count for t
10140 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20  his page.  */.  
10150 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
10160 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 61 73  HDR(pData);.  as
10170 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e  sert( pPg->nRef>
10180 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66  0 );.  pPg->nRef
10190 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50  --;.  REFINFO(pP
101a0 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74  g);..  /* When t
101b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
101c0 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70 61 67  erences to a pag
101d0 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c 6c 20  e reach 0, call 
101e0 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72 75 63  the.  ** destruc
101f0 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68 65 20  tor and add the 
10200 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65  page to the free
10210 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
10220 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
10230 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
10240 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d  er;.    pPager =
10250 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
10260 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65    pPg->pNextFree
10270 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70   = 0;.    pPg->p
10280 50 72 65 76 46 72 65 65 20 3d 20 70 50 61 67 65  PrevFree = pPage
10290 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70 50  r->pLast;.    pP
102a0 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50  ager->pLast = pP
102b0 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  g;.    if( pPg->
102c0 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
102d0 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
102e0 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
102f0 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  Pg;.    }else{. 
10300 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69       pPager->pFi
10310 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  rst = pPg;.    }
10320 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65  .    if( pPg->ne
10330 65 64 53 79 6e 63 3d 3d 30 20 26 26 20 70 50 61  edSync==0 && pPa
10340 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
10350 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50  d==0 ){.      pP
10360 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
10370 65 64 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  ed = pPg;.    }.
10380 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
10390 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20  xDestructor ){. 
103a0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65       pPager->xDe
103b0 73 74 72 75 63 74 6f 72 28 70 44 61 74 61 2c 20  structor(pData, 
103c0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
103d0 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
103e0 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65  /* When all page
103f0 73 20 72 65 61 63 68 20 74 68 65 20 66 72 65 65  s reach the free
10400 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72  list, drop the r
10410 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20  ead lock from.  
10420 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
10430 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
10440 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d     pPager->nRef-
10450 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  -;.    assert( p
10460 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29  Pager->nRef>=0 )
10470 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
10480 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21 70 50  ->nRef==0 && !pP
10490 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
104a0 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
104b0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
104c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
104d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
104e0 20 43 72 65 61 74 65 20 61 20 6a 6f 75 72 6e 61   Create a journa
104f0 6c 20 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65  l file for pPage
10500 72 2e 20 20 54 68 65 72 65 20 73 68 6f 75 6c 64  r.  There should
10510 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45   already be a RE
10520 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43  SERVED.** or EXC
10530 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
10540 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
10550 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
10560 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
10570 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
10580 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
10590 6e 67 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65  ng.  Return an e
105a0 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 72 65  rror code and re
105b0 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20 77 72 69  lease the.** wri
105c0 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68  te lock if anyth
105d0 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
105e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
105f0 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
10600 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
10610 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
10620 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
10630 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
10640 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
10650 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10660 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  pen==0 );.  asse
10670 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
10680 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 73 71 6c 69  ournal );.  sqli
10690 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75  te3pager_pagecou
106a0 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50  nt(pPager);.  pP
106b0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
106c0 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
106d0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f   pPager->dbSize/
106e0 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70  8 + 1 );.  if( p
106f0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
10700 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  l==0 ){.    sqli
10710 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61  te3OsUnlock(&pPa
10720 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
10730 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65  LOCK);.    pPage
10740 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
10750 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74  _SHARED;.    ret
10760 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
10770 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
10780 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73  ite3OsOpenExclus
10790 69 76 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ive(pPager->zJou
107a0 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a  rnal, &pPager->j
107b0 66 64 2c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  fd,pPager->tempF
107c0 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ile);.  if( rc!=
107d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
107e0 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
107f0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->aInJournal);
10800 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
10810 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
10820 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
10830 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48  (&pPager->fd, SH
10840 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
10850 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
10860 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
10870 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10880 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20  CANTOPEN;.  }.  
10890 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69 72  sqlite3OsOpenDir
108a0 65 63 74 6f 72 79 28 70 50 61 67 65 72 2d 3e 7a  ectory(pPager->z
108b0 44 69 72 65 63 74 6f 72 79 2c 20 26 70 50 61 67  Directory, &pPag
108c0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 70 50 61 67  er->jfd);.  pPag
108d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
108e0 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  = 1;.  pPager->j
108f0 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
10900 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  0;.  pPager->nee
10910 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61  dSync = 0;.  pPa
10920 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
10930 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ack = 0;.  pPage
10940 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69  r->nRec = 0;.  i
10950 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
10960 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  sk!=0 ){.    rc 
10970 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  = pager_errcode(
10980 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
10990 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
109a0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
109b0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
109c0 65 3b 0a 20 20 69 66 28 20 6a 6f 75 72 6e 61 6c  e;.  if( journal
109d0 5f 66 6f 72 6d 61 74 3d 3d 4a 4f 55 52 4e 41 4c  _format==JOURNAL
109e0 5f 46 4f 52 4d 41 54 5f 33 20 29 7b 0a 20 20 20  _FORMAT_3 ){.   
109f0 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 68   /* Create the h
10a00 65 61 64 65 72 20 66 6f 72 20 61 20 66 6f 72 6d  eader for a form
10a10 61 74 20 33 20 6a 6f 75 72 6e 61 6c 3a 0a 20 20  at 3 journal:.  
10a20 20 20 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20    ** - 8 bytes: 
10a30 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e  Magic identifyin
10a40 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  g journal format
10a50 20 33 2e 0a 20 20 20 20 2a 2a 20 2d 20 34 20 62   3..    ** - 4 b
10a60 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20  ytes: Number of 
10a70 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e  records in journ
10a80 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e  al, or -1 no-syn
10a90 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 20 20  c mode is on..  
10aa0 20 20 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20    ** - 4 bytes: 
10ab0 4d 61 67 69 63 20 75 73 65 64 20 66 6f 72 20 70  Magic used for p
10ac0 61 67 65 20 63 68 65 63 6b 73 75 6d 73 2e 0a 20  age checksums.. 
10ad0 20 20 20 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a     ** - 4 bytes:
10ae0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
10af0 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 6d 61   reserved for ma
10b00 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 74 72  ster journal ptr
10b10 20 28 6e 4d 61 73 74 65 72 29 0a 20 20 20 20 2a   (nMaster).    *
10b20 2a 20 2d 20 6e 4d 61 73 74 65 72 20 62 79 74 65  * - nMaster byte
10b30 73 3a 20 53 70 61 63 65 20 66 6f 72 20 61 20 6d  s: Space for a m
10b40 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
10b50 69 6e 74 65 72 2e 0a 20 20 20 20 2a 2a 20 2d 20  inter..    ** - 
10b60 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c  4 bytes: Initial
10b70 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63   database page c
10b80 6f 75 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ount..    */.   
10b90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
10ba0 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  rite(&pPager->jf
10bb0 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  d, aJournalMagic
10bc0 33 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  3, sizeof(aJourn
10bd0 61 6c 4d 61 67 69 63 33 29 29 3b 0a 20 20 20 20  alMagic3));.    
10be0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
10bf0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
10c00 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50 61  write32bits(&pPa
10c10 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
10c20 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66 66  ->noSync ? 0xfff
10c30 66 66 66 66 66 20 3a 20 30 29 3b 0a 20 20 20 20  fffff : 0);.    
10c40 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
10c50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10c60 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65   sqlite3Randomne
10c70 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ss(sizeof(pPager
10c80 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70  ->cksumInit), &p
10c90 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
10ca0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  );.      rc = wr
10cb0 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65  ite32bits(&pPage
10cc0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
10cd0 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 20 20  cksumInit);.    
10ce0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
10cf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10d00 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
10d10 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
10d20 70 50 61 67 65 72 2d 3e 6e 4d 61 73 74 65 72 29  pPager->nMaster)
10d30 3b 0a 20 20 20 20 7d 0a 20 20 20 0a 20 20 20 20  ;.    }.   .    
10d40 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 73 69  /* Unless the si
10d50 7a 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  ze reserved for 
10d60 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
10d70 61 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 30 2c  al pointer is 0,
10d80 20 73 65 74 0a 20 20 20 20 2a 2a 20 74 68 65 20   set.    ** the 
10d90 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
10da0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
10db0 20 70 6f 69 6e 74 65 72 20 74 6f 20 30 78 30 30   pointer to 0x00
10dc0 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 0a 20  .  Either way,. 
10dd0 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 69 6e     ** this is in
10de0 74 65 72 70 72 65 74 65 64 20 61 73 20 27 6e 6f  terpreted as 'no
10df0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 27   master journal'
10e00 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
10e10 20 61 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61   a.    ** rollba
10e20 63 6b 20 61 66 74 65 72 20 61 20 63 72 61 73 68  ck after a crash
10e30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
10e40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
10e50 26 20 70 50 61 67 65 72 2d 3e 6e 4d 61 73 74 65  & pPager->nMaste
10e60 72 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  r>0 ){.      rc 
10e70 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
10e80 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22  (&pPager->jfd, "
10e90 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ", 1);.    }.   
10ea0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10eb0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
10ec0 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
10ed0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 0a 20 20  pPager->jfd, .  
10ee0 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 61          sizeof(a
10ef0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 33 29 20 2b  JournalMagic3) +
10f00 20 33 2a 34 20 2b 20 70 50 61 67 65 72 2d 3e 6e   3*4 + pPager->n
10f10 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20  Master);.    }. 
10f20 20 7d 65 6c 73 65 20 69 66 28 20 6a 6f 75 72 6e   }else if( journ
10f30 61 6c 5f 66 6f 72 6d 61 74 3d 3d 4a 4f 55 52 4e  al_format==JOURN
10f40 41 4c 5f 46 4f 52 4d 41 54 5f 32 20 29 7b 0a 20  AL_FORMAT_2 ){. 
10f50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
10f60 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
10f70 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  jfd, aJournalMag
10f80 69 63 32 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  ic2, sizeof(aJou
10f90 72 6e 61 6c 4d 61 67 69 63 32 29 29 3b 0a 20 20  rnalMagic2));.  
10fa0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
10fb0 74 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61  t( journal_forma
10fc0 74 3d 3d 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41  t==JOURNAL_FORMA
10fd0 54 5f 31 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  T_1 );.    rc = 
10fe0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26  sqlite3OsWrite(&
10ff0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f  pPager->jfd, aJo
11000 75 72 6e 61 6c 4d 61 67 69 63 31 2c 20 73 69 7a  urnalMagic1, siz
11010 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
11020 63 31 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  c1));.  }.  if( 
11030 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
11040 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33  .    rc = write3
11050 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
11060 66 64 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  fd, pPager->dbSi
11070 7a 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ze);.  }.  if( p
11080 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
11090 70 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  pen && rc==SQLIT
110a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
110b0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
110c0 6d 74 5f 62 65 67 69 6e 28 70 50 61 67 65 72 29  mt_begin(pPager)
110d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
110e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
110f0 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
11100 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
11110 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
11120 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11130 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
11140 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
11150 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 0a 2f 2a  turn rc;  .}../*
11160 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77 72  .** Acquire a wr
11170 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
11180 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6c  database.  The l
11190 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20 77  ock is removed w
111a0 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f  hen.** the any o
111b0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
111c0 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20  happen:.**.**   
111d0 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  *  sqlite3pager_
111e0 63 6f 6d 6d 69 74 28 29 20 69 73 20 63 61 6c 6c  commit() is call
111f0 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
11200 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
11210 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  k() is called..*
11220 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61  *   *  sqlite3pa
11230 67 65 72 5f 63 6c 6f 73 65 28 29 20 69 73 20 63  ger_close() is c
11240 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
11250 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
11260 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  f() is called to
11270 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61   on every outsta
11280 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a  nding page..**.*
11290 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61  * The first para
112a0 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f  meter to this ro
112b0 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74  utine is a point
112c0 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70  er to any open p
112d0 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  age of the.** da
112e0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f  tabase file.  No
112f0 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62  thing changes ab
11300 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d 20 69  out the page - i
11310 74 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79  t is used merely
11320 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61   to.** acquire a
11330 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
11340 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
11350 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61  and as proof tha
11360 74 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c  t there is.** al
11370 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63  ready a read-loc
11380 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
11390 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63  e..**.** The sec
113a0 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e  ond parameter in
113b0 64 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68  dicates how much
113c0 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20   space in bytes 
113d0 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 61  to reserve for a
113e0 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
113f0 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20  al file-name at 
11400 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
11410 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74   journal when it
11420 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a   is created..**.
11430 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ** A journal fil
11440 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74  e is opened if t
11450 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d  his is not a tem
11460 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f  porary file.  Fo
11470 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66  r temporary.** f
11480 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e  iles, the openin
11490 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g of the journal
114a0 20 66 69 6c 65 20 69 73 20 64 65 66 65 72 72 65   file is deferre
114b0 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73  d until there is
114c0 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65   an.** actual ne
114d0 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ed to write to t
114e0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
114f0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
11500 65 20 69 73 20 61 6c 72 65 61 64 79 20 72 65 73  e is already res
11510 65 72 76 65 64 20 66 6f 72 20 77 72 69 74 69 6e  erved for writin
11520 67 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  g, this routine 
11530 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69  is a no-op..*/.i
11540 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
11550 62 65 67 69 6e 28 76 6f 69 64 20 2a 70 44 61 74  begin(void *pDat
11560 61 2c 20 69 6e 74 20 6e 4d 61 73 74 65 72 29 7b  a, int nMaster){
11570 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
11580 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
11590 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70  ata);.  Pager *p
115a0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
115b0 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ger;.  int rc = 
115c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
115d0 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30  ert( pPg->nRef>0
115e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4d   );.  assert( nM
115f0 61 73 74 65 72 3e 3d 30 20 29 3b 0a 20 20 61 73  aster>=0 );.  as
11600 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
11610 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
11620 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  K );.  if( pPage
11630 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
11640 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73  SHARED ){.    as
11650 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
11660 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
11670 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d     if( pPager->m
11680 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 70 50  emDb ){.      pP
11690 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
116a0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
116b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69       pPager->ori
116c0 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  gDbSize = pPager
116d0 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65  ->dbSize;.    }e
116e0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 62  lse{.      int b
116f0 75 73 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 64  usy = 1;.      d
11700 6f 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  o {.        rc =
11710 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26   sqlite3OsLock(&
11720 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45  pPager->fd, RESE
11730 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  RVED_LOCK);.    
11740 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
11750 4c 49 54 45 5f 42 55 53 59 20 26 26 20 0a 20 20  LITE_BUSY && .  
11760 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
11770 70 42 75 73 79 48 61 6e 64 6c 65 72 20 26 26 20  pBusyHandler && 
11780 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
11790 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d  r->pBusyHandler-
117a0 3e 78 46 75 6e 63 20 26 26 20 0a 20 20 20 20 20  >xFunc && .     
117b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75       pPager->pBu
117c0 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63  syHandler->xFunc
117d0 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61  (pPager->pBusyHa
117e0 6e 64 6c 65 72 2d 3e 70 41 72 67 2c 20 22 22 2c  ndler->pArg, "",
117f0 20 62 75 73 79 2b 2b 29 0a 20 20 20 20 20 20 29   busy++).      )
11800 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
11810 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11820 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
11830 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
11840 61 67 65 72 2d 3e 6e 4d 61 73 74 65 72 20 3d 20  ager->nMaster = 
11850 6e 4d 61 73 74 65 72 3b 0a 20 20 20 20 20 20 70  nMaster;.      p
11860 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
11870 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20  AGER_RESERVED;. 
11880 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72       pPager->dir
11890 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20  tyCache = 0;.   
118a0 20 20 20 54 52 41 43 45 33 28 22 54 52 41 4e 53     TRACE3("TRANS
118b0 41 43 54 49 4f 4e 20 25 64 20 6e 4d 61 73 74 65  ACTION %d nMaste
118c0 72 3d 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d  r=%d\n", pPager-
118d0 3e 66 64 2e 68 2c 20 6e 4d 61 73 74 65 72 29 3b  >fd.h, nMaster);
118e0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
118f0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26  r->useJournal &&
11900 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
11910 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  le ){.        rc
11920 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
11930 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
11940 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
11950 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11960 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61  ./*.** Mark a da
11970 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65  ta page as write
11980 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65 20  able.  The page 
11990 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
119a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  the journal .** 
119b0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
119c0 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68 69  re already.  Thi
119d0 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
119e0 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
119f0 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65  making.** change
11a00 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  s to a page..**.
11a10 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  ** The first tim
11a20 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
11a30 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61  s called, the pa
11a40 67 65 72 20 63 72 65 61 74 65 73 20 61 20 6e 65  ger creates a ne
11a50 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  w.** journal and
11a60 20 61 63 71 75 69 72 65 73 20 61 20 52 45 53 45   acquires a RESE
11a70 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
11a80 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 74   database.  If t
11a90 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c  he RESERVED.** l
11aa0 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ock could not be
11ab0 20 61 63 71 75 69 72 65 64 2c 20 74 68 69 73 20   acquired, this 
11ac0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
11ad0 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 68  SQLITE_BUSY.  Th
11ae0 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75  e.** calling rou
11af0 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b 20  tine must check 
11b00 66 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e 20  for that return 
11b10 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61 72  value and be car
11b20 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63  eful not to.** c
11b30 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64  hange any page d
11b40 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20 72  ata until this r
11b50 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
11b60 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
11b70 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
11b80 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ile could not be
11b90 20 77 72 69 74 74 65 6e 20 62 65 63 61 75 73 65   written because
11ba0 20 74 68 65 20 64 69 73 6b 20 69 73 20 66 75 6c   the disk is ful
11bb0 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  l,.** then this 
11bc0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
11bd0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20  SQLITE_FULL and 
11be0 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74  does an immediat
11bf0 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41  e rollback..** A
11c00 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77 72  ll subsequent wr
11c10 69 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c 73  ite attempts als
11c20 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  o return SQLITE_
11c30 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72 65  FULL until there
11c40 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74 6f  .** is a call to
11c50 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f   sqlite3pager_co
11c60 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65  mmit() or sqlite
11c70 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
11c80 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a  ) to.** reset..*
11c90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
11ca0 65 72 5f 77 72 69 74 65 28 76 6f 69 64 20 2a 70  er_write(void *p
11cb0 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
11cc0 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
11cd0 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61  HDR(pData);.  Pa
11ce0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
11cf0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
11d00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11d10 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
11d20 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69   errors.  */.  i
11d30 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
11d40 73 6b 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72  sk ){ .    retur
11d50 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  n pager_errcode(
11d60 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
11d70 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  f( pPager->readO
11d80 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  nly ){.    retur
11d90 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20  n SQLITE_PERM;. 
11da0 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68   }..  /* Mark th
11db0 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e  e page as dirty.
11dc0 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61    If the page ha
11dd0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
11de0 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74  ritten.  ** to t
11df0 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20  he journal then 
11e00 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69  we can return ri
11e10 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20  ght away..  */. 
11e20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b   pPg->dirty = 1;
11e30 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f  .  if( pPg->inJo
11e40 75 72 6e 61 6c 20 26 26 20 28 70 50 67 2d 3e 69  urnal && (pPg->i
11e50 6e 53 74 6d 74 20 7c 7c 20 70 50 61 67 65 72 2d  nStmt || pPager-
11e60 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29  >stmtInUse==0) )
11e70 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  {.    pPager->di
11e80 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20  rtyCache = 1;.  
11e90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11ea0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  OK;.  }..  /* If
11eb0 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
11ec0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
11ed0 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
11ee0 6f 20 62 65 0a 20 20 2a 2a 20 77 72 69 74 74 65  o be.  ** writte
11ef0 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63  n to the transac
11f00 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  tion journal or 
11f10 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a  the ckeckpoint j
11f20 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 6f 72 20 62  ournal.  ** or b
11f30 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46  oth..  **.  ** F
11f40 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65  irst check to se
11f50 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  e that the trans
11f60 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65  action journal e
11f70 78 69 73 74 73 20 61 6e 64 0a 20 20 2a 2a 20 63  xists and.  ** c
11f80 72 65 61 74 65 20 69 74 20 69 66 20 69 74 20 64  reate it if it d
11f90 6f 65 73 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20  oes not..  */.  
11fa0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
11fb0 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
11fc0 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  OCK );.  rc = sq
11fd0 6c 69 74 65 33 70 61 67 65 72 5f 62 65 67 69 6e  lite3pager_begin
11fe0 28 70 44 61 74 61 2c 20 30 29 3b 0a 20 20 69 66  (pData, 0);.  if
11ff0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12000 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
12010 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
12020 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
12030 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
12040 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
12050 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70  journalOpen && p
12060 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
12070 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  l ){.    rc = pa
12080 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
12090 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
120a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
120b0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
120c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
120d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c  r->journalOpen |
120e0 7c 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  | !pPager->useJo
120f0 75 72 6e 61 6c 20 29 3b 0a 20 20 70 50 61 67 65  urnal );.  pPage
12100 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
12110 31 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74 72 61  1;..  /* The tra
12120 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
12130 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20   now exists and 
12140 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52 56  we have a RESERV
12150 45 44 20 6f 72 20 61 6e 0a 20 20 2a 2a 20 45 58  ED or an.  ** EX
12160 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
12170 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
12180 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74  e file.  Write t
12190 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
121a0 74 6f 0a 20 20 2a 2a 20 74 68 65 20 74 72 61 6e  to.  ** the tran
121b0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
121c0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
121d0 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 2a 2f  re already..  */
121e0 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a  .  if( !pPg->inJ
121f0 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61 67 65  ournal && (pPage
12200 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c  r->useJournal ||
12210 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 29 20   pPager->memDb) 
12220 29 7b 0a 20 20 20 20 69 66 28 20 28 69 6e 74 29  ){.    if( (int)
12230 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61  pPg->pgno <= pPa
12240 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
12250 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 50  ){.      int szP
12260 67 3b 0a 20 20 20 20 20 20 75 33 32 20 73 61 76  g;.      u32 sav
12270 65 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ed;.      if( pP
12280 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
12290 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79         PgHistory
122a0 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
122b0 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
122c0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 54 52  ger);.        TR
122d0 41 43 45 32 28 22 4a 4f 55 52 4e 41 4c 20 70 61  ACE2("JOURNAL pa
122e0 67 65 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70  ge %d\n", pPg->p
122f0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 61 73  gno);.        as
12300 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 4f 72  sert( pHist->pOr
12310 69 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ig==0 );.       
12320 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20   pHist->pOrig = 
12330 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
12340 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
12350 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
12360 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b   pHist->pOrig ){
12370 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
12380 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20  y(pHist->pOrig, 
12390 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
123a0 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g), pPager->page
123b0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Size);.        }
123c0 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  .        pPg->in
123d0 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
123e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
123f0 20 20 69 66 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f    if( journal_fo
12400 72 6d 61 74 3e 3d 4a 4f 55 52 4e 41 4c 5f 46 4f  rmat>=JOURNAL_FO
12410 52 4d 41 54 5f 33 20 29 7b 0a 20 20 20 20 20 20  RMAT_3 ){.      
12420 20 20 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20      u32 cksum = 
12430 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
12440 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  er, pPg->pgno, p
12450 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20  Data);.         
12460 20 73 61 76 65 64 20 3d 20 2a 28 75 33 32 2a 29   saved = *(u32*)
12470 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
12480 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  Pg);.          s
12490 74 6f 72 65 33 32 62 69 74 73 28 63 6b 73 75 6d  tore32bits(cksum
124a0 2c 20 70 50 67 2c 20 53 51 4c 49 54 45 5f 50 41  , pPg, SQLITE_PA
124b0 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  GE_SIZE);.      
124c0 20 20 20 20 73 7a 50 67 20 3d 20 53 51 4c 49 54      szPg = SQLIT
124d0 45 5f 50 41 47 45 5f 53 49 5a 45 2b 38 3b 0a 20  E_PAGE_SIZE+8;. 
124e0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
124f0 20 20 20 20 20 20 20 20 73 7a 50 67 20 3d 20 53          szPg = S
12500 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2b  QLITE_PAGE_SIZE+
12510 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  4;.        }.   
12520 20 20 20 20 20 73 74 6f 72 65 33 32 62 69 74 73       store32bits
12530 28 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c  (pPg->pgno, pPg,
12540 20 2d 34 29 3b 0a 20 20 20 20 20 20 20 20 43 4f   -4);.        CO
12550 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74  DEC(pPager, pDat
12560 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29  a, pPg->pgno, 7)
12570 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
12580 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70  qlite3OsWrite(&p
12590 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 28 28 63  Pager->jfd, &((c
125a0 68 61 72 2a 29 70 44 61 74 61 29 5b 2d 34 5d 2c  har*)pData)[-4],
125b0 20 73 7a 50 67 29 3b 0a 20 20 20 20 20 20 20 20   szPg);.        
125c0 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20  TRACE3("JOURNAL 
125d0 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
125e0 3d 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e  =%d\n", pPg->pgn
125f0 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  o, pPg->needSync
12600 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43  );.        CODEC
12610 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
12620 70 50 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20  pPg->pgno, 0);. 
12630 20 20 20 20 20 20 20 69 66 28 20 6a 6f 75 72 6e         if( journ
12640 61 6c 5f 66 6f 72 6d 61 74 3e 3d 4a 4f 55 52 4e  al_format>=JOURN
12650 41 4c 5f 46 4f 52 4d 41 54 5f 33 20 29 7b 0a 20  AL_FORMAT_3 ){. 
12660 20 20 20 20 20 20 20 20 20 2a 28 75 33 32 2a 29           *(u32*)
12670 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
12680 50 67 29 20 3d 20 73 61 76 65 64 3b 0a 20 20 20  Pg) = saved;.   
12690 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
126a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
126b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
126c0 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
126d0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
126e0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
126f0 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f  rrMask |= PAGER_
12700 45 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20  ERR_FULL;.      
12710 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12720 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12730 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b   pPager->nRec++;
12740 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
12750 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
12760 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  nal!=0 );.      
12770 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
12780 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  rnal[pPg->pgno/8
12790 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
127a0 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 70  no&7);.        p
127b0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  Pg->needSync = !
127c0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
127d0 20 20 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a          pPg->inJ
127e0 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20  ournal = 1;.    
127f0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
12800 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
12810 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61         pPager->a
12820 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
12830 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
12840 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20  pgno&7);.       
12850 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73     page_add_to_s
12860 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  tmt_list(pPg);. 
12870 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12880 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12890 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
128a0 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  = !pPager->journ
128b0 61 6c 53 74 61 72 74 65 64 20 26 26 20 21 70 50  alStarted && !pP
128c0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20  ager->noSync;.  
128d0 20 20 20 20 54 52 41 43 45 33 28 22 41 50 50 45      TRACE3("APPE
128e0 4e 44 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  ND page %d needS
128f0 79 6e 63 3d 25 64 5c 6e 22 2c 20 70 50 67 2d 3e  ync=%d\n", pPg->
12900 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53  pgno, pPg->needS
12910 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ync);.    }.    
12920 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  if( pPg->needSyn
12930 63 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  c ){.      pPage
12940 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
12950 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
12960 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
12970 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  t journal is ope
12980 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  n and the page i
12990 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 2a  s not in it,.  *
129a0 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65  * then write the
129b0 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
129c0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
129d0 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68  ournal.  Note th
129e0 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74  at.  ** the stat
129f0 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6c  ement journal al
12a00 77 61 79 73 20 75 73 65 73 20 74 68 65 20 73 69  ways uses the si
12a10 6d 70 6c 69 65 72 20 66 6f 72 6d 61 74 20 32 20  mplier format 2 
12a20 74 68 61 74 20 6c 61 63 6b 73 0a 20 20 2a 2a 20  that lacks.  ** 
12a30 63 68 65 63 6b 73 75 6d 73 2e 20 20 54 68 65 20  checksums.  The 
12a40 68 65 61 64 65 72 20 69 73 20 61 6c 73 6f 20 6f  header is also o
12a50 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mitted from the 
12a60 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
12a70 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  l..  */.  if( pP
12a80 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
12a90 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20  && !pPg->inStmt 
12aa0 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  && (int)pPg->pgn
12ab0 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  o<=pPager->stmtS
12ac0 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ize ){.    asser
12ad0 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  t( pPg->inJourna
12ae0 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70  l || (int)pPg->p
12af0 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67  gno>pPager->orig
12b00 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 69 66  DbSize );.    if
12b10 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20  ( pPager->memDb 
12b20 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  ){.      PgHisto
12b30 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
12b40 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
12b50 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73  Pager);.      as
12b60 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 53 74  sert( pHist->pSt
12b70 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  mt==0 );.      p
12b80 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71  Hist->pStmt = sq
12b90 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70  liteMallocRaw( p
12ba0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
12bb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 69  );.      if( pHi
12bc0 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20  st->pStmt ){.   
12bd0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73       memcpy(pHis
12be0 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44 52 5f  t->pStmt, PGHDR_
12bf0 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
12c00 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
12c10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54  .      }.      T
12c20 52 41 43 45 32 28 22 53 54 4d 54 2d 4a 4f 55 52  RACE2("STMT-JOUR
12c30 4e 41 4c 20 70 61 67 65 20 25 64 5c 6e 22 2c 20  NAL page %d\n", 
12c40 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
12c50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 6f  }else{.      sto
12c60 72 65 33 32 62 69 74 73 28 70 50 67 2d 3e 70 67  re32bits(pPg->pg
12c70 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20  no, pPg, -4);.  
12c80 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72      CODEC(pPager
12c90 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
12ca0 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 72 63  no, 7);.      rc
12cb0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
12cc0 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  e(&pPager->stfd,
12cd0 20 28 28 63 68 61 72 2a 29 70 44 61 74 61 29 2d   ((char*)pData)-
12ce0 34 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  4, SQLITE_PAGE_S
12cf0 49 5a 45 2b 34 29 3b 0a 20 20 20 20 20 20 54 52  IZE+4);.      TR
12d00 41 43 45 32 28 22 53 54 4d 54 2d 4a 4f 55 52 4e  ACE2("STMT-JOURN
12d10 41 4c 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70  AL page %d\n", p
12d20 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
12d30 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70   CODEC(pPager, p
12d40 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
12d50 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
12d60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12d70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70          sqlite3p
12d80 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
12d90 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70  ager);.        p
12da0 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c  Pager->errMask |
12db0 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  = PAGER_ERR_FULL
12dc0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
12dd0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
12de0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e     pPager->stmtN
12df0 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73  Rec++;.      ass
12e00 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
12e10 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Stmt!=0 );.     
12e20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
12e30 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
12e40 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
12e50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67  );.    }.    pag
12e60 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
12e70 73 74 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20  st(pPg);.  }..  
12e80 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61  /* Update the da
12e90 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20  tabase size and 
12ea0 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69  return..  */.  i
12eb0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
12ec0 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  e<(int)pPg->pgno
12ed0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
12ee0 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67  dbSize = pPg->pg
12ef0 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  no;.  }.  return
12f00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
12f10 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
12f20 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74   page given in t
12f30 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  he argument was 
12f40 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65  previously passe
12f50 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 70  d.** to sqlite3p
12f60 61 67 65 72 5f 77 72 69 74 65 28 29 2e 20 20 49  ager_write().  I
12f70 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
12f80 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74  eturn TRUE if it
12f90 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61   is ok.** to cha
12fa0 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  nge the content 
12fb0 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  of the page..*/.
12fc0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
12fd0 5f 69 73 77 72 69 74 65 61 62 6c 65 28 76 6f 69  _iswriteable(voi
12fe0 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
12ff0 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54  dr *pPg = DATA_T
13000 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
13010 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 64 69    return pPg->di
13020 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  rty;.}../*.** Re
13030 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e  place the conten
13040 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61  t of a single pa
13050 67 65 20 77 69 74 68 20 74 68 65 20 69 6e 66 6f  ge with the info
13060 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 74  rmation in the t
13070 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  hird.** argument
13080 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13090 70 61 67 65 72 5f 6f 76 65 72 77 72 69 74 65 28  pager_overwrite(
130a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
130b0 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a  gno pgno, void *
130c0 70 44 61 74 61 29 7b 0a 20 20 76 6f 69 64 20 2a  pData){.  void *
130d0 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b  pPage;.  int rc;
130e0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
130f0 70 61 67 65 72 5f 67 65 74 28 70 50 61 67 65 72  pager_get(pPager
13100 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b  , pgno, &pPage);
13110 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
13120 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
13130 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
13140 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ite(pPage);.    
13150 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
13160 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  K ){.      memcp
13170 79 28 70 50 61 67 65 2c 20 70 44 61 74 61 2c 20  y(pPage, pData, 
13180 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
13190 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
131a0 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
131b0 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pPage);.  }.  re
131c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
131d0 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
131e0 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
131f0 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74  he pager that it
13200 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
13210 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68  y to.** write th
13220 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  e information on
13230 20 70 61 67 65 20 22 70 67 6e 6f 22 20 62 61 63   page "pgno" bac
13240 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65  k to the disk, e
13250 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68  ven though.** th
13260 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  at page might be
13270 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
13280 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72  ..**.** The over
13290 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c  lying software l
132a0 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ayer calls this 
132b0 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c  routine when all
132c0 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20   of the data.** 
132d0 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
132e0 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68  e is unused.  Th
132f0 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68  e pager marks th
13300 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20  e page as clean 
13310 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f  so.** that it do
13320 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74  es not get writt
13330 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  en to disk..**.*
13340 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61  * Tests show tha
13350 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  t this optimizat
13360 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69  ion, together wi
13370 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  th the.** sqlite
13380 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c  3pager_dont_roll
13390 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f  back() below, mo
133a0 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74  re than double t
133b0 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c  he speed.** of l
133c0 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72  arge INSERT oper
133d0 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72  ations and quadr
133e0 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f  uple the speed o
133f0 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e  f large DELETEs.
13400 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
13410 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
13420 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61  ed, set the alwa
13430 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20  ysRollback flag 
13440 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73  to true..** Subs
13450 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
13460 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e  sqlite3pager_don
13470 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72  t_rollback() for
13480 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a   the same page.*
13490 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65  * will thereafte
134a0 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54  r be ignored.  T
134b0 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
134c0 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62   to avoid a prob
134d0 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70  lem.** where a p
134e0 61 67 65 20 77 69 74 68 20 64 61 74 61 20 69 73  age with data is
134f0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
13500 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e  eelist during on
13510 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74  e part of.** a t
13520 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20  ransaction then 
13530 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
13540 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67   freelist during
13550 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a   a later part.**
13560 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72 61   of the same tra
13570 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75  nsaction and reu
13580 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  sed for some oth
13590 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65  er purpose.  Whe
135a0 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74  n it.** is first
135b0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
135c0 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75  eelist, this rou
135d0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
135e0 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a   When reused,.**
135f0 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61   the dont_rollba
13600 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20  ck() routine is 
13610 63 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63  called.  But bec
13620 61 75 73 65 20 74 68 65 20 70 61 67 65 20 63 6f  ause the page co
13630 6e 74 61 69 6e 73 0a 2a 2a 20 63 72 69 74 69 63  ntains.** critic
13640 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c  al data, we stil
13650 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72  l need to be sur
13660 65 20 69 74 20 67 65 74 73 20 72 6f 6c 6c 65 64  e it gets rolled
13670 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65 0a 2a   back in spite.*
13680 2a 20 6f 66 20 74 68 65 20 64 6f 6e 74 5f 72 6f  * of the dont_ro
13690 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a  llback() call..*
136a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
136b0 67 65 72 5f 64 6f 6e 74 5f 77 72 69 74 65 28 50  ger_dont_write(P
136c0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
136d0 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
136e0 72 20 2a 70 50 67 3b 0a 0a 20 20 70 50 67 20 3d  r *pPg;..  pPg =
136f0 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
13700 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 70  ager, pgno);.  p
13710 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
13720 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50  ck = 1;.  if( pP
13730 67 20 26 26 20 70 50 67 2d 3e 64 69 72 74 79 20  g && pPg->dirty 
13740 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
13750 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29  r->dbSize==(int)
13760 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61  pPg->pgno && pPa
13770 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c  ger->origDbSize<
13780 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
13790 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
137a0 69 73 20 70 61 67 65 73 20 69 73 20 74 68 65 20  is pages is the 
137b0 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  last page in the
137c0 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69   file and the fi
137d0 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20 20  le has grown.   
137e0 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65     ** during the
137f0 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
13800 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f  tion, then do NO
13810 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  T mark the page 
13820 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20  as clean..      
13830 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74 61  ** When the data
13840 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73 2c  base file grows,
13850 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75   we must make su
13860 72 65 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  re that the last
13870 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 67   page.      ** g
13880 65 74 73 20 77 72 69 74 74 65 6e 20 61 74 20 6c  ets written at l
13890 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68 61  east once so tha
138a0 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  t the disk file 
138b0 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72 72  will be the corr
138c0 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a  ect.      ** siz
138d0 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74  e. If you do not
138e0 20 77 72 69 74 65 20 74 68 69 73 20 70 61 67 65   write this page
138f0 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
13900 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20   the file.      
13910 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 65  ** on the disk e
13920 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f 6f  nds up being too
13930 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e   small, that can
13940 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
13950 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 75  e.      ** corru
13960 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68 65  ption during the
13970 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f   next transactio
13980 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
13990 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52 41  }else{.      TRA
139a0 43 45 33 28 22 44 4f 4e 54 5f 57 52 49 54 45 20  CE3("DONT_WRITE 
139b0 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22  page %d of %d\n"
139c0 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65 72 2d 3e  , pgno, pPager->
139d0 66 64 2e 68 29 3b 0a 20 20 20 20 20 20 70 50 67  fd.h);.      pPg
139e0 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
139f0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
13a00 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  A call to this r
13a10 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65  outine tells the
13a20 20 70 61 67 65 72 20 74 68 61 74 20 69 66 20 61   pager that if a
13a30 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
13a40 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e  ,.** it is not n
13a50 65 63 65 73 73 61 72 79 20 74 6f 20 72 65 73 74  ecessary to rest
13a60 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20  ore the data on 
13a70 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20  the given page. 
13a80 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74   This.** means t
13a90 68 61 74 20 74 68 65 20 70 61 67 65 72 20 64 6f  hat the pager do
13aa0 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72  es not have to r
13ab0 65 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20  ecord the given 
13ac0 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72  page in the.** r
13ad0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
13ae0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
13af0 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62  pager_dont_rollb
13b00 61 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ack(void *pData)
13b10 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
13b20 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
13b30 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a  Data);.  Pager *
13b40 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
13b50 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 70 50 61  ager;..  if( pPa
13b60 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
13b70 52 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70  R_EXCLUSIVE || p
13b80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
13b90 65 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  en==0 ) return;.
13ba0 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79    if( pPg->alway
13bb0 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61  sRollback || pPa
13bc0 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
13bd0 61 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6d  ack || pPager->m
13be0 65 6d 44 62 20 29 20 72 65 74 75 72 6e 3b 0a 20  emDb ) return;. 
13bf0 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75   if( !pPg->inJou
13c00 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67  rnal && (int)pPg
13c10 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72  ->pgno <= pPager
13c20 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
13c30 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
13c40 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->aInJournal!=
13c50 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
13c60 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d  >aInJournal[pPg-
13c70 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
13c80 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
13c90 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
13ca0 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50   = 1;.    if( pP
13cb0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
13cc0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
13cd0 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67  >aInStmt[pPg->pg
13ce0 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
13cf0 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
13d00 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
13d10 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
13d20 20 7d 0a 20 20 20 20 54 52 41 43 45 33 28 22 44   }.    TRACE3("D
13d30 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67  ONT_ROLLBACK pag
13d40 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  e %d of %d\n", p
13d50 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 61 67 65 72  Pg->pgno, pPager
13d60 2d 3e 66 64 2e 68 29 3b 0a 20 20 7d 0a 20 20 69  ->fd.h);.  }.  i
13d70 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
13d80 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e  nUse && !pPg->in
13d90 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67  Stmt && (int)pPg
13da0 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
13db0 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20  stmtSize ){.    
13dc0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a  assert( pPg->inJ
13dd0 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70  ournal || (int)p
13de0 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
13df0 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
13e00 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
13e10 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b  r->aInStmt!=0 );
13e20 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
13e30 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  Stmt[pPg->pgno/8
13e40 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
13e50 6e 6f 26 37 29 3b 0a 20 20 20 20 70 61 67 65 5f  no&7);.    page_
13e60 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
13e70 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  (pPg);.  }.}.../
13e80 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48  *.** Clear a PgH
13e90 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a  istory block.*/.
13ea0 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61  static void clea
13eb0 72 48 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f  rHistory(PgHisto
13ec0 72 79 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71  ry *pHist){.  sq
13ed0 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e  liteFree(pHist->
13ee0 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65  pOrig);.  sqlite
13ef0 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d  Free(pHist->pStm
13f00 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72  t);.  pHist->pOr
13f10 69 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d  ig = 0;.  pHist-
13f20 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  >pStmt = 0;.}../
13f30 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20  *.** Commit all 
13f40 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
13f50 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65  atabase and rele
13f60 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
13f70 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
13f80 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f   commit fails fo
13f90 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20  r any reason, a 
13fa0 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74  rollback attempt
13fb0 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20   is made.** and 
13fc0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
13fd0 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74   returned.  If t
13fe0 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64  he commit worked
13ff0 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69  , SQLITE_OK.** i
14000 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
14010 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
14020 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50  commit(Pager *pP
14030 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
14040 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
14050 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
14060 72 4d 61 73 6b 3d 3d 50 41 47 45 52 5f 45 52 52  rMask==PAGER_ERR
14070 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20  _FULL ){.    rc 
14080 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  = sqlite3pager_r
14090 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
140a0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
140b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
140c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
140d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
140e0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
140f0 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
14100 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  !=0 ){.    rc = 
14110 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
14120 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
14130 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
14140 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41  pPager->state<PA
14150 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
14160 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14170 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54  E_ERROR;.  }.  T
14180 52 41 43 45 32 28 22 43 4f 4d 4d 49 54 20 25 64  RACE2("COMMIT %d
14190 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e  \n", pPager->fd.
141a0 68 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  h);.  if( pPager
141b0 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70  ->memDb ){.    p
141c0 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61  Pg = pager_get_a
141d0 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70  ll_dirty_pages(p
141e0 50 61 67 65 72 29 3b 0a 20 20 20 20 77 68 69 6c  Pager);.    whil
141f0 65 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20  e( pPg ){.      
14200 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 47 48  clearHistory(PGH
14210 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
14220 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
14230 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
14240 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
14250 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
14260 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pPg->inStmt = 0;
14270 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65  .      pPg->pPre
14280 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65  vStmt = pPg->pNe
14290 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  xtStmt = 0;.    
142a0 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69    pPg = pPg->pDi
142b0 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  rty;.    }.    p
142c0 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30  Pager->pStmt = 0
142d0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
142e0 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
142f0 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ED;.    return S
14300 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
14310 69 66 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74  if( pPager->dirt
14320 79 43 61 63 68 65 3d 3d 30 20 29 7b 0a 20 20 20  yCache==0 ){.   
14330 20 2f 2a 20 45 78 69 74 20 65 61 72 6c 79 20 28   /* Exit early (
14340 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 74 68  without doing th
14350 65 20 74 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e 67  e time-consuming
14360 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29   sqlite3OsSync()
14370 20 63 61 6c 6c 73 29 0a 20 20 20 20 2a 2a 20 69   calls).    ** i
14380 66 20 74 68 65 72 65 20 68 61 76 65 20 62 65 65  f there have bee
14390 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f 20  n no changes to 
143a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
143b0 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
143c0 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
143d0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  nc==0 );.    rc 
143e0 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
143f0 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
14400 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
14410 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e  = -1;.    return
14420 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
14430 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
14440 61 6c 4f 70 65 6e 20 29 3b 0a 23 69 66 20 30 0a  alOpen );.#if 0.
14450 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
14460 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  al(pPager, 0);. 
14470 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14480 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63  OK ){.    goto c
14490 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20 7d  ommit_abort;.  }
144a0 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67  .  pPg = pager_g
144b0 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67  et_all_dirty_pag
144c0 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  es(pPager);.  if
144d0 28 20 70 50 67 20 29 7b 0a 20 20 20 20 72 63 20  ( pPg ){.    rc 
144e0 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
144f0 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  gelist(pPg);.   
14500 20 69 66 28 20 72 63 20 7c 7c 20 28 21 70 50 61   if( rc || (!pPa
14510 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 73  ger->noSync && s
14520 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 26 70 50  qlite3OsSync(&pP
14530 61 67 65 72 2d 3e 66 64 29 21 3d 53 51 4c 49 54  ager->fd)!=SQLIT
14540 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 67  E_OK) ){.      g
14550 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74  oto commit_abort
14560 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
14570 69 66 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  if.  rc = sqlite
14580 33 70 61 67 65 72 5f 73 79 6e 63 28 70 50 61 67  3pager_sync(pPag
14590 65 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  er, 0);.  if( rc
145a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
145b0 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61     goto commit_a
145c0 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  bort;.  }.  rc =
145d0 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
145e0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50  ck(pPager);.  pP
145f0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
14600 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  1;.  return rc;.
14610 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
14620 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
14630 20 77 72 6f 6e 67 20 64 75 72 69 6e 67 20 74 68   wrong during th
14640 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  e commit process
14650 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61 62  ..  */.commit_ab
14660 6f 72 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69  ort:.  rc = sqli
14670 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
14680 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  k(pPager);.  if(
14690 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
146a0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
146b0 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65  E_FULL;.  }.  re
146c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
146d0 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63  * Rollback all c
146e0 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74  hanges.  The dat
146f0 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b  abase falls back
14700 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
14710 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e   mode..** All in
14720 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61  -memory cache pa
14730 67 65 73 20 72 65 76 65 72 74 20 74 6f 20 74 68  ges revert to th
14740 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  eir original dat
14750 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54  a contents..** T
14760 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65  he journal is de
14770 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  leted..**.** Thi
14780 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74  s routine cannot
14790 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d   fail unless som
147a0 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
147b0 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67  is not following
147c0 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20  .** the correct 
147d0 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c  locking protocol
147e0 20 28 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f   (SQLITE_PROTOCO
147f0 4c 29 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d  L) or unless som
14800 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65  e other.** proce
14810 73 73 20 69 73 20 77 72 69 74 69 6e 67 20 74 72  ss is writing tr
14820 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ash into the jou
14830 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54  rnal file (SQLIT
14840 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a  E_CORRUPT) or.**
14850 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20   unless a prior 
14860 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20  malloc() failed 
14870 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20  (SQLITE_NOMEM). 
14880 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   Appropriate err
14890 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20  or.** codes are 
148a0 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c  returned for all
148b0 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73   these occasions
148c0 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a  .  Otherwise,.**
148d0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
148e0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
148f0 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
14900 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
14910 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
14920 20 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43   TRACE2("ROLLBAC
14930 4b 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d  K %d\n", pPager-
14940 3e 66 64 2e 68 29 3b 0a 20 20 69 66 28 20 70 50  >fd.h);.  if( pP
14950 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
14960 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20     PgHdr *p;.   
14970 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70   for(p=pPager->p
14980 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  All; p; p=p->pNe
14990 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67  xtAll){.      Pg
149a0 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a  History *pHist;.
149b0 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 64 69        if( !p->di
149c0 72 74 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  rty ) continue;.
149d0 20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47        pHist = PG
149e0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70  HDR_TO_HIST(p, p
149f0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
14a00 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29  ( pHist->pOrig )
14a10 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
14a20 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
14a30 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c  ), pHist->pOrig,
14a40 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
14a50 65 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43  e);.        TRAC
14a60 45 32 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47  E2("ROLLBACK-PAG
14a70 45 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f  E %d\n", p->pgno
14a80 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
14a90 20 20 20 20 20 20 20 20 54 52 41 43 45 32 28 22          TRACE2("
14aa0 50 41 47 45 20 25 64 20 69 73 20 63 6c 65 61 6e  PAGE %d is clean
14ab0 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 29 3b 0a 20  \n", p->pgno);. 
14ac0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65       }.      cle
14ad0 61 72 48 69 73 74 6f 72 79 28 70 48 69 73 74 29  arHistory(pHist)
14ae0 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79  ;.      p->dirty
14af0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
14b00 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
14b10 20 20 20 20 70 2d 3e 69 6e 53 74 6d 74 20 3d 20      p->inStmt = 
14b20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65  0;.      p->pPre
14b30 76 53 74 6d 74 20 3d 20 70 2d 3e 70 4e 65 78 74  vStmt = p->pNext
14b40 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Stmt = 0;.    }.
14b50 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
14b60 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  t = 0;.    pPage
14b70 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67  r->dbSize = pPag
14b80 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a  er->origDbSize;.
14b90 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61      memoryTrunca
14ba0 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  te(pPager);.    
14bb0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
14bc0 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
14bd0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
14be0 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74  _SHARED;.    ret
14bf0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
14c00 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
14c10 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c  r->dirtyCache ||
14c20 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
14c30 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  lOpen ){.    rc 
14c40 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
14c50 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
14c60 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
14c70 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e  = -1;.    return
14c80 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   rc;.  }..  if( 
14c90 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21  pPager->errMask!
14ca0 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  =0 && pPager->er
14cb0 72 4d 61 73 6b 21 3d 50 41 47 45 52 5f 45 52 52  rMask!=PAGER_ERR
14cc0 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28  _FULL ){.    if(
14cd0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
14ce0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
14cf0 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70  ){.      pager_p
14d00 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
14d10 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  1);.    }.    re
14d20 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f  turn pager_errco
14d30 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  de(pPager);.  }.
14d40 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
14d50 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52  ate==PAGER_RESER
14d60 56 45 44 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  VED ){.    int r
14d70 63 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  c2;.    rc = pag
14d80 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28  er_reload_cache(
14d90 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63 32  pPager);.    rc2
14da0 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
14db0 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
14dc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14dd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
14de0 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  = rc2;.    }.  }
14df0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70  else{.    rc = p
14e00 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
14e10 61 67 65 72 2c 20 31 29 3b 0a 20 20 7d 0a 20 20  ager, 1);.  }.  
14e20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14e30 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  K ){.    rc = SQ
14e40 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
14e50 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73    pPager->errMas
14e60 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 43  k |= PAGER_ERR_C
14e70 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20 70 50  ORRUPT;.  }.  pP
14e80 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
14e90 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  1;.  return rc;.
14ea0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
14eb0 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74 61  TRUE if the data
14ec0 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65  base file is ope
14ed0 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20  ned read-only.  
14ee0 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
14ef0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
14f00 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77  is (in theory) w
14f10 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20  ritable..*/.int 
14f20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73 72  sqlite3pager_isr
14f30 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70  eadonly(Pager *p
14f40 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
14f50 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
14f60 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  y;.}../*.** This
14f70 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
14f80 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
14f90 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a   analysis only..
14fa0 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 70  */.int *sqlite3p
14fb0 61 67 65 72 5f 73 74 61 74 73 28 50 61 67 65 72  ager_stats(Pager
14fc0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61   *pPager){.  sta
14fd0 74 69 63 20 69 6e 74 20 61 5b 39 5d 3b 0a 20 20  tic int a[9];.  
14fe0 61 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[0] = pPager->n
14ff0 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50  Ref;.  a[1] = pP
15000 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61  ager->nPage;.  a
15010 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78  [2] = pPager->mx
15020 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70  Page;.  a[3] = p
15030 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
15040 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[4] = pPager->
15050 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20  state;.  a[5] = 
15060 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 3b  pPager->errMask;
15070 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72  .  a[6] = pPager
15080 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d  ->nHit;.  a[7] =
15090 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a   pPager->nMiss;.
150a0 20 20 61 5b 38 5d 20 3d 20 70 50 61 67 65 72 2d    a[8] = pPager-
150b0 3e 6e 4f 76 66 6c 3b 0a 20 20 72 65 74 75 72 6e  >nOvfl;.  return
150c0 20 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   a;.}../*.** Set
150d0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72   the statement r
150e0 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a  ollback point..*
150f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15100 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  e should be call
15110 65 64 20 77 69 74 68 20 74 68 65 20 74 72 61 6e  ed with the tran
15120 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
15130 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e  already.** open.
15140 20 20 41 20 6e 65 77 20 73 74 61 74 65 6d 65 6e    A new statemen
15150 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72 65  t journal is cre
15160 61 74 65 64 20 74 68 61 74 20 63 61 6e 20 62 65  ated that can be
15170 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63   used to rollbac
15180 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66 20  k.** changes of 
15190 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d  a single SQL com
151a0 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20 6c 61  mand within a la
151b0 72 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  rger transaction
151c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
151d0 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e  pager_stmt_begin
151e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
151f0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
15200 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54  r zTemp[SQLITE_T
15210 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 20  EMPNAME_SIZE];. 
15220 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
15230 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20  ->stmtInUse );. 
15240 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d 42 45   TRACE2("STMT-BE
15250 47 49 4e 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  GIN %d\n", pPage
15260 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 69 66 28 20  r->fd.h);.  if( 
15270 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
15280 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
15290 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 20 20  tInUse = 1;.    
152a0 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
152b0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
152c0 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e;.    return SQ
152d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
152e0 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
152f0 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70  nalOpen ){.    p
15300 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
15310 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  pen = 1;.    ret
15320 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
15330 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
15340 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
15350 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49   );.  pPager->aI
15360 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61  nStmt = sqliteMa
15370 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62  lloc( pPager->db
15380 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20  Size/8 + 1 );.  
15390 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  if( pPager->aInS
153a0 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  tmt==0 ){.    sq
153b0 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61  lite3OsLock(&pPa
153c0 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
153d0 4c 4f 43 4b 29 3b 0a 20 20 20 20 72 65 74 75 72  LOCK);.    retur
153e0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
153f0 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    }.#ifndef NDEB
15400 55 47 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  UG.  rc = sqlite
15410 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61  3OsFileSize(&pPa
15420 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65  ger->jfd, &pPage
15430 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20  r->stmtJSize);. 
15440 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
15450 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
15460 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
15470 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 3d  er->stmtJSize ==
15480 20 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52   .    pPager->nR
15490 65 63 2a 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ec*JOURNAL_PG_SZ
154a0 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 29  (journal_format)
154b0 20 2b 20 0a 20 20 20 20 4a 4f 55 52 4e 41 4c 5f   + .    JOURNAL_
154c0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 2c 20 6a  HDR_SZ(pPager, j
154d0 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 29 20 29  ournal_format) )
154e0 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65  ;.#endif.  pPage
154f0 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70  r->stmtJSize = p
15500 50 61 67 65 72 2d 3e 6e 52 65 63 2a 4a 4f 55 52  Pager->nRec*JOUR
15510 4e 41 4c 5f 50 47 5f 53 5a 28 6a 6f 75 72 6e 61  NAL_PG_SZ(journa
15520 6c 5f 66 6f 72 6d 61 74 29 0a 20 20 20 20 20 20  l_format).      
15530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15540 20 20 20 2b 20 4a 4f 55 52 4e 41 4c 5f 48 44 52     + JOURNAL_HDR
15550 5f 53 5a 28 70 50 61 67 65 72 2c 20 6a 6f 75 72  _SZ(pPager, jour
15560 6e 61 6c 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 70  nal_format);.  p
15570 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
15580 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
15590 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
155a0 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20  >stmtOpen ){.   
155b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
155c0 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d  er_opentemp(zTem
155d0 70 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 66 64  p, &pPager->stfd
155e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
155f0 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f  goto stmt_begin_
15600 66 61 69 6c 65 64 3b 0a 20 20 20 20 70 50 61 67  failed;.    pPag
15610 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31  er->stmtOpen = 1
15620 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
15630 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a  mtNRec = 0;.  }.
15640 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
15650 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  Use = 1;.  retur
15660 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73  n SQLITE_OK;. .s
15670 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
15680 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  :.  if( pPager->
15690 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 73  aInStmt ){.    s
156a0 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
156b0 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20  ->aInStmt);.    
156c0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
156d0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
156e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
156f0 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d 65 6e  ommit a statemen
15700 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
15710 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d  3pager_stmt_comm
15720 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
15730 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
15740 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
15750 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70    PgHdr *pPg, *p
15760 4e 65 78 74 3b 0a 20 20 20 20 54 52 41 43 45 32  Next;.    TRACE2
15770 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64  ("STMT-COMMIT %d
15780 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e  \n", pPager->fd.
15790 68 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61  h);.    if( !pPa
157a0 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
157b0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65      sqlite3OsSee
157c0 6b 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  k(&pPager->stfd,
157d0 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71   0);.      /* sq
157e0 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
157f0 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30  &pPager->stfd, 0
15800 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ); */.      sqli
15810 74 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e  teFree( pPager->
15820 61 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20  aInStmt );.     
15830 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
15840 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
15850 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
15860 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d  pStmt; pPg; pPg=
15870 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 70 4e  pNext){.      pN
15880 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ext = pPg->pNext
15890 53 74 6d 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Stmt;.      asse
158a0 72 74 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20  rt( pPg->inStmt 
158b0 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  );.      pPg->in
158c0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
158d0 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  pPg->pPrevStmt =
158e0 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20   pPg->pNextStmt 
158f0 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
15900 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
15910 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72          PgHistor
15920 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
15930 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
15940 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 73  ager);.        s
15950 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d  qliteFree(pHist-
15960 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  >pStmt);.       
15970 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20   pHist->pStmt = 
15980 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
15990 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
159a0 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70  tNRec = 0;.    p
159b0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
159c0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
159d0 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d  ->pStmt = 0;.  }
159e0 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41  .  pPager->stmtA
159f0 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72  utoopen = 0;.  r
15a00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15a10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
15a20 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ck a statement..
15a30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
15a40 67 65 72 5f 73 74 6d 74 5f 72 6f 6c 6c 62 61 63  ger_stmt_rollbac
15a50 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
15a60 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
15a70 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
15a80 55 73 65 20 29 7b 0a 20 20 20 20 54 52 41 43 45  Use ){.    TRACE
15a90 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b  2("STMT-ROLLBACK
15aa0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e   %d\n", pPager->
15ab0 66 64 2e 68 29 3b 0a 20 20 20 20 69 66 28 20 70  fd.h);.    if( p
15ac0 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
15ad0 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67        PgHdr *pPg
15ae0 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d  ;.      for(pPg=
15af0 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70  pPager->pStmt; p
15b00 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
15b10 78 74 53 74 6d 74 29 7b 0a 20 20 20 20 20 20 20  xtStmt){.       
15b20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
15b30 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
15b40 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
15b50 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73          if( pHis
15b60 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  t->pStmt ){.    
15b70 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48        memcpy(PGH
15b80 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
15b90 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70   pHist->pStmt, p
15ba0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
15bb0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
15bc0 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53  teFree(pHist->pS
15bd0 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tmt);.          
15be0 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30  pHist->pStmt = 0
15bf0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15c00 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
15c10 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
15c20 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20  r->stmtSize;.   
15c30 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74     memoryTruncat
15c40 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
15c50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15c60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15c70 20 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d    rc = pager_stm
15c80 74 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  t_playback(pPage
15c90 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
15ca0 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f  lite3pager_stmt_
15cb0 63 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a  commit(pPager);.
15cc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
15cd0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
15ce0 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41  .  pPager->stmtA
15cf0 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72  utoopen = 0;.  r
15d00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15d10 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75  ** Return the fu
15d20 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  ll pathname of t
15d30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15d40 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
15d50 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 66 69  *sqlite3pager_fi
15d60 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  lename(Pager *pP
15d70 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
15d80 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
15d90 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  e;.}../*.** Set 
15da0 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68  the codec for th
15db0 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64  is pager.*/.void
15dc0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
15dd0 74 5f 63 6f 64 65 63 28 0a 20 20 50 61 67 65 72  t_codec(.  Pager
15de0 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64   *pPager,.  void
15df0 20 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a   (*xCodec)(void*
15e00 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
15e10 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63  ,.  void *pCodec
15e20 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d  Arg.){.  pPager-
15e30 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63  >xCodec = xCodec
15e40 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64  ;.  pPager->pCod
15e50 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72  ecArg = pCodecAr
15e60 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  g;.}../*.** Sync
15e70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15e80 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72  le for the pager
15e90 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72   pPager. zMaster
15ea0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e   points to the n
15eb0 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74  ame.** of a mast
15ec0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
15ed0 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
15ee0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
15ef0 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f  individual.** jo
15f00 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73  urnal file. zMas
15f10 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c  ter may be NULL,
15f20 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70   which is interp
15f30 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74  reted as no mast
15f40 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61  er.** journal (a
15f50 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
15f60 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
15f70 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15f80 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74  e ensures that t
15f90 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
15fa0 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79 20  nced, all dirty 
15fb0 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a  pages written.**
15fc0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
15fd0 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64 61   file and the da
15fe0 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63  tabase file sync
15ff0 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68 69  ed. The only thi
16000 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69  ng that.** remai
16010 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65  ns to commit the
16020 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
16030 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  to delete the jo
16040 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a  urnal file (or.*
16050 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
16060 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69   file if specifi
16070 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ed)..**.** Note 
16080 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d  that if zMaster=
16090 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73  =NULL, this does
160a0 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61   not overwrite a
160b0 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a   previous value.
160c0 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20  ** passed to an 
160d0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e  sqlite3pager_syn
160e0 63 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 69 6e 74  c() call..*/.int
160f0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79   sqlite3pager_sy
16100 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
16110 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
16120 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
16130 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
16140 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
16150 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20  n in-memory db, 
16160 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65  or no pages have
16170 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
16180 2c 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  , this.  ** func
16190 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
161a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61  .  */.  if( !pPa
161b0 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70 50  ger->memDb && pP
161c0 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
161d0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
161e0 50 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Pg;.    assert( 
161f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
16200 70 65 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 53  pen );..    /* S
16210 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
16220 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d  file */.    rc =
16230 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
16240 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ger, zMaster);. 
16250 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16260 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
16270 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 57  _exit;..    /* W
16280 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70  rite all dirty p
16290 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ages to the data
162a0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20  base file */.   
162b0 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74   pPg = pager_get
162c0 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
162d0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63  (pPager);.    rc
162e0 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
162f0 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  agelist(pPg);.  
16300 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16310 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
16320 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  exit;..    /* If
16330 20 61 6e 79 20 70 61 67 65 73 20 77 65 72 65 20   any pages were 
16340 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e  actually written
16350 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62  , sync the datab
16360 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  ase file */.    
16370 69 66 28 20 70 50 67 20 26 26 20 21 70 50 61 67  if( pPg && !pPag
16380 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
16390 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
163a0 4f 73 53 79 6e 63 28 26 70 50 61 67 65 72 2d 3e  OsSync(&pPager->
163b0 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  fd);.    }.  }..
163c0 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 72 65 74  sync_exit:.  ret
163d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
163e0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
163f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
16400 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
16410 20 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b 20 66   the file lock f
16420 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
16430 65 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  er..** The retur
16440 6e 20 76 61 6c 75 65 20 69 73 20 6f 6e 65 20 6f  n value is one o
16450 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45  f NO_LOCK, SHARE
16460 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
16470 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e  _LOCK,.** PENDIN
16480 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43 4c 55  G_LOCK, or EXCLU
16490 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e  SIVE_LOCK..*/.in
164a0 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c  t sqlite3pager_l
164b0 6f 63 6b 73 74 61 74 65 28 50 61 67 65 72 20 2a  ockstate(Pager *
164c0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
164d0 6e 20 70 50 61 67 65 72 2d 3e 66 64 2e 6c 6f 63  n pPager->fd.loc
164e0 6b 74 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ktype;.}.#endif.
164f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
16500 45 53 54 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  EST./*.** Print 
16510 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c  a listing of all
16520 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67 65   referenced page
16530 73 20 61 6e 64 20 74 68 65 69 72 20 72 65 66 20  s and their ref 
16540 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  count..*/.void s
16550 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66 64  qlite3pager_refd
16560 75 6d 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  ump(Pager *pPage
16570 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
16580 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
16590 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
165a0 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
165b0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  ){.    if( pPg->
165c0 6e 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e  nRef<=0 ) contin
165d0 75 65 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22  ue;.    printf("
165e0 50 41 47 45 20 25 33 64 20 61 64 64 72 3d 30 78  PAGE %3d addr=0x
165f0 25 30 38 78 20 6e 52 65 66 3d 25 64 5c 6e 22 2c  %08x nRef=%d\n",
16600 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67   .       pPg->pg
16610 6e 6f 2c 20 28 69 6e 74 29 50 47 48 44 52 5f 54  no, (int)PGHDR_T
16620 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 67  O_DATA(pPg), pPg
16630 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23  ->nRef);.  }.}.#
16640 65 6e 64 69 66 0a                                endif.