/ Hex Artifact Content
Login

Artifact d1202ce02f7033e08e84c270106fbe688dcf42cd:


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: 38 20 32 30 30 34 2f 30 36 2f 31 30 20 30 30 3a  8 2004/06/10 00:
0360: 35 31 3a 34 34 20 64 72 68 20 45 78 70 20 24 0a  51:44 drh Exp $.
0370: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e  */.#include "os.
0380: 68 22 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75  h"         /* Mu
0390: 73 74 20 62 65 20 66 69 72 73 74 20 74 6f 20 65  st be first to e
03a0: 6e 61 62 6c 65 20 6c 61 72 67 65 20 66 69 6c 65  nable large file
03b0: 20 73 75 70 70 6f 72 74 20 2a 2f 0a 23 69 6e 63   support */.#inc
03c0: 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e  lude "sqliteInt.
03d0: 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 70 61 67  h".#include "pag
03e0: 65 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  er.h".#include <
03f0: 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75  assert.h>.#inclu
0400: 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f  de <string.h>../
0410: 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20  *.** Macros for 
0420: 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e  troubleshooting.
0430: 20 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65    Normally turne
0440: 64 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 73  d off.*/.#if 0.s
0450: 74 61 74 69 63 20 50 61 67 65 72 20 2a 6d 61 69  tatic Pager *mai
0460: 6e 50 61 67 65 72 20 3d 20 30 3b 0a 23 64 65 66  nPager = 0;.#def
0470: 69 6e 65 20 53 45 54 5f 50 41 47 45 52 28 58 29  ine SET_PAGER(X)
0480: 20 20 69 66 28 20 6d 61 69 6e 50 61 67 65 72 3d    if( mainPager=
0490: 3d 30 20 29 20 6d 61 69 6e 50 61 67 65 72 20 3d  =0 ) mainPager =
04a0: 20 28 58 29 0a 23 64 65 66 69 6e 65 20 43 4c 52   (X).#define CLR
04b0: 5f 50 41 47 45 52 28 58 29 20 20 69 66 28 20 6d  _PAGER(X)  if( m
04c0: 61 69 6e 50 61 67 65 72 3d 3d 28 58 29 20 29 20  ainPager==(X) ) 
04d0: 6d 61 69 6e 50 61 67 65 72 20 3d 20 30 0a 23 64  mainPager = 0.#d
04e0: 65 66 69 6e 65 20 54 52 41 43 45 31 28 58 29 20  efine TRACE1(X) 
04f0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d      if( pPager==
0500: 6d 61 69 6e 50 61 67 65 72 20 29 20 66 70 72 69  mainPager ) fpri
0510: 6e 74 66 28 73 74 64 65 72 72 2c 58 29 0a 23 64  ntf(stderr,X).#d
0520: 65 66 69 6e 65 20 54 52 41 43 45 32 28 58 2c 59  efine TRACE2(X,Y
0530: 29 20 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d  )   if( pPager==
0540: 6d 61 69 6e 50 61 67 65 72 20 29 20 66 70 72 69  mainPager ) fpri
0550: 6e 74 66 28 73 74 64 65 72 72 2c 58 2c 59 29 0a  ntf(stderr,X,Y).
0560: 23 64 65 66 69 6e 65 20 54 52 41 43 45 33 28 58  #define TRACE3(X
0570: 2c 59 2c 5a 29 20 69 66 28 20 70 50 61 67 65 72  ,Y,Z) if( pPager
0580: 3d 3d 6d 61 69 6e 50 61 67 65 72 20 29 20 66 70  ==mainPager ) fp
0590: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 58 2c 59  rintf(stderr,X,Y
05a0: 2c 5a 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ,Z).#else.#defin
05b0: 65 20 53 45 54 5f 50 41 47 45 52 28 58 29 0a 23  e SET_PAGER(X).#
05c0: 64 65 66 69 6e 65 20 43 4c 52 5f 50 41 47 45 52  define CLR_PAGER
05d0: 28 58 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43  (X).#define TRAC
05e0: 45 31 28 58 29 0a 23 64 65 66 69 6e 65 20 54 52  E1(X).#define TR
05f0: 41 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69 6e  ACE2(X,Y).#defin
0600: 65 20 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 0a  e TRACE3(X,Y,Z).
0610: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
0620: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 61 73  he page cache as
0630: 20 61 20 77 68 6f 6c 65 20 69 73 20 61 6c 77 61   a whole is alwa
0640: 79 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65  ys in one of the
0650: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74   following.** st
0660: 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41  ates:.**.**   PA
0670: 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20  GER_UNLOCK      
0680: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
0690: 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
06a0: 79 20 72 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a  y reading or .**
06b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06c0: 20 20 20 20 20 20 20 77 72 69 74 69 6e 67 20 74         writing t
06d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
06e0: 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a  .  There is no.*
06f0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0700: 20 20 20 20 20 20 20 20 64 61 74 61 20 68 65 6c          data hel
0710: 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68  d in memory.  Th
0720: 69 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  is is the initia
0730: 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
0740: 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65             state
0750: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0760: 53 48 41 52 45 44 20 20 20 20 20 20 20 20 54 68  SHARED        Th
0770: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0780: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0790: 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  base..**        
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
07b0: 72 69 74 69 6e 67 20 69 73 20 6e 6f 74 20 70 65  riting is not pe
07c0: 72 6d 69 74 74 65 64 2e 20 20 54 68 65 72 65 20  rmitted.  There 
07d0: 63 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20 20 20  can be.**       
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73  multiple readers
0800: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73   accessing the s
0810: 61 6d 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ame database.** 
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 20 66 69 6c 65 20 61 74 20 74 68        file at th
0840: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a  e same time..**.
0850: 2a 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52  **   PAGER_RESER
0860: 56 45 44 20 20 20 20 20 20 57 72 69 74 69 6e 67  VED      Writing
0870: 20 69 73 20 70 65 72 6d 69 74 74 65 64 20 74 6f   is permitted to
0880: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
0890: 6f 6e 6c 79 2e 0a 2a 2a 20 20 20 20 20 20 20 20  only..**        
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
08b0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
08c0: 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f  base file has no
08d0: 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e  t been modified.
08e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
08f0: 20 20 20 20 20 20 20 20 20 20 4f 74 68 65 72 20            Other 
0900: 70 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74  processes may st
0910: 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74  ill be reading t
0920: 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20  he on-disk.**   
0930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0940: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
0950: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  e..**.**   PAGER
0960: 5f 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54  _EXCLUSIVE     T
0970: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
0980: 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
0990: 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20  abase..**       
09a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09b0: 41 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73  Access is exclus
09c0: 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70  ive.  No other p
09d0: 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20  rocesses or.**  
09e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09f0: 20 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e       threads can
0a00: 20 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77   be reading or w
0a10: 72 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65  riting while one
0a20: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0a30: 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73            proces
0a40: 73 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a  s is writing..**
0a50: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63  .** The page cac
0a60: 68 65 20 63 6f 6d 65 73 20 75 70 20 69 6e 20 50  he comes up in P
0a70: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68  AGER_UNLOCK.  Th
0a80: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 0a 2a  e first time a.*
0a90: 2a 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 67 65  * sqlite_page_ge
0aa0: 74 28 29 20 6f 63 63 75 72 73 2c 20 74 68 65 20  t() occurs, the 
0ab0: 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e  state transition
0ac0: 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45  s to PAGER_SHARE
0ad0: 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20  D..** After all 
0ae0: 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
0af0: 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73  released using s
0b00: 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72 65 66  qlite_page_unref
0b10: 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61 74 65  (),.** the state
0b20: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 61 63   transitions bac
0b30: 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e 4c 4f 43  k to PAGER_UNLOC
0b40: 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69  K.  The first ti
0b50: 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69 74  me.** that sqlit
0b60: 65 5f 70 61 67 65 5f 77 72 69 74 65 28 29 20 69  e_page_write() i
0b70: 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 73 74  s called, the st
0b80: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0b90: 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45  to.** PAGER_RESE
0ba0: 52 56 45 44 2e 20 20 28 4e 6f 74 65 20 74 68 61  RVED.  (Note tha
0bb0: 74 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 77 72  t sqlite_page_wr
0bc0: 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62  ite() can only b
0bd0: 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61  e.** called on a
0be0: 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  n outstanding pa
0bf0: 67 65 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74  ge which means t
0c00: 68 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 75  hat the pager mu
0c10: 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50 41 47 45  st.** be in PAGE
0c20: 52 5f 53 48 41 52 45 44 20 62 65 66 6f 72 65 20  R_SHARED before 
0c30: 69 74 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  it transitions t
0c40: 6f 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  o PAGER_RESERVED
0c50: 2e 29 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  .).** The sqlite
0c60: 5f 70 61 67 65 5f 72 6f 6c 6c 62 61 63 6b 28 29  _page_rollback()
0c70: 20 61 6e 64 20 73 71 6c 69 74 65 5f 70 61 67 65   and sqlite_page
0c80: 5f 63 6f 6d 6d 69 74 28 29 20 66 75 6e 63 74 69  _commit() functi
0c90: 6f 6e 73 20 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ons .** transiti
0ca0: 6f 6e 20 74 68 65 20 73 74 61 74 65 20 66 72 6f  on the state fro
0cb0: 6d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  m PAGER_RESERVED
0cc0: 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53   to PAGER_EXCLUS
0cd0: 49 56 45 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f  IVE to.** PAGER_
0ce0: 53 48 41 52 45 44 2e 0a 2a 2f 0a 23 64 65 66 69  SHARED..*/.#defi
0cf0: 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  ne PAGER_UNLOCK 
0d00: 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50       0.#define P
0d10: 41 47 45 52 5f 53 48 41 52 45 44 20 20 20 20 20  AGER_SHARED     
0d20: 20 31 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   1.#define PAGER
0d30: 5f 52 45 53 45 52 56 45 44 20 20 20 20 32 0a 23  _RESERVED    2.#
0d40: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 58 43  define PAGER_EXC
0d50: 4c 55 53 49 56 45 20 20 20 33 0a 0a 0a 2f 2a 0a  LUSIVE   3.../*.
0d60: 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  ** Each in-memor
0d70: 79 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67  y image of a pag
0d80: 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 74 68  e begins with th
0d90: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64  e following head
0da0: 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64  er..** This head
0db0: 65 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62  er is only visib
0dc0: 6c 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 72  le to this pager
0dd0: 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c   module.  The cl
0de0: 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61  ient.** code tha
0df0: 74 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65  t calls pager se
0e00: 65 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61  es only the data
0e10: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68   that follows th
0e20: 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  e header..**.** 
0e30: 43 6c 69 65 6e 74 20 63 6f 64 65 20 73 68 6f 75  Client code shou
0e40: 6c 64 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 70  ld call sqlite3p
0e50: 61 67 65 72 5f 77 72 69 74 65 28 29 20 6f 6e 20  ager_write() on 
0e60: 61 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20  a page prior to 
0e70: 6d 61 6b 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f  making.** any mo
0e80: 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74  difications to t
0e90: 68 61 74 20 70 61 67 65 2e 20 20 54 68 65 20 66  hat page.  The f
0ea0: 69 72 73 74 20 74 69 6d 65 20 73 71 6c 69 74 65  irst time sqlite
0eb0: 33 70 61 67 65 72 5f 77 72 69 74 65 28 29 0a 2a  3pager_write().*
0ec0: 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  * is called, the
0ed0: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
0ee0: 6f 6e 74 65 6e 74 73 20 61 72 65 20 77 72 69 74  ontents are writ
0ef0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c  ten into the rol
0f00: 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  lback.** journal
0f10: 20 61 6e 64 20 50 67 48 64 72 2e 69 6e 4a 6f 75   and PgHdr.inJou
0f20: 72 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 6e  rnal and PgHdr.n
0f30: 65 65 64 53 79 6e 63 20 61 72 65 20 73 65 74 2e  eedSync are set.
0f40: 20 20 4c 61 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a    Later, once.**
0f50: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67   the journal pag
0f60: 65 20 68 61 73 20 6d 61 64 65 20 69 74 20 6f 6e  e has made it on
0f70: 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66  to the disk surf
0f80: 61 63 65 2c 20 50 67 48 64 72 2e 6e 65 65 64 53  ace, PgHdr.needS
0f90: 79 6e 63 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65  ync.** is cleare
0fa0: 64 2e 20 20 54 68 65 20 6d 6f 64 69 66 69 65 64  d.  The modified
0fb0: 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 20   page cannot be 
0fc0: 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74  written back int
0fd0: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a  o the original.*
0fe0: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
0ff0: 75 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61  until the journa
1000: 6c 20 70 61 67 65 73 20 68 61 73 20 62 65 65 6e  l pages has been
1010: 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
1020: 61 6e 64 20 74 68 65 0a 2a 2a 20 50 67 48 64 72  and the.** PgHdr
1030: 2e 6e 65 65 64 53 79 6e 63 20 68 61 73 20 62 65  .needSync has be
1040: 65 6e 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a  en cleared..**.*
1050: 2a 20 54 68 65 20 50 67 48 64 72 2e 64 69 72 74  * The PgHdr.dirt
1060: 79 20 66 6c 61 67 20 69 73 20 73 65 74 20 77 68  y flag is set wh
1070: 65 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  en sqlite3pager_
1080: 77 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65  write() is calle
1090: 64 20 61 6e 64 0a 2a 2a 20 69 73 20 63 6c 65 61  d and.** is clea
10a0: 72 65 64 20 61 67 61 69 6e 20 77 68 65 6e 20 74  red again when t
10b0: 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
10c0: 69 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20  is written back 
10d0: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  to the original.
10e0: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
10f0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
1100: 75 63 74 20 50 67 48 64 72 20 50 67 48 64 72 3b  uct PgHdr PgHdr;
1110: 0a 73 74 72 75 63 74 20 50 67 48 64 72 20 7b 0a  .struct PgHdr {.
1120: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
1130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1140: 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f   /* The pager to
1150: 20 77 68 69 63 68 20 74 68 69 73 20 70 61 67 65   which this page
1160: 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50 67   belongs */.  Pg
1170: 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
1180: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1190: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
11a0: 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
11b0: 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 48  .  PgHdr *pNextH
11c0: 61 73 68 2c 20 2a 70 50 72 65 76 48 61 73 68 3b  ash, *pPrevHash;
11d0: 20 20 2f 2a 20 48 61 73 68 20 63 6f 6c 6c 69 73    /* Hash collis
11e0: 69 6f 6e 20 63 68 61 69 6e 20 66 6f 72 20 50 67  ion chain for Pg
11f0: 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50 67  Hdr.pgno */.  Pg
1200: 48 64 72 20 2a 70 4e 65 78 74 46 72 65 65 2c 20  Hdr *pNextFree, 
1210: 2a 70 50 72 65 76 46 72 65 65 3b 20 20 2f 2a 20  *pPrevFree;  /* 
1220: 46 72 65 65 6c 69 73 74 20 6f 66 20 70 61 67 65  Freelist of page
1230: 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 20  s where nRef==0 
1240: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78  */.  PgHdr *pNex
1250: 74 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  tAll;           
1260: 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66      /* A list of
1270: 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20   all pages */.  
1280: 50 67 48 64 72 20 2a 70 4e 65 78 74 53 74 6d 74  PgHdr *pNextStmt
1290: 2c 20 2a 70 50 72 65 76 53 74 6d 74 3b 20 20 2f  , *pPrevStmt;  /
12a0: 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20  * List of pages 
12b0: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
12c0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38   journal */.  u8
12d0: 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20   inJournal;     
12e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12f0: 54 52 55 45 20 69 66 20 68 61 73 20 62 65 65 6e  TRUE if has been
1300: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
1310: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 53 74  nal */.  u8 inSt
1320: 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mt;             
1330: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
1340: 69 66 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  if in the statem
1350: 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a  ent subjournal *
1360: 2f 0a 20 20 75 38 20 64 69 72 74 79 3b 20 20 20  /.  u8 dirty;   
1370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1380: 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 77 65     /* TRUE if we
1390: 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 62   need to write b
13a0: 61 63 6b 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20  ack changes */. 
13b0: 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20   u8 needSync;   
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d0: 2f 2a 20 53 79 6e 63 20 6a 6f 75 72 6e 61 6c 20  /* Sync journal 
13e0: 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74  before writing t
13f0: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  his page */.  u8
1400: 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b   alwaysRollback;
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1420: 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c  Disable dont_rol
1430: 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68 69 73  lback() for this
1440: 20 70 61 67 65 20 2a 2f 0a 20 20 73 68 6f 72 74   page */.  short
1450: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
1460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1470: 62 65 72 20 6f 66 20 75 73 65 72 73 20 6f 66 20  ber of users of 
1480: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50  this page */.  P
1490: 67 48 64 72 20 2a 70 44 69 72 74 79 3b 20 20 20  gHdr *pDirty;   
14a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14b0: 20 44 69 72 74 79 20 70 61 67 65 73 20 73 6f 72   Dirty pages sor
14c0: 74 65 64 20 62 79 20 50 67 48 64 72 2e 70 67 6e  ted by PgHdr.pgn
14d0: 6f 20 2a 2f 0a 20 20 2f 2a 20 53 51 4c 49 54 45  o */.  /* SQLITE
14e0: 5f 50 41 47 45 5f 53 49 5a 45 20 62 79 74 65 73  _PAGE_SIZE bytes
14f0: 20 6f 66 20 70 61 67 65 20 64 61 74 61 20 66 6f   of page data fo
1500: 6c 6c 6f 77 20 74 68 69 73 20 68 65 61 64 65 72  llow this header
1510: 20 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72 2e 6e   */.  /* Pager.n
1520: 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20 6c  Extra bytes of l
1530: 6f 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c 6f 77  ocal data follow
1540: 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20 2a   the page data *
1550: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  /.};../*.** For 
1560: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e 6c  an in-memory onl
1570: 79 20 64 61 74 61 62 61 73 65 2c 20 73 6f 6d 65  y database, some
1580: 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   extra informati
1590: 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64 20 61  on is recorded a
15a0: 62 6f 75 74 0a 2a 2a 20 65 61 63 68 20 70 61 67  bout.** each pag
15b0: 65 20 73 6f 20 74 68 61 74 20 63 68 61 6e 67 65  e so that change
15c0: 73 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20  s can be rolled 
15d0: 62 61 63 6b 2e 20 20 28 4a 6f 75 72 6e 61 6c 20  back.  (Journal 
15e0: 66 69 6c 65 73 20 61 72 65 20 6e 6f 74 0a 2a 2a  files are not.**
15f0: 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65 6d   used for in-mem
1600: 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 29 20  ory databases.) 
1610: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   The following i
1620: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 61 64  nformation is ad
1630: 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 65 6e  ded to.** the en
1640: 64 20 6f 66 20 65 76 65 72 79 20 45 58 54 52 41  d of every EXTRA
1650: 20 62 6c 6f 63 6b 20 66 6f 72 20 69 6e 2d 6d 65   block for in-me
1660: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a  mory databases..
1670: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72  **.** This infor
1680: 6d 61 74 69 6f 6e 20 63 6f 75 6c 64 20 68 61 76  mation could hav
1690: 65 20 62 65 65 6e 20 61 64 64 65 64 20 64 69 72  e been added dir
16a0: 65 63 74 6c 79 20 74 6f 20 74 68 65 20 50 67 48  ectly to the PgH
16b0: 64 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  dr structure..**
16c0: 20 42 75 74 20 74 68 65 6e 20 69 74 20 77 6f 75   But then it wou
16d0: 6c 64 20 74 61 6b 65 20 75 70 20 61 6e 20 65 78  ld take up an ex
16e0: 74 72 61 20 38 20 62 79 74 65 73 20 6f 66 20 73  tra 8 bytes of s
16f0: 74 6f 72 61 67 65 20 6f 6e 20 65 76 65 72 79 20  torage on every 
1700: 50 67 48 64 72 0a 2a 2a 20 65 76 65 6e 20 66 6f  PgHdr.** even fo
1710: 72 20 64 69 73 6b 2d 62 61 73 65 64 20 64 61 74  r disk-based dat
1720: 61 62 61 73 65 73 2e 20 20 53 70 6c 69 74 74 69  abases.  Splitti
1730: 6e 67 20 69 74 20 6f 75 74 20 73 61 76 65 73 20  ng it out saves 
1740: 38 20 62 79 74 65 73 2e 20 20 54 68 69 73 0a 2a  8 bytes.  This.*
1750: 2a 20 69 73 20 6f 6e 6c 79 20 61 20 73 61 76 69  * is only a savi
1760: 6e 67 73 20 6f 66 20 30 2e 38 25 20 62 75 74 20  ngs of 0.8% but 
1770: 74 68 6f 73 65 20 70 65 72 63 65 6e 74 61 67 65  those percentage
1780: 73 20 61 64 64 20 75 70 2e 0a 2a 2f 0a 74 79 70  s add up..*/.typ
1790: 65 64 65 66 20 73 74 72 75 63 74 20 50 67 48 69  edef struct PgHi
17a0: 73 74 6f 72 79 20 50 67 48 69 73 74 6f 72 79 3b  story PgHistory;
17b0: 0a 73 74 72 75 63 74 20 50 67 48 69 73 74 6f 72  .struct PgHistor
17c0: 79 20 7b 0a 20 20 75 38 20 2a 70 4f 72 69 67 3b  y {.  u8 *pOrig;
17d0: 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
17e0: 20 70 61 67 65 20 74 65 78 74 2e 20 20 52 65 73   page text.  Res
17f0: 74 6f 72 65 20 74 6f 20 74 68 69 73 20 6f 6e 20  tore to this on 
1800: 61 20 66 75 6c 6c 20 72 6f 6c 6c 62 61 63 6b 20  a full rollback 
1810: 2a 2f 0a 20 20 75 38 20 2a 70 53 74 6d 74 3b 20  */.  u8 *pStmt; 
1820: 20 20 20 20 2f 2a 20 54 65 78 74 20 61 73 20 69      /* Text as i
1830: 74 20 77 61 73 20 61 74 20 74 68 65 20 62 65 67  t was at the beg
1840: 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 75  inning of the cu
1850: 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20  rrent statement 
1860: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d  */.};../*.** A m
1870: 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69 6e  acro used for in
1880: 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65 63  voking the codec
1890: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
18a0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
18b0: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64 65  E_HAS_CODEC.# de
18c0: 66 69 6e 65 20 43 4f 44 45 43 28 50 2c 44 2c 4e  fine CODEC(P,D,N
18d0: 2c 58 29 20 69 66 28 20 50 2d 3e 78 43 6f 64 65  ,X) if( P->xCode
18e0: 63 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28 50  c ){ P->xCodec(P
18f0: 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c  ->pCodecArg,D,N,
1900: 58 29 3b 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65  X); }.#else.# de
1910: 66 69 6e 65 20 43 4f 44 45 43 28 50 2c 44 2c 4e  fine CODEC(P,D,N
1920: 2c 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,X).#endif../*.*
1930: 2a 20 43 6f 6e 76 65 72 74 20 61 20 70 6f 69 6e  * Convert a poin
1940: 74 65 72 20 74 6f 20 61 20 50 67 48 64 72 20 69  ter to a PgHdr i
1950: 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  nto a pointer to
1960: 20 69 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e 64   its data.** and
1970: 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f 0a   back again..*/.
1980: 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f  #define PGHDR_TO
1990: 5f 44 41 54 41 28 50 29 20 20 28 28 76 6f 69 64  _DATA(P)  ((void
19a0: 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a 23 64 65  *)(&(P)[1])).#de
19b0: 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47 48  fine DATA_TO_PGH
19c0: 44 52 28 44 29 20 20 28 26 28 28 50 67 48 64 72  DR(D)  (&((PgHdr
19d0: 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65 66  *)(D))[-1]).#def
19e0: 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45 58 54  ine PGHDR_TO_EXT
19f0: 52 41 28 50 29 20 28 28 76 6f 69 64 2a 29 26 28  RA(P) ((void*)&(
1a00: 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31 5d 29  (char*)(&(P)[1])
1a10: 29 5b 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  )[SQLITE_PAGE_SI
1a20: 5a 45 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48  ZE]).#define PGH
1a30: 44 52 5f 54 4f 5f 48 49 53 54 28 50 2c 50 47 52  DR_TO_HIST(P,PGR
1a40: 29 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  )  \.           
1a50: 20 28 28 50 67 48 69 73 74 6f 72 79 2a 29 26 28   ((PgHistory*)&(
1a60: 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31 5d 29  (char*)(&(P)[1])
1a70: 29 5b 28 50 47 52 29 2d 3e 70 61 67 65 53 69 7a  )[(PGR)->pageSiz
1a80: 65 2b 28 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d  e+(PGR)->nExtra]
1a90: 29 0a 0a 2f 2a 0a 2a 2a 20 48 6f 77 20 62 69 67  )../*.** How big
1aa0: 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73   to make the has
1ab0: 68 20 74 61 62 6c 65 20 75 73 65 64 20 66 6f 72  h table used for
1ac0: 20 6c 6f 63 61 74 69 6e 67 20 69 6e 2d 6d 65 6d   locating in-mem
1ad0: 6f 72 79 20 70 61 67 65 73 0a 2a 2a 20 62 79 20  ory pages.** by 
1ae0: 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a  page number..*/.
1af0: 23 64 65 66 69 6e 65 20 4e 5f 50 47 5f 48 41 53  #define N_PG_HAS
1b00: 48 20 32 30 34 38 0a 0a 2f 2a 0a 2a 2a 20 48 61  H 2048../*.** Ha
1b10: 73 68 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  sh a page number
1b20: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 61 67 65  .*/.#define page
1b30: 72 5f 68 61 73 68 28 50 4e 29 20 20 28 28 50 4e  r_hash(PN)  ((PN
1b40: 29 26 28 4e 5f 50 47 5f 48 41 53 48 2d 31 29 29  )&(N_PG_HASH-1))
1b50: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70  ../*.** A open p
1b60: 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e 20  age cache is an 
1b70: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1b80: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
1b90: 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50  ure..*/.struct P
1ba0: 61 67 65 72 20 7b 0a 20 20 63 68 61 72 20 2a 7a  ager {.  char *z
1bb0: 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
1bc0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1bd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1be0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f  e */.  char *zJo
1bf0: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
1c00: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1c10: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
1c20: 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69 72 65 63  /.  char *zDirec
1c30: 74 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  tory;           
1c40: 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 68 6f 6c  /* Directory hol
1c50: 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a  d database and j
1c60: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a  ournal files */.
1c70: 20 20 4f 73 46 69 6c 65 20 66 64 2c 20 6a 66 64    OsFile fd, jfd
1c80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1c90: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
1ca0: 73 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 61  s for database a
1cb0: 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  nd journal */.  
1cc0: 4f 73 46 69 6c 65 20 73 74 66 64 3b 20 20 20 20  OsFile stfd;    
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1ce0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
1cf0: 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  or the statement
1d00: 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20   subjournal*/.  
1d10: 69 6e 74 20 64 62 53 69 7a 65 3b 20 20 20 20 20  int dbSize;     
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1d30: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1d40: 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  n the file */.  
1d50: 69 6e 74 20 6f 72 69 67 44 62 53 69 7a 65 3b 20  int origDbSize; 
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64              /* d
1d70: 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65  bSize before the
1d80: 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 20   current change 
1d90: 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 53 69 7a  */.  int stmtSiz
1da0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1db0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61   /* Size of data
1dc0: 62 61 73 65 20 28 69 6e 20 70 61 67 65 73 29 20  base (in pages) 
1dd0: 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20  at stmt_begin() 
1de0: 2a 2f 0a 20 20 6f 66 66 5f 74 20 73 74 6d 74 4a  */.  off_t stmtJ
1df0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
1e00: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72   /* Size of jour
1e10: 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65 67 69  nal at stmt_begi
1e20: 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  n() */.  int nRe
1e30: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1e40: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1e50: 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20  f pages written 
1e60: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  to the journal *
1e70: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69  /.  u32 cksumIni
1e80: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1e90: 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20  /* Quasi-random 
1ea0: 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65  value added to e
1eb0: 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f  very checksum */
1ec0: 0a 20 20 69 6e 74 20 73 74 6d 74 4e 52 65 63 3b  .  int stmtNRec;
1ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ee0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  * Number of reco
1ef0: 72 64 73 20 69 6e 20 73 74 6d 74 20 73 75 62 6a  rds in stmt subj
1f00: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  ournal */.  int 
1f10: 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20  nExtra;         
1f20: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
1f30: 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74  his many bytes t
1f40: 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
1f50: 20 70 61 67 65 20 2a 2f 0a 20 20 76 6f 69 64 20   page */.  void 
1f60: 28 2a 78 44 65 73 74 72 75 63 74 6f 72 29 28 76  (*xDestructor)(v
1f70: 6f 69 64 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61  oid*,int); /* Ca
1f80: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
1f90: 77 68 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67  when freeing pag
1fa0: 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  es */.  void (*x
1fb0: 52 65 69 6e 69 74 65 72 29 28 76 6f 69 64 2a 2c  Reiniter)(void*,
1fc0: 69 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20  int);   /* Call 
1fd0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
1fe0: 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65  n reloading page
1ff0: 73 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53  s */.  int pageS
2000: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
2010: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2020: 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20  bytes in a page 
2030: 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  */.  int nPage; 
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2050: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
2060: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
2070: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ges */.  int nRe
2080: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
2090: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
20a0: 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
20b0: 73 20 77 69 74 68 20 50 67 48 64 72 2e 6e 52 65  s with PgHdr.nRe
20c0: 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50  f>0 */.  int mxP
20d0: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
20e0: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
20f0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2100: 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63 68 65  to hold in cache
2110: 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20   */.  int nHit, 
2120: 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20  nMiss, nOvfl;   
2130: 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 2c    /* Cache hits,
2140: 20 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52   missing, and LR
2150: 55 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20  U overflows */. 
2160: 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 29 28   void (*xCodec)(
2170: 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
2180: 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e  ,int); /* Routin
2190: 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e  e for en/decodin
21a0: 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  g data */.  void
21b0: 20 2a 70 43 6f 64 65 63 41 72 67 3b 20 20 20 20   *pCodecArg;    
21c0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
21d0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f   argument to xCo
21e0: 64 65 63 28 29 20 2a 2f 0a 20 20 75 38 20 6a 6f  dec() */.  u8 jo
21f0: 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20  urnalOpen;      
2200: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2210: 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  f journal file d
2220: 65 73 63 72 69 70 74 6f 72 73 20 69 73 20 76 61  escriptors is va
2230: 6c 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  lid */.  u8 jour
2240: 6e 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20  nalStarted;     
2250: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2260: 68 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61  header of journa
2270: 6c 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20  l is synced */. 
2280: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
2290: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22a0: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
22b0: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
22c0: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  ile */.  u8 stmt
22d0: 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  Open;           
22e0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
22f0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  the statement su
2300: 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e  bjournal is open
2310: 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e 55   */.  u8 stmtInU
2320: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
2330: 20 20 2f 2a 20 54 72 75 65 20 77 65 20 61 72 65    /* True we are
2340: 20 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20   in a statement 
2350: 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  subtransaction *
2360: 2f 0a 20 20 75 38 20 73 74 6d 74 41 75 74 6f 6f  /.  u8 stmtAutoo
2370: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
2380: 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75  /* Open stmt jou
2390: 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a  rnal when main j
23a0: 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64  ournal is opened
23b0: 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20  */.  u8 noSync; 
23c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d0: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20   /* Do not sync 
23e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74  the journal if t
23f0: 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c  rue */.  u8 full
2400: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
2410: 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61       /* Do extra
2420: 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f   syncs of the jo
2430: 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74  urnal for robust
2440: 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 74 61  ness */.  u8 sta
2450: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
2460: 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 55        /* PAGER_U
2470: 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20  NLOCK, _SHARED, 
2480: 5f 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e 20  _RESERVED, etc. 
2490: 2a 2f 0a 20 20 75 38 20 65 72 72 4d 61 73 6b 3b  */.  u8 errMask;
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b0: 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72   /* One of sever
24c0: 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f  al kinds of erro
24d0: 72 73 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  rs */.  u8 tempF
24e0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
24f0: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
2500: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
2510: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61  file */.  u8 rea
2520: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
2530: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
2540: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
2550: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e  tabase */.  u8 n
2560: 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20  eedSync;        
2570: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2580: 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73  if an fsync() is
2590: 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a   needed on the j
25a0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64  ournal */.  u8 d
25b0: 69 72 74 79 43 61 63 68 65 3b 20 20 20 20 20 20  irtyCache;      
25c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
25d0: 69 66 20 63 61 63 68 65 64 20 70 61 67 65 73 20  if cached pages 
25e0: 68 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a  have changed */.
25f0: 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62    u8 alwaysRollb
2600: 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ack;          /*
2610: 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f   Disable dont_ro
2620: 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c  llback() for all
2630: 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d   pages */.  u8 m
2640: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
2650: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2660: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
2670: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20  ile I/O */.  u8 
2680: 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *aInJournal;    
2690: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
26a0: 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67  bit for each pag
26b0: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
26c0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a  e file */.  u8 *
26d0: 61 49 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20  aInStmt;        
26e0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62          /* One b
26f0: 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  it for each page
2700: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2710: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69   */.  PgHdr *pFi
2720: 72 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20  rst, *pLast;    
2730: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65    /* List of fre
2740: 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48  e pages */.  PgH
2750: 64 72 20 2a 70 46 69 72 73 74 53 79 6e 63 65 64  dr *pFirstSynced
2760: 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ;        /* Firs
2770: 74 20 66 72 65 65 20 70 61 67 65 20 77 69 74 68  t free page with
2780: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d   PgHdr.needSync=
2790: 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  =0 */.  PgHdr *p
27a0: 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  All;            
27b0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61      /* List of a
27c0: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67  ll pages */.  Pg
27d0: 48 64 72 20 2a 70 53 74 6d 74 3b 20 20 20 20 20  Hdr *pStmt;     
27e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
27f0: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
2800: 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a  e statement subj
2810: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64  ournal */.  PgHd
2820: 72 20 2a 61 48 61 73 68 5b 4e 5f 50 47 5f 48 41  r *aHash[N_PG_HA
2830: 53 48 5d 3b 20 20 20 20 2f 2a 20 48 61 73 68 20  SH];    /* Hash 
2840: 74 61 62 6c 65 20 74 6f 20 6d 61 70 20 70 61 67  table to map pag
2850: 65 20 6e 75 6d 62 65 72 20 6f 66 20 50 67 48 64  e number of PgHd
2860: 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74  r */.  int nMast
2870: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
2880: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2890: 62 79 74 65 73 20 74 6f 20 72 65 73 65 72 76 65  bytes to reserve
28a0: 20 66 6f 72 20 6d 61 73 74 65 72 20 6a 2e 70 20   for master j.p 
28b0: 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 72  */.  BusyHandler
28c0: 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 20   *pBusyHandler; 
28d0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
28e0: 71 6c 69 74 65 2e 62 75 73 79 48 61 6e 64 6c 65  qlite.busyHandle
28f0: 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  r */.};../*.** T
2900: 68 65 73 65 20 61 72 65 20 62 69 74 73 20 74 68  hese are bits th
2910: 61 74 20 63 61 6e 20 62 65 20 73 65 74 20 69 6e  at can be set in
2920: 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 2e 0a   Pager.errMask..
2930: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
2940: 5f 45 52 52 5f 46 55 4c 4c 20 20 20 20 20 30 78  _ERR_FULL     0x
2950: 30 31 20 20 2f 2a 20 61 20 77 72 69 74 65 28 29  01  /* a write()
2960: 20 66 61 69 6c 65 64 20 2a 2f 0a 23 64 65 66 69   failed */.#defi
2970: 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d  ne PAGER_ERR_MEM
2980: 20 20 20 20 20 20 30 78 30 32 20 20 2f 2a 20 6d        0x02  /* m
2990: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 2a  alloc() failed *
29a0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
29b0: 45 52 52 5f 4c 4f 43 4b 20 20 20 20 20 30 78 30  ERR_LOCK     0x0
29c0: 34 20 20 2f 2a 20 65 72 72 6f 72 20 69 6e 20 74  4  /* error in t
29d0: 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f  he locking proto
29e0: 63 6f 6c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  col */.#define P
29f0: 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54  AGER_ERR_CORRUPT
2a00: 20 20 30 78 30 38 20 20 2f 2a 20 64 61 74 61 62    0x08  /* datab
2a10: 61 73 65 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 63  ase or journal c
2a20: 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 23 64 65  orruption */.#de
2a30: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 44  fine PAGER_ERR_D
2a40: 49 53 4b 20 20 20 20 20 30 78 31 30 20 20 2f 2a  ISK     0x10  /*
2a50: 20 67 65 6e 65 72 61 6c 20 64 69 73 6b 20 49 2f   general disk I/
2a60: 4f 20 65 72 72 6f 72 20 2d 20 62 61 64 20 68 61  O error - bad ha
2a70: 72 64 20 64 72 69 76 65 3f 20 2a 2f 0a 0a 2f 2a  rd drive? */../*
2a80: 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** Journal file
2a90: 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  s begin with the
2aa0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63   following magic
2ab0: 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61   string.  The da
2ac0: 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e  ta.** was obtain
2ad0: 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e  ed from /dev/ran
2ae0: 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64  dom.  It is used
2af0: 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74   only as a sanit
2b00: 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  y check..**.** S
2b10: 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38  ince version 2.8
2b20: 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .0, the journal 
2b30: 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20  format contains 
2b40: 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74  additional sanit
2b50: 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e  y.** checking in
2b60: 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74  formation.  If t
2b70: 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77  he power fails w
2b80: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
2b90: 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69   is begin.** wri
2ba0: 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f  tten, semi-rando
2bb0: 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d  m garbage data m
2bc0: 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 74  ight appear in t
2bd0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
2be0: 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69  le after power i
2bf0: 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20  s restored.  If 
2c00: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68  an attempt is th
2c10: 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f  en made.** to ro
2c20: 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  ll the journal b
2c30: 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
2c40: 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75  e could be corru
2c50: 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74  pted.  The addit
2c60: 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20  ional.** sanity 
2c70: 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73  checking data is
2c80: 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64   an attempt to d
2c90: 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62  iscover the garb
2ca0: 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  age in the.** jo
2cb0: 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65  urnal and ignore
2cc0: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73   it..**.** The s
2cd0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69  anity checking i
2ce0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
2cf0: 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66  he new journal f
2d00: 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a  ormat consists.*
2d10: 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68  * of a 32-bit ch
2d20: 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70  ecksum on each p
2d30: 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68  age of data.  Th
2d40: 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72  e checksum cover
2d50: 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61  s both.** the pa
2d60: 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  ge number and th
2d70: 65 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  e SQLITE_PAGE_SI
2d80: 5a 45 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ZE bytes of data
2d90: 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a   for the page..*
2da0: 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20  * This cksum is 
2db0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
2dc0: 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76   32-bit random v
2dd0: 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72  alue that appear
2de0: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  s in the.** jour
2df0: 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61  nal file right a
2e00: 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e  fter the header.
2e10: 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69    The random ini
2e20: 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f  tializer is impo
2e30: 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73  rtant,.** becaus
2e40: 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  e garbage data t
2e50: 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74  hat appears at t
2e60: 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72  he end of a jour
2e70: 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a  nal is likely.**
2e80: 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f   data that was o
2e90: 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c  nce in other fil
2ea0: 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77  es that have now
2eb0: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20   been deleted.  
2ec0: 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67  If the.** garbag
2ed0: 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d  e data came from
2ee0: 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75   an obsolete jou
2ef0: 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63  rnal file, the c
2f00: 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a  hecksums might.*
2f10: 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42  * be correct.  B
2f20: 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  ut by initializi
2f30: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
2f40: 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  to random value 
2f50: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66  which.** is diff
2f60: 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20  erent for every 
2f70: 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69  journal, we mini
2f80: 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a  mize that risk..
2f90: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
2fa0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a  unsigned char aJ
2fb0: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20  ournalMagic[] = 
2fc0: 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20  {.  0xd9, 0xd5, 
2fd0: 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30  0x05, 0xf9, 0x20
2fe0: 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78  , 0xa1, 0x63, 0x
2ff0: 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  d7,.};../*.** Th
3000: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65  e size of the he
3010: 61 64 65 72 20 61 6e 64 20 6f 66 20 65 61 63 68  ader and of each
3020: 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75   page in the jou
3030: 72 6e 61 6c 20 76 61 72 69 65 73 20 61 63 63 6f  rnal varies acco
3040: 72 64 69 6e 67 0a 2a 2a 20 74 6f 20 77 68 69 63  rding.** to whic
3050: 68 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  h journal format
3060: 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20   is being used. 
3070: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   The following m
3080: 61 63 72 6f 73 20 66 69 67 75 72 65 20 6f 75 74  acros figure out
3090: 0a 2a 2a 20 74 68 65 20 73 69 7a 65 73 20 62 61  .** the sizes ba
30a0: 73 65 64 20 6f 6e 20 66 6f 72 6d 61 74 20 6e 75  sed on format nu
30b0: 6d 62 65 72 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  mbers..*/.#defin
30c0: 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e JOURNAL_HDR_SZ
30d0: 28 70 50 61 67 65 72 29 20 28 32 34 20 2b 20 28  (pPager) (24 + (
30e0: 70 50 61 67 65 72 29 2d 3e 6e 4d 61 73 74 65 72  pPager)->nMaster
30f0: 29 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  ).#define JOURNA
3100: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20  L_PG_SZ(pPager) 
3110: 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53   ((pPager->pageS
3120: 69 7a 65 29 20 2b 20 38 29 0a 0a 0a 2f 2a 0a 2a  ize) + 8).../*.*
3130: 2a 20 45 6e 61 62 6c 65 20 72 65 66 65 72 65 6e  * Enable referen
3140: 63 65 20 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e  ce count trackin
3150: 67 20 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65  g here:.*/.#ifde
3160: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
3170: 69 6e 74 20 70 61 67 65 72 33 5f 72 65 66 69 6e  int pager3_refin
3180: 66 6f 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20  fo_enable = 0;. 
3190: 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67   static void pag
31a0: 65 72 5f 72 65 66 69 6e 66 6f 28 50 67 48 64 72  er_refinfo(PgHdr
31b0: 20 2a 70 29 7b 0a 20 20 20 20 73 74 61 74 69 63   *p){.    static
31c0: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
31d0: 20 20 69 66 28 20 21 70 61 67 65 72 33 5f 72 65    if( !pager3_re
31e0: 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72  finfo_enable ) r
31f0: 65 74 75 72 6e 3b 0a 20 20 20 20 70 72 69 6e 74  eturn;.    print
3200: 66 28 0a 20 20 20 20 20 20 20 22 52 45 46 43 4e  f(.       "REFCN
3210: 54 3a 20 25 34 64 20 61 64 64 72 3d 30 78 25 30  T: %4d addr=0x%0
3220: 38 78 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 0a 20  8x nRef=%d\n",. 
3230: 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f 2c 20 28        p->pgno, (
3240: 69 6e 74 29 50 47 48 44 52 5f 54 4f 5f 44 41 54  int)PGHDR_TO_DAT
3250: 41 28 70 29 2c 20 70 2d 3e 6e 52 65 66 0a 20 20  A(p), p->nRef.  
3260: 20 20 29 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 20    );.    cnt++; 
3270: 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67 20 74    /* Something t
3280: 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69  o set a breakpoi
3290: 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64  nt on */.  }.# d
32a0: 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29  efine REFINFO(X)
32b0: 20 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28    pager_refinfo(
32c0: 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  X).#else.# defin
32d0: 65 20 52 45 46 49 4e 46 4f 28 58 29 0a 23 65 6e  e REFINFO(X).#en
32e0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
32f0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
3300: 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20   from the given 
3310: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
3320: 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65    Store the inte
3330: 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72  ger.** that is r
3340: 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52  ead in *pRes.  R
3350: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
3360: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
3370: 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65  rked, or an.** e
3380: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
3390: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
33a0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
33b0: 20 72 65 61 64 33 32 62 69 74 73 28 4f 73 46 69   read32bits(OsFi
33c0: 6c 65 20 2a 66 64 2c 20 75 33 32 20 2a 70 52 65  le *fd, u32 *pRe
33d0: 73 29 7b 0a 20 20 75 33 32 20 72 65 73 3b 0a 20  s){.  u32 res;. 
33e0: 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20   int rc;.  rc = 
33f0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64  sqlite3OsRead(fd
3400: 2c 20 26 72 65 73 2c 20 73 69 7a 65 6f 66 28 72  , &res, sizeof(r
3410: 65 73 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  es));.  if( rc==
3420: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3430: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
3440: 63 5b 34 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  c[4];.    memcpy
3450: 28 61 63 2c 20 26 72 65 73 2c 20 34 29 3b 0a 20  (ac, &res, 4);. 
3460: 20 20 20 72 65 73 20 3d 20 28 61 63 5b 30 5d 3c     res = (ac[0]<
3470: 3c 32 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c 31  <24) | (ac[1]<<1
3480: 36 29 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29 20  6) | (ac[2]<<8) 
3490: 7c 20 61 63 5b 33 5d 3b 0a 20 20 7d 0a 20 20 2a  | ac[3];.  }.  *
34a0: 70 52 65 73 20 3d 20 72 65 73 3b 0a 20 20 72 65  pRes = res;.  re
34b0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
34c0: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
34d0: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68   integer into th
34e0: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
34f0: 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e  criptor.  Return
3500: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
3510: 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
3520: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
3530: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
3540: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
3550: 20 77 72 69 74 65 33 32 62 69 74 73 28 4f 73 46   write32bits(OsF
3560: 69 6c 65 20 2a 66 64 2c 20 75 33 32 20 76 61 6c  ile *fd, u32 val
3570: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
3580: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 61 63 5b 30  ar ac[4];.  ac[0
3590: 5d 20 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26 20  ] = (val>>24) & 
35a0: 30 78 66 66 3b 0a 20 20 61 63 5b 31 5d 20 3d 20  0xff;.  ac[1] = 
35b0: 28 76 61 6c 3e 3e 31 36 29 20 26 20 30 78 66 66  (val>>16) & 0xff
35c0: 3b 0a 20 20 61 63 5b 32 5d 20 3d 20 28 76 61 6c  ;.  ac[2] = (val
35d0: 3e 3e 38 29 20 26 20 30 78 66 66 3b 0a 20 20 61  >>8) & 0xff;.  a
35e0: 63 5b 33 5d 20 3d 20 76 61 6c 20 26 20 30 78 66  c[3] = val & 0xf
35f0: 66 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  f;.  return sqli
3600: 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61  te3OsWrite(fd, a
3610: 63 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c, 4);.}../*.** 
3620: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
3630: 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 70 61  nteger into a pa
3640: 67 65 20 68 65 61 64 65 72 20 72 69 67 68 74 20  ge header right 
3650: 62 65 66 6f 72 65 20 74 68 65 0a 2a 2a 20 70 61  before the.** pa
3660: 67 65 20 64 61 74 61 2e 20 20 54 68 69 73 20 77  ge data.  This w
3670: 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68  ill overwrite th
3680: 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70  e PgHdr.pDirty p
3690: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
36a0: 63 20 76 6f 69 64 20 73 74 6f 72 65 33 32 62 69  c void store32bi
36b0: 74 73 28 75 33 32 20 76 61 6c 2c 20 50 67 48 64  ts(u32 val, PgHd
36c0: 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65 74  r *p, int offset
36d0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
36e0: 61 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26  ar *ac;.  ac = &
36f0: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  ((unsigned char*
3700: 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
3710: 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 61 63  ))[offset];.  ac
3720: 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34 29 20  [0] = (val>>24) 
3730: 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 31 5d 20  & 0xff;.  ac[1] 
3740: 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26 20 30 78  = (val>>16) & 0x
3750: 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d 20 28 76  ff;.  ac[2] = (v
3760: 61 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b 0a 20  al>>8) & 0xff;. 
3770: 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26 20 30   ac[3] = val & 0
3780: 78 66 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  xff;.}.../*.** C
3790: 6f 6e 76 65 72 74 20 74 68 65 20 62 69 74 73 20  onvert the bits 
37a0: 69 6e 20 74 68 65 20 70 50 61 67 65 72 2d 3e 65  in the pPager->e
37b0: 72 72 4d 61 73 6b 20 69 6e 74 6f 20 61 6e 20 61  rrMask into an a
37c0: 70 70 72 6f 70 72 61 74 65 0a 2a 2a 20 72 65 74  pproprate.** ret
37d0: 75 72 6e 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  urn code..*/.sta
37e0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72  tic int pager_er
37f0: 72 63 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61  rcode(Pager *pPa
3800: 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
3810: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
3820: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
3830: 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f  k & PAGER_ERR_LO
3840: 43 4b 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c  CK )    rc = SQL
3850: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20  ITE_PROTOCOL;.  
3860: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
3870: 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f  ask & PAGER_ERR_
3880: 44 49 53 4b 20 29 20 20 20 20 72 63 20 3d 20 53  DISK )    rc = S
3890: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 69  QLITE_IOERR;.  i
38a0: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
38b0: 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 46  sk & PAGER_ERR_F
38c0: 55 4c 4c 20 29 20 20 20 20 72 63 20 3d 20 53 51  ULL )    rc = SQ
38d0: 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 69 66 28  LITE_FULL;.  if(
38e0: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
38f0: 20 26 20 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d   & PAGER_ERR_MEM
3900: 20 29 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49   )     rc = SQLI
3910: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 69 66 28 20  TE_NOMEM;.  if( 
3920: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
3930: 26 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52  & PAGER_ERR_CORR
3940: 55 50 54 20 29 20 72 63 20 3d 20 53 51 4c 49 54  UPT ) rc = SQLIT
3950: 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 72 65 74  E_CORRUPT;.  ret
3960: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
3970: 20 41 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 61   Add or remove a
3980: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6c   page from the l
3990: 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
39a0: 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65   that are in the
39b0: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  .** statement jo
39c0: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urnal..**.** The
39d0: 20 50 61 67 65 72 20 6b 65 65 70 73 20 61 20 73   Pager keeps a s
39e0: 65 70 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20  eparate list of 
39f0: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 63  pages that are c
3a00: 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74  urrently in.** t
3a10: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
3a20: 72 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70  rnal.  This help
3a30: 73 20 74 68 65 20 73 71 6c 69 74 65 33 70 61 67  s the sqlite3pag
3a40: 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 29  er_stmt_commit()
3a50: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20  .** routine run 
3a60: 4d 55 43 48 20 66 61 73 74 65 72 20 66 6f 72 20  MUCH faster for 
3a70: 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
3a80: 77 68 65 72 65 20 74 68 65 72 65 20 61 72 65 20  where there are 
3a90: 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e  many.** pages in
3aa0: 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79   memory but only
3ab0: 20 61 20 66 65 77 20 61 72 65 20 69 6e 20 74 68   a few are in th
3ac0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
3ad0: 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nal..*/.static v
3ae0: 6f 69 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f  oid page_add_to_
3af0: 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20  stmt_list(PgHdr 
3b00: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
3b10: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
3b20: 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d  ager;.  if( pPg-
3b30: 3e 69 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e  >inStmt ) return
3b40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
3b50: 3e 70 50 72 65 76 53 74 6d 74 3d 3d 30 20 26 26  >pPrevStmt==0 &&
3b60: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3d   pPg->pNextStmt=
3b70: 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 50 72  =0 );.  pPg->pPr
3b80: 65 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66  evStmt = 0;.  if
3b90: 28 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20  ( pPager->pStmt 
3ba0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  ){.    pPager->p
3bb0: 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20  Stmt->pPrevStmt 
3bc0: 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67  = pPg;.  }.  pPg
3bd0: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50  ->pNextStmt = pP
3be0: 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 70  ager->pStmt;.  p
3bf0: 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70  Pager->pStmt = p
3c00: 50 67 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d  Pg;.  pPg->inStm
3c10: 74 20 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20  t = 1;.}.static 
3c20: 76 6f 69 64 20 70 61 67 65 5f 72 65 6d 6f 76 65  void page_remove
3c30: 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28  _from_stmt_list(
3c40: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
3c50: 66 28 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20  f( !pPg->inStmt 
3c60: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
3c70: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 29  pPg->pPrevStmt )
3c80: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
3c90: 67 2d 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e  g->pPrevStmt->pN
3ca0: 65 78 74 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a  extStmt==pPg );.
3cb0: 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74      pPg->pPrevSt
3cc0: 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  mt->pNextStmt = 
3cd0: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a  pPg->pNextStmt;.
3ce0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
3cf0: 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
3d00: 2d 3e 70 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a  ->pStmt==pPg );.
3d10: 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
3d20: 3e 70 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e  >pStmt = pPg->pN
3d30: 65 78 74 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 69  extStmt;.  }.  i
3d40: 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d  f( pPg->pNextStm
3d50: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
3d60: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d   pPg->pNextStmt-
3d70: 3e 70 50 72 65 76 53 74 6d 74 3d 3d 70 50 67 20  >pPrevStmt==pPg 
3d80: 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  );.    pPg->pNex
3d90: 74 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74  tStmt->pPrevStmt
3da0: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d   = pPg->pPrevStm
3db0: 74 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e  t;.  }.  pPg->pN
3dc0: 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70  extStmt = 0;.  p
3dd0: 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  Pg->pPrevStmt = 
3de0: 30 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74  0;.  pPg->inStmt
3df0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46   = 0;.}../*.** F
3e00: 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
3e10: 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76  e hash table giv
3e20: 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62  en its page numb
3e30: 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61  er.  Return.** a
3e40: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
3e50: 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20  page or NULL if 
3e60: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74  not found..*/.st
3e70: 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65  atic PgHdr *page
3e80: 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  r_lookup(Pager *
3e90: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
3ea0: 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d  o){.  PgHdr *p =
3eb0: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70   pPager->aHash[p
3ec0: 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 5d  ager_hash(pgno)]
3ed0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26 20  ;.  while( p && 
3ee0: 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b  p->pgno!=pgno ){
3ef0: 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
3f00: 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74  tHash;.  }.  ret
3f10: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
3f20: 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
3f30: 61 73 65 20 61 6e 64 20 63 6c 65 61 72 20 74 68  ase and clear th
3f40: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
3f50: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
3f60: 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 73 74 61  .** sets the sta
3f70: 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  te of the pager 
3f80: 62 61 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20  back to what it 
3f90: 77 61 73 20 77 68 65 6e 20 69 74 20 77 61 73 20  was when it was 
3fa0: 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e  first.** opened.
3fb0: 20 20 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e    Any outstandin
3fc0: 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61  g pages are inva
3fd0: 6c 69 64 61 74 65 64 20 61 6e 64 20 73 75 62 73  lidated and subs
3fe0: 65 71 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a  equent attempts.
3ff0: 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f  ** to access tho
4000: 73 65 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69  se pages will li
4010: 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61  kely result in a
4020: 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74   coredump..*/.st
4030: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
4040: 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  reset(Pager *pPa
4050: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
4060: 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f  Pg, *pNext;.  fo
4070: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
4080: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65  ll; pPg; pPg=pNe
4090: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
40a0: 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
40b0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
40c0: 50 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  Pg);.  }.  pPage
40d0: 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20  r->pFirst = 0;. 
40e0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
40f0: 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61  ynced = 0;.  pPa
4100: 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a  ger->pLast = 0;.
4110: 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d    pPager->pAll =
4120: 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61   0;.  memset(pPa
4130: 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73  ger->aHash, 0, s
4140: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48  izeof(pPager->aH
4150: 61 73 68 29 29 3b 0a 20 20 70 50 61 67 65 72 2d  ash));.  pPager-
4160: 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66  >nPage = 0;.  if
4170: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
4180: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
4190: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61  ){.    sqlite3pa
41a0: 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
41b0: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
41c0: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61  te3OsUnlock(&pPa
41d0: 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
41e0: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61  );.  pPager->sta
41f0: 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
4200: 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  K;.  pPager->dbS
4210: 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67  ize = -1;.  pPag
4220: 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20  er->nRef = 0;.  
4230: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
4240: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
4250: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  ;.}../*.** When 
4260: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
4270: 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65  called, the page
4280: 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  r has the journa
4290: 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a  l file open and.
42a0: 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ** a RESERVED or
42b0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
42c0: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
42d0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72    This routine r
42e0: 65 6c 65 61 73 65 73 0a 2a 2a 20 74 68 65 20 64  eleases.** the d
42f0: 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64  atabase lock and
4300: 20 61 63 71 75 69 72 65 73 20 61 20 53 48 41 52   acquires a SHAR
4310: 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70  ED lock in its p
4320: 6c 61 63 65 2e 20 20 54 68 65 20 6a 6f 75 72 6e  lace.  The journ
4330: 61 6c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 64 65  al.** file is de
4340: 6c 65 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64  leted and closed
4350: 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f  ..**.** TODO: Co
4360: 6e 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20 74  nsider keeping t
4370: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
4380: 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61  open for tempora
4390: 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a  ry databases..**
43a0: 20 54 68 69 73 20 6d 69 67 68 74 20 67 69 76 65   This might give
43b0: 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69   a performance i
43c0: 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69  mprovement on wi
43d0: 6e 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65 6e  ndows where open
43e0: 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73  ing.** a file is
43f0: 20 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70   an expensive op
4400: 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  eration..*/.stat
4410: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 75 6e 77  ic int pager_unw
4420: 72 69 74 65 6c 6f 63 6b 28 50 61 67 65 72 20 2a  ritelock(Pager *
4430: 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
4440: 20 2a 70 50 67 3b 0a 20 20 69 66 28 20 70 50 61   *pPg;.  if( pPa
4450: 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52  ger->state<PAGER
4460: 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
4470: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
4480: 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  K;.  }.  sqlite3
4490: 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69  pager_stmt_commi
44a0: 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  t(pPager);.  if(
44b0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
44c0: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
44d0: 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d  OsClose(&pPager-
44e0: 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50 61 67  >stfd);.    pPag
44f0: 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30  er->stmtOpen = 0
4500: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
4510: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
4520: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
4530: 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a  Close(&pPager->j
4540: 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  fd);.    pPager-
4550: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30  >journalOpen = 0
4560: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44  ;.    sqlite3OsD
4570: 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a  elete(pPager->zJ
4580: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71 6c  ournal);.    sql
4590: 69 74 65 46 72 65 65 28 20 70 50 61 67 65 72 2d  iteFree( pPager-
45a0: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >aInJournal );. 
45b0: 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f     pPager->aInJo
45c0: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66  urnal = 0;.    f
45d0: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
45e0: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
45f0: 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
4600: 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
4610: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  al = 0;.      pP
4620: 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
4630: 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
4640: 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 0;.    }.  }
4650: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
4660: 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43  ( pPager->dirtyC
4670: 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  ache==0 || pPage
4680: 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30  r->useJournal==0
4690: 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   );.  }.  sqlite
46a0: 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  3OsUnlock(&pPage
46b0: 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
46c0: 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  CK);.  pPager->s
46d0: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
46e0: 52 45 44 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  RED;.  return SQ
46f0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
4700: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  * Compute and re
4710: 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
4720: 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66 20  for the page of 
4730: 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  data..**.** This
4740: 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63   is not a real c
4750: 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20  hecksum.  It is 
4760: 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20  really just the 
4770: 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72  sum of the .** r
4780: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61  andom initial va
4790: 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  lue and the page
47a0: 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 63 6f 6e   number.  We con
47b0: 73 69 64 65 72 65 64 20 64 6f 20 61 20 63 68 65  sidered do a che
47c0: 63 6b 73 75 6d 0a 2a 2a 20 6f 66 20 74 68 65 20  cksum.** of the 
47d0: 64 61 74 61 62 61 73 65 2c 20 62 75 74 20 74 68  database, but th
47e0: 61 74 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20  at was found to 
47f0: 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2f 0a  be too slow..*/.
4800: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
4810: 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50  _cksum(Pager *pP
4820: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  ager, Pgno pgno,
4830: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 44 61   const char *aDa
4840: 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d  ta){.  u32 cksum
4850: 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
4860: 49 6e 69 74 20 2b 20 70 67 6e 6f 3b 0a 20 20 72  Init + pgno;.  r
4870: 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a  eturn cksum;.}..
4880: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e  /*.** Read a sin
4890: 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  gle page from th
48a0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
48b0: 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64 65  pened on file de
48c0: 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e  scriptor.** jfd.
48d0: 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69 73 20    Playback this 
48e0: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  one page..**.** 
48f0: 0a 2a 2a 20 0a 2a 2a 20 54 68 65 72 65 20 61 72  .** .** There ar
4900: 65 20 74 68 72 65 65 20 64 69 66 66 65 72 65 6e  e three differen
4910: 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  t journal format
4920: 73 2e 20 20 54 68 65 20 66 6f 72 6d 61 74 20 70  s.  The format p
4930: 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69  arameter determi
4940: 6e 65 73 0a 2a 2a 20 77 68 69 63 68 20 66 6f 72  nes.** which for
4950: 6d 61 74 20 69 73 20 75 73 65 64 20 62 79 20 74  mat is used by t
4960: 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20  he journal that 
4970: 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  is played back..
4980: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
4990: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
49a0: 5f 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  _page(Pager *pPa
49b0: 67 65 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64  ger, OsFile *jfd
49c0: 2c 20 69 6e 74 20 75 73 65 43 6b 73 75 6d 29 7b  , int useCksum){
49d0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48  .  int rc;.  PgH
49e0: 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20  dr *pPg;        
49f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
4a00: 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69   existing page i
4a10: 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  n the cache */. 
4a20: 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
4a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4a40: 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
4a50: 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a  r of a page in j
4a60: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
4a70: 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
4a80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
4a90: 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73  cksum used for s
4aa0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a  anity checking *
4ab0: 2f 0a 20 20 75 38 20 61 44 61 74 61 5b 53 51 4c  /.  u8 aData[SQL
4ac0: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 20  ITE_PAGE_SIZE]; 
4ad0: 20 20 2f 2a 20 53 74 6f 72 65 20 64 61 74 61 20    /* Store data 
4ae0: 68 65 72 65 20 2a 2f 0a 0a 20 20 72 63 20 3d 20  here */..  rc = 
4af0: 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
4b00: 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63  &pgno);.  if( rc
4b10: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
4b20: 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
4b30: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66  sqlite3OsRead(jf
4b40: 64 2c 20 26 61 44 61 74 61 2c 20 70 50 61 67 65  d, &aData, pPage
4b50: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
4b60: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
4b70: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
4b80: 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
4b90: 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
4ba0: 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20  .  This is more 
4bb0: 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49  important that I
4bc0: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a   originally.  **
4bd0: 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20   thought.  If a 
4be0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
4bf0: 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a  curs while the j
4c00: 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20  ournal is being 
4c10: 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74  written,.  ** it
4c20: 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76   could cause inv
4c30: 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20  alid data to be 
4c40: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
4c50: 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65   journal.  We ne
4c60: 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63  ed to.  ** detec
4c70: 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64  t this invalid d
4c80: 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70  ata (with high p
4c90: 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20  robability) and 
4ca0: 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a  ignore it..  */.
4cb0: 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b    if( pgno==0 ){
4cc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
4cd0: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
4ce0: 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e 65  f( pgno>(unsigne
4cf0: 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  d)pPager->dbSize
4d00: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
4d10: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
4d20: 69 66 28 20 75 73 65 43 6b 73 75 6d 20 29 7b 0a  if( useCksum ){.
4d30: 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62      rc = read32b
4d40: 69 74 73 28 6a 66 64 2c 20 26 63 6b 73 75 6d 29  its(jfd, &cksum)
4d50: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
4d60: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66  eturn rc;.    if
4d70: 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  ( pager_cksum(pP
4d80: 61 67 65 72 2c 20 70 67 6e 6f 2c 20 61 44 61 74  ager, pgno, aDat
4d90: 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20  a)!=cksum ){.   
4da0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
4db0: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
4dc0: 0a 0a 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20  ..  /* Playback 
4dd0: 74 68 65 20 70 61 67 65 2e 20 20 55 70 64 61 74  the page.  Updat
4de0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
4df0: 63 6f 70 79 20 6f 66 20 74 68 65 20 70 61 67 65  copy of the page
4e00: 0a 20 20 2a 2a 20 61 74 20 74 68 65 20 73 61 6d  .  ** at the sam
4e10: 65 20 74 69 6d 65 2c 20 69 66 20 74 68 65 72 65  e time, if there
4e20: 20 69 73 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20   is one..  */.  
4e30: 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
4e40: 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
4e50: 3b 0a 20 20 54 52 41 43 45 32 28 22 50 4c 41 59  ;.  TRACE2("PLAY
4e60: 42 41 43 4b 20 70 61 67 65 20 25 64 5c 6e 22 2c  BACK page %d\n",
4e70: 20 70 67 6e 6f 29 3b 0a 20 20 73 71 6c 69 74 65   pgno);.  sqlite
4e80: 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
4e90: 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 6f  >fd, (pgno-1)*(o
4ea0: 66 66 5f 74 29 53 51 4c 49 54 45 5f 50 41 47 45  ff_t)SQLITE_PAGE
4eb0: 5f 53 49 5a 45 29 3b 0a 20 20 72 63 20 3d 20 73  _SIZE);.  rc = s
4ec0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70  qlite3OsWrite(&p
4ed0: 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61 74 61  Pager->fd, aData
4ee0: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
4ef0: 5a 45 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29  ZE);.  if( pPg )
4f00: 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65  {.    /* No page
4f10: 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20   should ever be 
4f20: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74  rolled back that
4f30: 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65   is in use, exce
4f40: 70 74 20 66 6f 72 20 70 61 67 65 0a 20 20 20 20  pt for page.    
4f50: 2a 2a 20 31 20 77 68 69 63 68 20 69 73 20 68 65  ** 1 which is he
4f60: 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64  ld in use in ord
4f70: 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c  er to keep the l
4f80: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
4f90: 61 73 65 0a 20 20 20 20 2a 2a 20 61 63 74 69 76  ase.    ** activ
4fa0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f  e..    */.    vo
4fb0: 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 61  id *pData;.    a
4fc0: 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
4fd0: 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f  ==0 || pPg->pgno
4fe0: 3d 3d 31 20 29 3b 0a 20 20 20 20 70 44 61 74 61  ==1 );.    pData
4ff0: 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41   = PGHDR_TO_DATA
5000: 28 70 50 67 29 3b 0a 20 20 20 20 6d 65 6d 63 70  (pPg);.    memcp
5010: 79 28 70 44 61 74 61 2c 20 61 44 61 74 61 2c 20  y(pData, aData, 
5020: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
5030: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
5040: 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29  r->xDestructor )
5050: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
5060: 78 44 65 73 74 72 75 63 74 6f 72 28 70 44 61 74  xDestructor(pDat
5070: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
5080: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
5090: 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
50a0: 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
50b0: 63 20 3d 20 30 3b 0a 20 20 20 20 43 4f 44 45 43  c = 0;.    CODEC
50c0: 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
50d0: 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20  pPg->pgno, 3);. 
50e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
50f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
5100: 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68  er zMaster is th
5110: 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74  e name of a mast
5120: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
5130: 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61   A single journa
5140: 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72  l.** file that r
5150: 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d  eferred to the m
5160: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
5170: 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  le has just been
5180: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
5190: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
51a0: 65 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f  ecks if it is po
51b0: 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
51c0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
51d0: 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64  nal file,.** and
51e0: 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69   does so if it i
51f0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
5200: 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
5210: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61  (const char *zMa
5220: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
5230: 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70  .  int master_op
5240: 65 6e 20 3d 20 30 3b 0a 20 20 4f 73 46 69 6c 65  en = 0;.  OsFile
5250: 20 6d 61 73 74 65 72 3b 0a 20 20 63 68 61 72 20   master;.  char 
5260: 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  *zMasterJournal 
5270: 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73  = 0; /* Contents
5280: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
5290: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 6f 66 66  al file */.  off
52a0: 5f 74 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  _t nMasterJourna
52b0: 6c 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  l;     /* Size o
52c0: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
52d0: 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f   file */..  /* O
52e0: 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a  pen the master j
52f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c  ournal file excl
5300: 75 73 69 76 65 6c 79 20 69 6e 20 63 61 73 65 20  usively in case 
5310: 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
5320: 73 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69  ss.  ** is runni
5330: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
5340: 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69  also. Not that i
5350: 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68  t makes too much
5360: 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a   difference..  *
5370: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
5380: 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
5390: 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73 74 65 72  zMaster, &master
53a0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
53b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
53c0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
53d0: 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20    master_open = 
53e0: 31 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  1;..  rc = sqlit
53f0: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 6d 61  e3OsFileSize(&ma
5400: 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f  ster, &nMasterJo
5410: 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63  urnal);.  if( rc
5420: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
5430: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
5440: 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72  ;..  if( nMaster
5450: 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20  Journal>0 ){.   
5460: 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 20 20   char *zDb;.    
5470: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
5480: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d   (char *)sqliteM
5490: 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75  alloc(nMasterJou
54a0: 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 21  rnal);.    if( !
54b0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
54c0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
54d0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
54e0: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
54f0: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  out;.    }.    r
5500: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
5510: 64 28 26 6d 61 73 74 65 72 2c 20 7a 4d 61 73 74  d(&master, zMast
5520: 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73 74  erJournal, nMast
5530: 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  erJournal);.    
5540: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
5550: 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
5560: 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 44 62  er_out;..    zDb
5570: 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61   = zMasterJourna
5580: 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a  l;.    while( (z
5590: 44 62 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  Db-zMasterJourna
55a0: 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l)<nMasterJourna
55b0: 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  l ){.      char 
55c0: 2a 7a 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  *zJournal = 0;. 
55d0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53       sqlite3SetS
55e0: 74 72 69 6e 67 28 26 7a 4a 6f 75 72 6e 61 6c 2c  tring(&zJournal,
55f0: 20 7a 44 62 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22   zDb, "-journal"
5600: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
5610: 21 7a 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  !zJournal ){.   
5620: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
5630: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
5640: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
5650: 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
5660: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46    if( sqlite3OsF
5670: 69 6c 65 45 78 69 73 74 73 28 7a 4a 6f 75 72 6e  ileExists(zJourn
5680: 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  al) ){.        /
5690: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75  * One of the jou
56a0: 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f  rnals pointed to
56b0: 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a   by the master j
56c0: 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20  ournal exists.. 
56d0: 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69         ** Open i
56e0: 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69  t and check if i
56f0: 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  t points at the 
5700: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
5710: 49 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  If.        ** so
5720: 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  , return without
5730: 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61   deleting the ma
5740: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
5750: 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
5760: 20 20 20 20 20 20 4f 73 46 69 6c 65 20 6a 6f 75        OsFile jou
5770: 72 6e 61 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e  rnal;.        in
5780: 74 20 6e 4d 61 73 74 65 72 3b 0a 20 20 20 20 20  t nMaster;.     
5790: 20 20 20 6f 66 66 5f 74 20 6a 73 7a 3b 0a 0a 20     off_t jsz;.. 
57a0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
57b0: 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
57c0: 79 28 7a 4a 6f 75 72 6e 61 6c 2c 20 26 6a 6f 75  y(zJournal, &jou
57d0: 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  rnal);.        s
57e0: 71 6c 69 74 65 46 72 65 65 28 7a 4a 6f 75 72 6e  qliteFree(zJourn
57f0: 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  al);.        if(
5800: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5810: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
5820: 74 65 33 4f 73 43 6c 6f 73 65 28 26 6a 6f 75 72  te3OsClose(&jour
5830: 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nal);.          
5840: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
5850: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 09  ut;.        }...
5860: 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
5870: 66 69 6c 65 20 69 73 20 62 69 67 20 65 6e 6f 75  file is big enou
5880: 67 68 20 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e  gh to be a journ
5890: 61 6c 20 66 69 6c 65 0a 20 20 20 20 20 20 20 20  al file.        
58a0: 2a 2a 20 77 69 74 68 20 74 68 65 20 72 65 71 75  ** with the requ
58b0: 69 72 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72  ired master jour
58c0: 6e 61 6c 20 6e 61 6d 65 2e 20 49 66 20 6e 6f 74  nal name. If not
58d0: 2c 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 20  , ignore it..   
58e0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
58f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
5900: 6c 65 53 69 7a 65 28 26 6a 6f 75 72 6e 61 6c 2c  leSize(&journal,
5910: 20 26 6a 73 7a 29 3b 0a 20 20 20 20 20 20 20 20   &jsz);.        
5920: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
5930: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
5940: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6a  qlite3OsClose(&j
5950: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  ournal);.       
5960: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
5970: 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
5980: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 73 7a  .        if( jsz
5990: 3c 28 32 35 2b 73 74 72 6c 65 6e 28 7a 4d 61 73  <(25+strlen(zMas
59a0: 74 65 72 29 29 20 29 7b 0a 20 20 20 20 20 20 20  ter)) ){.       
59b0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
59c0: 65 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  e(&journal);.   
59d0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
59e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
59f0: 20 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 53     .        /* S
5a00: 65 65 6b 20 74 6f 20 74 68 65 20 70 6f 69 6e 74  eek to the point
5a10: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
5a20: 77 68 65 72 65 20 74 68 65 20 6d 61 73 74 65 72  where the master
5a30: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20   journal name.  
5a40: 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 6f 72        ** is stor
5a50: 65 64 2e 20 52 65 61 64 20 74 68 65 20 6d 61 73  ed. Read the mas
5a60: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
5a70: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
5a80: 61 69 6e 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  ained.        **
5a90: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 20 20   from malloc..  
5aa0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
5ab0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
5ac0: 65 65 6b 28 26 6a 6f 75 72 6e 61 6c 2c 20 32 30  eek(&journal, 20
5ad0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
5ae0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
5af0: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
5b00: 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
5b10: 72 65 61 64 33 32 62 69 74 73 28 26 6a 6f 75 72  read32bits(&jour
5b20: 6e 61 6c 2c 20 28 75 33 32 2a 29 26 6e 4d 61 73  nal, (u32*)&nMas
5b30: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ter);.        if
5b40: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5b50: 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
5b60: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 69 66  _out;.        if
5b70: 28 20 6e 4d 61 73 74 65 72 3e 30 20 26 26 20 6e  ( nMaster>0 && n
5b80: 4d 61 73 74 65 72 3e 3d 73 74 72 6c 65 6e 28 7a  Master>=strlen(z
5b90: 4d 61 73 74 65 72 29 2b 31 20 29 7b 0a 20 20 20  Master)+1 ){.   
5ba0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d 61         char *zMa
5bb0: 73 74 65 72 50 74 72 20 3d 20 28 63 68 61 72 20  sterPtr = (char 
5bc0: 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e  *)sqliteMalloc(n
5bd0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
5be0: 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 50     if( !zMasterP
5bf0: 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  tr ){.          
5c00: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
5c10: 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  MEM;.          }
5c20: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
5c30: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26 6a  sqlite3OsRead(&j
5c40: 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50  ournal, zMasterP
5c50: 74 72 2c 20 6e 4d 61 73 74 65 72 29 3b 0a 20 20  tr, nMaster);.  
5c60: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
5c70: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5c80: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46           sqliteF
5c90: 72 65 65 28 7a 4d 61 73 74 65 72 50 74 72 29 3b  ree(zMasterPtr);
5ca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
5cb0: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
5cc0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
5cd0: 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74         if( 0==st
5ce0: 72 6e 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  rncmp(zMasterPtr
5cf0: 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74  , zMaster, nMast
5d00: 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  er) ){.         
5d10: 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20     /* We have a 
5d20: 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65  match. Do not de
5d30: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
5d40: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
5d50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
5d60: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 50  iteFree(zMasterP
5d70: 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  tr);.           
5d80: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
5d90: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  out;.          }
5da0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5db0: 20 7d 0a 20 20 20 20 20 20 7a 44 62 20 2b 3d 20   }.      zDb += 
5dc0: 28 73 74 72 6c 65 6e 28 7a 44 62 29 2b 31 29 3b  (strlen(zDb)+1);
5dd0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
5de0: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
5df0: 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65 6c 6d 61  zMaster);..delma
5e00: 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20  ster_out:.  if( 
5e10: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
5e20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
5e30: 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  (zMasterJournal)
5e40: 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d 61  ;.  }  .  if( ma
5e50: 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20  ster_open ){.   
5e60: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
5e70: 26 6d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20  &master);.  }.  
5e80: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5e90: 0a 2a 2a 20 4d 61 6b 65 20 65 76 65 72 79 20 70  .** Make every p
5ea0: 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
5eb0: 20 61 67 72 65 65 20 77 69 74 68 20 77 68 61 74   agree with what
5ec0: 20 69 73 20 6f 6e 20 64 69 73 6b 2e 20 20 49 6e   is on disk.  In
5ed0: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 2a 2a   other words,.**
5ee0: 20 72 65 72 65 61 64 20 74 68 65 20 64 69 73 6b   reread the disk
5ef0: 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 73 74   to reset the st
5f00: 61 74 65 20 6f 66 20 74 68 65 20 63 61 63 68 65  ate of the cache
5f10: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
5f20: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61  tine is called a
5f30: 66 74 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 20  fter a rollback 
5f40: 69 6e 20 77 68 69 63 68 20 73 6f 6d 65 20 6f 66  in which some of
5f50: 20 74 68 65 20 64 69 72 74 79 20 63 61 63 68 65   the dirty cache
5f60: 0a 2a 2a 20 70 61 67 65 73 20 68 61 64 20 6e 65  .** pages had ne
5f70: 76 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ver been written
5f80: 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20 20 57   out to disk.  W
5f90: 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 20 62  e need to roll b
5fa0: 61 63 6b 20 74 68 65 0a 2a 2a 20 63 61 63 68 65  ack the.** cache
5fb0: 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65   content and the
5fc0: 20 65 61 73 69 65 73 74 20 77 61 79 20 74 6f 20   easiest way to 
5fd0: 64 6f 20 74 68 61 74 20 69 73 20 74 6f 20 72 65  do that is to re
5fe0: 72 65 61 64 20 74 68 65 20 6f 6c 64 20 63 6f 6e  read the old con
5ff0: 74 65 6e 74 0a 2a 2a 20 62 61 63 6b 20 66 72 6f  tent.** back fro
6000: 6d 20 74 68 65 20 64 69 73 6b 2e 0a 2a 2f 0a 73  m the disk..*/.s
6010: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
6020: 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 50 61 67  reload_cache(Pag
6030: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
6040: 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
6050: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
6060: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
6070: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
6080: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
6090: 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b  {.    char zBuf[
60a0: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
60b0: 5d 3b 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d  ];.    if( !pPg-
60c0: 3e 64 69 72 74 79 20 29 20 63 6f 6e 74 69 6e 75  >dirty ) continu
60d0: 65 3b 0a 20 20 20 20 69 66 28 20 28 69 6e 74 29  e;.    if( (int)
60e0: 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61  pPg->pgno <= pPa
60f0: 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
6100: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6110: 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
6120: 66 64 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  fd, SQLITE_PAGE_
6130: 53 49 5a 45 2a 28 6f 66 66 5f 74 29 28 70 50 67  SIZE*(off_t)(pPg
6140: 2d 3e 70 67 6e 6f 2d 31 29 29 3b 0a 20 20 20 20  ->pgno-1));.    
6150: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6160: 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e 66 64  Read(&pPager->fd
6170: 2c 20 7a 42 75 66 2c 20 53 51 4c 49 54 45 5f 50  , zBuf, SQLITE_P
6180: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  AGE_SIZE);.     
6190: 20 54 52 41 43 45 32 28 22 52 45 46 45 54 43 48   TRACE2("REFETCH
61a0: 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50 67   page %d\n", pPg
61b0: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43  ->pgno);.      C
61c0: 4f 44 45 43 28 70 50 61 67 65 72 2c 20 7a 42 75  ODEC(pPager, zBu
61d0: 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 32 29  f, pPg->pgno, 2)
61e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
61f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73   break;.    }els
6200: 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  e{.      memset(
6210: 7a 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f  zBuf, 0, SQLITE_
6220: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
6230: 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e  }.    if( pPg->n
6240: 52 65 66 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70  Ref==0 || memcmp
6250: 28 7a 42 75 66 2c 20 50 47 48 44 52 5f 54 4f 5f  (zBuf, PGHDR_TO_
6260: 44 41 54 41 28 70 50 67 29 2c 20 53 51 4c 49 54  DATA(pPg), SQLIT
6270: 45 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 7b 0a  E_PAGE_SIZE) ){.
6280: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48        memcpy(PGH
6290: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
62a0: 20 7a 42 75 66 2c 20 53 51 4c 49 54 45 5f 50 41   zBuf, SQLITE_PA
62b0: 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  GE_SIZE);.      
62c0: 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69  if( pPager->xRei
62d0: 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  niter ){.       
62e0: 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
62f0: 65 72 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  er(PGHDR_TO_DATA
6300: 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70  (pPg), pPager->p
6310: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
6320: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
6330: 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45  emset(PGHDR_TO_E
6340: 58 54 52 41 28 70 50 67 29 2c 20 30 2c 20 70 50  XTRA(pPg), 0, pP
6350: 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20  ager->nExtra);. 
6360: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6370: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
6380: 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72   0;.    pPg->dir
6390: 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ty = 0;.  }.  re
63a0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
63b0: 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  ** Playback the 
63c0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73  journal and thus
63d0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
63e0: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a  abase file to.**
63f0: 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61   the state it wa
6400: 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73  s in before we s
6410: 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68  tarted making ch
6420: 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  anges.  .**.** T
6430: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
6440: 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c  format is as fol
6450: 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31  lows: .**.**  (1
6460: 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78  )  8 byte prefix
6470: 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f  .  A copy of aJo
6480: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
6490: 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69    (2)  4 byte bi
64a0: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
64b0: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
64c0: 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61  mber of valid pa
64d0: 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20  ge records.**   
64e0: 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e      in the journ
64f0: 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c  al.  If this val
6500: 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
6510: 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74  , then compute t
6520: 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62  he.**       numb
6530: 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72  er of page recor
6540: 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ds from the jour
6550: 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33  nal size..**  (3
6560: 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
6570: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
6580: 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  ch is the initia
6590: 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  l value for the 
65a0: 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79  .**       sanity
65b0: 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28   checksum..**  (
65c0: 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  4)  4 byte integ
65d0: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
65e0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
65f0: 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  to truncate the.
6600: 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73  **       databas
6610: 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f  e to during a ro
6620: 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20  llback..**  (5) 
6630: 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
6640: 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
6650: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
6660: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
6670: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65  al.**       name
6680: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61 79  .  The value may
6690: 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63 61   be zero (indica
66a0: 74 65 20 74 68 61 74 20 74 68 65 72 65 20 69 73  te that there is
66b0: 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20   no master.**   
66c0: 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a      journal.).**
66d0: 20 20 28 36 29 20 20 4e 20 62 79 74 65 73 20 6f    (6)  N bytes o
66e0: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
66f0: 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20  rnal name.  The 
6700: 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c  name will be nul
6710: 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20  -terminated.**  
6720: 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20 62       and might b
6730: 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20 74  e shorter than t
6740: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
6750: 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65 20  om (5).  If the 
6760: 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20 20  first byte.**   
6770: 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65 20      of the name 
6780: 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68 65  is \000 then the
6790: 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 20  re is no master 
67a0: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61  journal.  The ma
67b0: 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f  ster.**       jo
67c0: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73 74  urnal name is st
67d0: 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a  ored in UTF-8..*
67e0: 2a 20 20 28 37 29 20 20 5a 65 72 6f 20 6f 72 20  *  (7)  Zero or 
67f0: 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61  more pages insta
6800: 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f  nces, each as fo
6810: 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20  llows:.**       
6820: 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20   +  4 byte page 
6830: 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20  number..**      
6840: 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67    +  pPager->pag
6850: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
6860: 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ata..**        +
6870: 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75    4 byte checksu
6880: 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20  m.**.** When we 
6890: 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75  speak of the jou
68a0: 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20  rnal header, we 
68b0: 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 36  mean the first 6
68c0: 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a   items above..**
68d0: 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74   Each entry in t
68e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e  he journal is an
68f0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
6900: 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a   7th item..**.**
6910: 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20   Call the value 
6920: 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20  from the second 
6930: 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20  bullet "nRec".  
6940: 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62  nRec is the numb
6950: 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70  er of.** valid p
6960: 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74  age entries in t
6970: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
6980: 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20  most cases, you 
6990: 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  can compute the.
69a0: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  ** value of nRec
69b0: 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
69c0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
69d0: 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f  le.  But if a po
69e0: 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f  wer.** failure o
69f0: 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68  ccurred while th
6a00: 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
6a10: 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20  ing written, it 
6a20: 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20  could be the.** 
6a30: 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69  case that the si
6a40: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
6a50: 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61  l file had alrea
6a60: 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65  dy been increase
6a70: 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74  d but.** the ext
6a80: 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e  ra entries had n
6a90: 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73  ot yet made it s
6aa0: 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20  afely to disk.  
6ab0: 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a  In such a case,.
6ac0: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
6ad0: 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
6ae0: 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
6af0: 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61   would be too la
6b00: 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61  rge.  For.** tha
6b10: 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77  t reason, we alw
6b20: 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63  ays use the nRec
6b30: 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65   value in the he
6b40: 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ader..**.** If t
6b50: 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73  he nRec value is
6b60: 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d   0xffffffff it m
6b70: 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73  eans that nRec s
6b80: 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
6b90: 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69  d.** from the fi
6ba0: 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76  le size.  This v
6bb0: 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65  alue is used whe
6bc0: 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63  n the user selec
6bd0: 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e  ts the.** no-syn
6be0: 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65  c option for the
6bf0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77   journal.  A pow
6c00: 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
6c10: 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74   lead to corrupt
6c20: 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ion.** in this c
6c30: 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68  ase.  But for th
6c40: 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72  ings like tempor
6c50: 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68  ary table (which
6c60: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65   will be.** dele
6c70: 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77  ted when the pow
6c80: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20  er is restored) 
6c90: 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20  we don't care.  
6ca0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
6cb0: 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65  le opened as the
6cc0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
6cd0: 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d   not a well-form
6ce0: 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  ed.** journal fi
6cf0: 6c 65 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  le then the data
6d00: 62 61 73 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  base will likely
6d10: 20 61 6c 72 65 61 64 79 20 62 65 0a 2a 2a 20 63   already be.** c
6d20: 6f 72 72 75 70 74 65 64 2c 20 73 6f 20 74 68 65  orrupted, so the
6d30: 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55   PAGER_ERR_CORRU
6d40: 50 54 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  PT bit is set in
6d50: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
6d60: 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 43  .** and SQLITE_C
6d70: 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e  ORRUPT is return
6d80: 65 64 2e 20 20 49 66 20 69 74 20 61 6c 6c 20 77  ed.  If it all w
6d90: 6f 72 6b 73 2c 20 74 68 65 6e 20 74 68 69 73 20  orks, then this 
6da0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
6db0: 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  ns SQLITE_OK..*/
6dc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
6dd0: 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  r_playback(Pager
6de0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 75 73   *pPager, int us
6df0: 65 4a 6f 75 72 6e 61 6c 53 69 7a 65 29 7b 0a 20  eJournalSize){. 
6e00: 20 6f 66 66 5f 74 20 73 7a 4a 3b 20 20 20 20 20   off_t szJ;     
6e10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
6e20: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
6e30: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
6e40: 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  /.  int nRec;   
6e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6e60: 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64  Number of Record
6e70: 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
6e80: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6ea0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
6eb0: 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20  /.  Pgno mxPg = 
6ec0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
6ed0: 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67  Size of the orig
6ee0: 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67  inal file in pag
6ef0: 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  es */.  unsigned
6f00: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
6f10: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
6f20: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
6f30: 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  eader */.  int r
6f40: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
6f50: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
6f60: 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69  de of a subrouti
6f70: 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73  ne */.  int nMas
6f80: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
6f90: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
6fa0: 74 65 73 20 69 6e 20 74 68 65 20 6e 61 6d 65 20  tes in the name 
6fb0: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
6fc0: 6c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  l */.  char *zMa
6fd0: 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ster = 0;       
6fe0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65  /* Name of maste
6ff0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
7000: 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46  f any */..  /* F
7010: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
7020: 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
7030: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
7040: 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20  Abort early if. 
7050: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
7060: 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20  is empty..  */. 
7070: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
7080: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
7090: 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
70a0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  &pPager->jfd, 0)
70b0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
70c0: 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67  OsFileSize(&pPag
70d0: 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
70e0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
70f0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
7100: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
7110: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6a  }..  /* If the j
7120: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
7130: 6f 6f 20 73 6d 61 6c 6c 20 74 6f 20 63 6f 6e 74  oo small to cont
7140: 61 69 6e 20 61 20 63 6f 6d 70 6c 65 74 65 20 68  ain a complete h
7150: 65 61 64 65 72 2c 0a 20 20 2a 2a 20 69 74 20 6d  eader,.  ** it m
7160: 75 73 74 20 6d 65 61 6e 20 74 68 61 74 20 74 68  ust mean that th
7170: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  e process that c
7180: 72 65 61 74 65 64 20 74 68 65 20 6a 6f 75 72 6e  reated the journ
7190: 61 6c 20 77 61 73 20 6a 75 73 74 0a 20 20 2a 2a  al was just.  **
71a0: 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 20 77 72   beginning to wr
71b0: 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ite the journal 
71c0: 66 69 6c 65 20 77 68 65 6e 20 69 74 20 64 69 65  file when it die
71d0: 64 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  d.  In that case
71e0: 2c 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62  ,.  ** the datab
71f0: 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20  ase file should 
7200: 68 61 76 65 20 73 74 69 6c 6c 20 62 65 65 6e 20  have still been 
7210: 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 63 68 61  completely uncha
7220: 6e 67 65 64 2e 0a 20 20 2a 2a 20 4e 6f 74 68 69  nged..  ** Nothi
7230: 6e 67 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  ng needs to be r
7240: 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 57 65 20  olled back.  We 
7250: 63 61 6e 20 73 61 66 65 6c 79 20 69 67 6e 6f 72  can safely ignor
7260: 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a  e this journal..
7270: 20 20 2a 2f 0a 20 20 69 66 28 20 73 7a 4a 20 3c    */.  if( szJ <
7280: 20 32 34 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20   24 ){.    goto 
7290: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
72a0: 7d 0a 0a 20 20 2f 2a 20 28 31 29 20 52 65 61 64  }..  /* (1) Read
72b0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
72c0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  f the journal an
72d0: 64 20 76 65 72 69 66 79 20 74 68 65 20 6d 61 67  d verify the mag
72e0: 69 63 20 73 74 72 69 6e 67 0a 20 20 2a 2a 20 61  ic string.  ** a
72f0: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
7300: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  of the journal. 
7310: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
7320: 33 4f 73 52 65 61 64 28 26 70 50 61 67 65 72 2d  3OsRead(&pPager-
7330: 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69  >jfd, aMagic, si
7340: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 3b 0a 20  zeof(aMagic));. 
7350: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
7360: 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61  OK || memcmp(aMa
7370: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
7380: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
7390: 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 63  c))!=0 ){.    rc
73a0: 20 3d 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43   = SQLITE_PROTOC
73b0: 4f 4c 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  OL;.    goto end
73c0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
73d0: 20 20 2f 2a 20 28 32 29 20 52 65 61 64 20 74 68    /* (2) Read th
73e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
73f0: 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
7400: 6a 6f 75 72 6e 61 6c 2e 20 20 2a 2f 0a 20 20 72  journal.  */.  r
7410: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 26  c = read32bits(&
7420: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 75 33  pPager->jfd, (u3
7430: 32 2a 29 26 6e 52 65 63 29 3b 0a 20 20 69 66 28  2*)&nRec);.  if(
7440: 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70   rc ) goto end_p
7450: 6c 61 79 62 61 63 6b 3b 0a 20 20 69 66 28 20 6e  layback;.  if( n
7460: 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20  Rec==0xffffffff 
7470: 7c 7c 20 75 73 65 4a 6f 75 72 6e 61 6c 53 69 7a  || useJournalSiz
7480: 65 20 29 7b 0a 20 20 20 20 6e 52 65 63 20 3d 20  e ){.    nRec = 
7490: 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48  (szJ - JOURNAL_H
74a0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a  DR_SZ(pPager))/J
74b0: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
74c0: 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
74d0: 28 33 29 20 52 65 61 64 20 74 68 65 20 69 6e 69  (3) Read the ini
74e0: 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74  tial value for t
74f0: 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73  he sanity checks
7500: 75 6d 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61  um */.  rc = rea
7510: 64 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d  d32bits(&pPager-
7520: 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 63  >jfd, &pPager->c
7530: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28  ksumInit);.  if(
7540: 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70   rc ) goto end_p
7550: 6c 61 79 62 61 63 6b 3b 0a 0a 20 20 2f 2a 20 28  layback;..  /* (
7560: 34 29 20 52 65 61 64 20 74 68 65 20 6e 75 6d 62  4) Read the numb
7570: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
7580: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
7590: 20 70 72 69 6f 72 20 74 6f 20 74 68 65 0a 20 20   prior to the.  
75a0: 2a 2a 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  ** start of the 
75b0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
75c0: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
75d0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  (&pPager->jfd, &
75e0: 6d 78 50 67 29 3b 0a 20 20 69 66 28 20 72 63 21  mxPg);.  if( rc!
75f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7600: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
7610: 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 28  ack;.  }..  /* (
7620: 35 29 20 61 6e 64 20 28 36 29 3a 20 43 68 65 63  5) and (6): Chec
7630: 6b 20 69 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  k if a master jo
7640: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 70  urnal file is sp
7650: 65 63 69 66 69 65 64 2e 20 49 66 20 6f 6e 65 20  ecified. If one 
7660: 69 73 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65  is.  ** specifie
7670: 64 2c 20 6f 6e 6c 79 20 70 72 6f 63 65 65 64 20  d, only proceed 
7680: 77 69 74 68 20 74 68 65 20 70 6c 61 79 62 61 63  with the playbac
7690: 6b 20 69 66 20 69 74 20 73 74 69 6c 6c 20 65 78  k if it still ex
76a0: 69 73 74 73 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ists. */.  rc = 
76b0: 72 65 61 64 33 32 62 69 74 73 28 26 70 50 61 67  read32bits(&pPag
76c0: 65 72 2d 3e 6a 66 64 2c 20 26 6e 4d 61 73 74 65  er->jfd, &nMaste
76d0: 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  r);.  if( rc ) g
76e0: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
76f0: 3b 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72 3e  ;.  if( nMaster>
7700: 30 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72  0 ){.    zMaster
7710: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
7720: 6e 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 69 66  nMaster);.    if
7730: 28 20 21 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20  ( !zMaster ){.  
7740: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
7750: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
7760: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
7770: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
7780: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70 50  qlite3OsRead(&pP
7790: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
77a0: 65 72 2c 20 6e 4d 61 73 74 65 72 29 3b 0a 20 20  er, nMaster);.  
77b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
77c0: 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73 74 65 72 5b  _OK || (zMaster[
77d0: 30 5d 20 26 26 20 21 73 71 6c 69 74 65 33 4f 73  0] && !sqlite3Os
77e0: 46 69 6c 65 45 78 69 73 74 73 28 7a 4d 61 73 74  FileExists(zMast
77f0: 65 72 29 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  er)) ){.      go
7800: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
7810: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
7820: 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 64 61   Truncate the da
7830: 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b  tabase file back
7840: 20 74 6f 20 69 74 27 73 20 6f 72 69 67 69 6e 61   to it's origina
7850: 6c 20 73 69 7a 65 20 2a 2f 0a 20 20 61 73 73 65  l size */.  asse
7860: 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  rt( pPager->orig
7870: 44 62 53 69 7a 65 3d 3d 30 20 7c 7c 20 70 50 61  DbSize==0 || pPa
7880: 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d  ger->origDbSize=
7890: 3d 6d 78 50 67 20 29 3b 0a 20 20 72 63 20 3d 20  =mxPg );.  rc = 
78a0: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
78b0: 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  e(&pPager->fd, S
78c0: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2a  QLITE_PAGE_SIZE*
78d0: 28 6f 66 66 5f 74 29 6d 78 50 67 29 3b 0a 20 20  (off_t)mxPg);.  
78e0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
78f0: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
7900: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
7910: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
7920: 20 3d 20 6d 78 50 67 3b 0a 20 20 0a 20 20 2f 2a   = mxPg;.  .  /*
7930: 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
7940: 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
7950: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
7960: 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
7970: 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  se file..  */.  
7980: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b  for(i=0; i<nRec;
7990: 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20   i++){.    rc = 
79a0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
79b0: 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
79c0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29  &pPager->jfd, 1)
79d0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
79e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
79f0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7a00: 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
7a10: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
7a20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
7a30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
7a40: 20 20 2f 2a 20 50 61 67 65 73 20 74 68 61 74 20    /* Pages that 
7a50: 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
7a60: 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
7a70: 20 62 75 74 20 6e 65 76 65 72 20 73 79 6e 63 65   but never synce
7a80: 64 0a 20 20 2a 2a 20 77 68 65 72 65 20 6e 6f 74  d.  ** where not
7a90: 20 72 65 73 74 6f 72 65 64 20 62 79 20 74 68 65   restored by the
7aa0: 20 6c 6f 6f 70 20 61 62 6f 76 65 2e 20 20 57 65   loop above.  We
7ab0: 20 68 61 76 65 20 74 6f 20 72 65 73 74 6f 72 65   have to restore
7ac0: 20 74 68 6f 73 65 0a 20 20 2a 2a 20 70 61 67 65   those.  ** page
7ad0: 73 20 62 79 20 72 65 61 64 69 6e 67 20 74 68 65  s by reading the
7ae0: 6d 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  m back from the 
7af0: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
7b00: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  e..  */.  if( rc
7b10: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
7b20: 20 20 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f     pager_reload_
7b30: 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20  cache(pPager);. 
7b40: 20 7d 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b   }..end_playback
7b50: 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 20  :.  if( zMaster 
7b60: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
7b70: 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20  re was a master 
7b80: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73  journal and this
7b90: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
7ba0: 74 75 72 6e 20 74 72 75 65 2c 0a 20 20 20 20 2a  turn true,.    *
7bb0: 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70  * see if it is p
7bc0: 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
7bd0: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
7be0: 72 6e 61 6c 2e 20 49 66 20 65 72 72 6f 72 73 20  rnal. If errors 
7bf0: 0a 20 20 20 20 2a 2a 20 6f 63 63 75 72 20 64 75  .    ** occur du
7c00: 72 69 6e 67 20 74 68 69 73 20 70 72 6f 63 65 73  ring this proces
7c10: 73 2c 20 69 67 6e 6f 72 65 20 74 68 65 6d 2e 0a  s, ignore them..
7c20: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
7c30: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
7c40: 20 20 20 20 20 20 70 61 67 65 72 5f 64 65 6c 6d        pager_delm
7c50: 61 73 74 65 72 28 7a 4d 61 73 74 65 72 29 3b 0a  aster(zMaster);.
7c60: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7c70: 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  Free(zMaster);. 
7c80: 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
7c90: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
7ca0: 20 46 49 58 20 4d 45 3a 20 57 65 20 73 68 6f 75   FIX ME: We shou
7cb0: 6c 64 6e 27 74 20 64 65 6c 65 74 65 20 74 68 65  ldn't delete the
7cc0: 20 6a 6f 75 72 6e 61 6c 20 69 66 20 61 6e 20 65   journal if an e
7cd0: 72 72 6f 72 20 6f 63 63 75 72 65 64 20 64 75 72  rror occured dur
7ce0: 69 6e 67 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62  ing.    ** rollb
7cf0: 61 63 6b 2e 20 49 74 20 6d 61 79 20 68 61 76 65  ack. It may have
7d00: 20 62 65 65 6e 20 61 20 74 72 61 6e 73 69 65 6e   been a transien
7d10: 74 20 65 72 72 6f 72 20 61 6e 64 20 74 68 65 20  t error and the 
7d20: 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 0a 20 20 20  rollback may.   
7d30: 20 2a 2a 20 73 75 63 63 65 65 64 20 6e 65 78 74   ** succeed next
7d40: 20 74 69 6d 65 20 69 74 20 69 73 20 61 74 74 65   time it is atte
7d50: 6d 70 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  mpted..    */.  
7d60: 20 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c    pager_unwritel
7d70: 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
7d80: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
7d90: 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 43 4f   |= PAGER_ERR_CO
7da0: 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20  RRUPT;.    rc = 
7db0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
7dc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
7dd0: 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
7de0: 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ock(pPager);.  }
7df0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7e00: 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
7e10: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
7e20: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  urnal..**.** Thi
7e30: 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  s is similar to 
7e40: 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65  playing back the
7e50: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
7e60: 72 6e 61 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a  rnal but with.**
7e70: 20 61 20 66 65 77 20 65 78 74 72 61 20 74 77 69   a few extra twi
7e80: 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  sts..**.**    (1
7e90: 29 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  )  The number of
7ea0: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
7eb0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74  tabase file at t
7ec0: 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20  he start of.**  
7ed0: 20 20 20 20 20 20 20 74 68 65 20 73 74 61 74 65         the state
7ee0: 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69  ment is stored i
7ef0: 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  n pPager->stmtSi
7f00: 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a  ze, not in the.*
7f10: 2a 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  *         journa
7f20: 6c 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a  l file itself..*
7f30: 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49 6e 20  *.**    (2)  In 
7f40: 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79  addition to play
7f50: 69 6e 67 20 62 61 63 6b 20 74 68 65 20 73 74 61  ing back the sta
7f60: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20  tement journal, 
7f70: 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20  also.**         
7f80: 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70 61 67  playback all pag
7f90: 65 73 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  es of the transa
7fa0: 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65  ction journal be
7fb0: 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20  ginning.**      
7fc0: 20 20 20 61 74 20 6f 66 66 73 65 74 20 70 50 61     at offset pPa
7fd0: 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a  ger->stmtJSize..
7fe0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
7ff0: 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  ger_stmt_playbac
8000: 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
8010: 7b 0a 20 20 6f 66 66 5f 74 20 73 7a 4a 3b 20 20  {.  off_t szJ;  
8020: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8030: 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c 6c  Size of the full
8040: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e   journal */.  in
8050: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
8060: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
8070: 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20   of Records */. 
8080: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
8090: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
80a0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
80b0: 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 72 75  nt rc;..  /* Tru
80c0: 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61  ncate the databa
80d0: 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  se back to its o
80e0: 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
80f0: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
8100: 33 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50 61  3OsTruncate(&pPa
8110: 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
8120: 50 41 47 45 5f 53 49 5a 45 2a 28 6f 66 66 5f 74  PAGE_SIZE*(off_t
8130: 29 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a  )pPager->stmtSiz
8140: 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62  e);.  pPager->db
8150: 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73  Size = pPager->s
8160: 74 6d 74 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46  tmtSize;..  /* F
8170: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
8180: 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
8190: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
81a0: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  journal..  */.  
81b0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
81c0: 73 74 6d 74 49 6e 55 73 65 20 26 26 20 70 50 61  stmtInUse && pPa
81d0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
81e0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 53   );.  sqlite3OsS
81f0: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 73 74 66  eek(&pPager->stf
8200: 64 2c 20 30 29 3b 0a 20 20 6e 52 65 63 20 3d 20  d, 0);.  nRec = 
8210: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
8220: 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f  ;.  .  /* Copy o
8230: 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75  riginal pages ou
8240: 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  t of the stateme
8250: 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  nt journal and b
8260: 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  ack into the.  *
8270: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
8280: 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20    Note that the 
8290: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
82a0: 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b 73 75 6d  l omits checksum
82b0: 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68  s from.  ** each
82c0: 20 72 65 63 6f 72 64 20 73 69 6e 63 65 20 70 6f   record since po
82d0: 77 65 72 2d 66 61 69 6c 75 72 65 20 72 65 63 6f  wer-failure reco
82e0: 76 65 72 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f  very is not impo
82f0: 72 74 61 6e 74 20 74 6f 20 73 74 61 74 65 6d 65  rtant to stateme
8300: 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73  nt.  ** journals
8310: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e  ..  */.  for(i=n
8320: 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Rec-1; i>=0; i--
8330: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
8340: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
8350: 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61  age(pPager, &pPa
8360: 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20  ger->stfd, 0);. 
8370: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
8380: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
8390: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
83a0: 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73  _OK ) goto end_s
83b0: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
83c0: 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  }..  /* Figure o
83d0: 75 74 20 68 6f 77 20 6d 61 6e 79 20 70 61 67 65  ut how many page
83e0: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 70  s need to be cop
83f0: 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65 20 74  ied out of the t
8400: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
8410: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  journal..  */.  
8420: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
8430: 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ek(&pPager->jfd,
8440: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
8450: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ze);.  if( rc!=S
8460: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8470: 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
8480: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 72 63  ayback;.  }.  rc
8490: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
84a0: 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  Size(&pPager->jf
84b0: 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  d, &szJ);.  if( 
84c0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
84d0: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74  .    goto end_st
84e0: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  mt_playback;.  }
84f0: 0a 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d  .  nRec = (szJ -
8500: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
8510: 7a 65 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ze)/JOURNAL_PG_S
8520: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 66 6f 72  Z(pPager);.  for
8530: 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b  (i=nRec-1; i>=0;
8540: 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20   i--){.    rc = 
8550: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
8560: 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
8570: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29  &pPager->jfd, 1)
8580: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
8590: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
85a0: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
85b0: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
85c0: 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f    goto end_stmt_
85d0: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
85e0: 20 20 7d 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f    }.  .end_stmt_
85f0: 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20  playback:.  if( 
8600: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
8610: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
8620: 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52  Mask |= PAGER_ER
8630: 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72  R_CORRUPT;.    r
8640: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
8650: 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
8660: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
8670: 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
8680: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
8690: 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20  mory pages that 
86a0: 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 0a  are allowed..**.
86b0: 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ** The maximum n
86c0: 75 6d 62 65 72 20 69 73 20 74 68 65 20 61 62 73  umber is the abs
86d0: 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 20 74  olute value of t
86e0: 68 65 20 6d 78 50 61 67 65 20 70 61 72 61 6d 65  he mxPage parame
86f0: 74 65 72 2e 0a 2a 2a 20 49 66 20 6d 78 50 61 67  ter..** If mxPag
8700: 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74  e is negative, t
8710: 68 65 20 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69  he noSync flag i
8720: 73 20 61 6c 73 6f 20 73 65 74 2e 20 20 6e 6f 53  s also set.  noS
8730: 79 6e 63 20 62 79 70 61 73 73 65 73 0a 2a 2a 20  ync bypasses.** 
8740: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
8750: 4f 73 53 79 6e 63 28 29 2e 20 20 54 68 65 20 70  OsSync().  The p
8760: 61 67 65 72 20 72 75 6e 73 20 6d 75 63 68 20 66  ager runs much f
8770: 61 73 74 65 72 20 77 69 74 68 20 6e 6f 53 79 6e  aster with noSyn
8780: 63 20 6f 6e 2c 0a 2a 2a 20 62 75 74 20 69 66 20  c on,.** but if 
8790: 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
87a0: 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20  stem crashes or 
87b0: 74 68 65 72 65 20 69 73 20 61 6e 20 61 62 72 75  there is an abru
87c0: 70 74 20 70 6f 77 65 72 20 0a 2a 2a 20 66 61 69  pt power .** fai
87d0: 6c 75 72 65 2c 20 74 68 65 20 64 61 74 61 62 61  lure, the databa
87e0: 73 65 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65  se file might be
87f0: 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f   left in an inco
8800: 6e 73 69 73 74 65 6e 74 20 61 6e 64 0a 2a 2a 20  nsistent and.** 
8810: 75 6e 72 65 70 61 69 72 61 62 6c 65 20 73 74 61  unrepairable sta
8820: 74 65 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  te.  .*/.void sq
8830: 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 63  lite3pager_set_c
8840: 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a  achesize(Pager *
8850: 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
8860: 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67  ge){.  if( mxPag
8870: 65 3e 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67  e>=0 ){.    pPag
8880: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61  er->noSync = pPa
8890: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
88a0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
88b0: 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e  oSync ) pPager->
88c0: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 0a 20  needSync = 0; . 
88d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
88e0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31 3b 0a  er->noSync = 1;.
88f0: 20 20 20 20 6d 78 50 61 67 65 20 3d 20 2d 6d 78      mxPage = -mx
8900: 50 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Page;.  }.  if( 
8910: 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20  mxPage>10 ){.   
8920: 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
8930: 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 7d 0a  = mxPage;.  }.}.
8940: 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
8950: 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20  e robustness of 
8960: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
8970: 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
8980: 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70   crashes.** or p
8990: 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79  ower failures by
89a0: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75   changing the nu
89b0: 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73  mber of syncs()s
89c0: 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a   when writing.**
89d0: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
89e0: 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72  urnal.  There ar
89f0: 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a  e three levels:.
8a00: 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20  **.**    OFF    
8a10: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63     sqlite3OsSync
8a20: 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  () is never call
8a30: 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
8a40: 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20   default.**     
8a50: 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d           for tem
8a60: 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73  porary and trans
8a70: 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  ient files..**.*
8a80: 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54  *    NORMAL    T
8a90: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
8aa0: 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65  nced once before
8ab0: 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
8ac0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
8ad0: 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20       database.  
8ae0: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
8af0: 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63   adequate protec
8b00: 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20  tion, but.**    
8b10: 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20            it is 
8b20: 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f  theoretically po
8b30: 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76  ssible, though v
8b40: 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a  ery unlikely,.**
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
8b60: 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65  at an inopertune
8b70: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
8b80: 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a  ould leave the j
8b90: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
8ba0: 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74         in a stat
8bb0: 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61  e which would ca
8bc0: 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68  use damage to th
8bd0: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
8be0: 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20             when 
8bf0: 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  it is rolled bac
8c00: 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c  k..**.**    FULL
8c10: 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61        The journa
8c20: 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63  l is synced twic
8c30: 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
8c40: 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
8c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
8c60: 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65  abase (with some
8c70: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
8c80: 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52  rmation - the nR
8c90: 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20  ec field.**     
8ca0: 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
8cb0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d  journal header -
8cc0: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69   being written i
8cd0: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  n between the tw
8ce0: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
8cf0: 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65    syncs).  If we
8d00: 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69   assume that wri
8d10: 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ting a.**       
8d20: 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69         single di
8d30: 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f  sk sector is ato
8d40: 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  mic, then this m
8d50: 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20  ode provides.** 
8d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
8d70: 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  urance that the 
8d80: 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74  journal will not
8d90: 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f   be corrupted to
8da0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
8db0: 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61       point of ca
8dc0: 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20  using damage to 
8dd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72  the database dur
8de0: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ing rollback..**
8df0: 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75  .** Numeric valu
8e00: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
8e10: 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20  th these states 
8e20: 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d  are OFF==1, NORM
8e30: 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c  AL=2,.** and FUL
8e40: 4c 3d 33 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  L=3..*/.void sql
8e50: 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 73 61  ite3pager_set_sa
8e60: 66 65 74 79 5f 6c 65 76 65 6c 28 50 61 67 65 72  fety_level(Pager
8e70: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65   *pPager, int le
8e80: 76 65 6c 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  vel){.  pPager->
8e90: 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d  noSync =  level=
8ea0: 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =1 || pPager->te
8eb0: 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
8ec0: 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76  ->fullSync = lev
8ed0: 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72  el==3 && !pPager
8ee0: 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66  ->tempFile;.  if
8ef0: 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
8f00: 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53   ) pPager->needS
8f10: 79 6e 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ync = 0;.}../*.*
8f20: 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  * Open a tempora
8f30: 72 79 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20  ry file.  Write 
8f40: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
8f50: 66 69 6c 65 20 69 6e 74 6f 20 7a 4e 61 6d 65 0a  file into zName.
8f60: 2a 2a 20 28 7a 4e 61 6d 65 20 6d 75 73 74 20 62  ** (zName must b
8f70: 65 20 61 74 20 6c 65 61 73 74 20 53 51 4c 49 54  e at least SQLIT
8f80: 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20  E_TEMPNAME_SIZE 
8f90: 62 79 74 65 73 20 6c 6f 6e 67 2e 29 20 20 57 72  bytes long.)  Wr
8fa0: 69 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  ite.** the file 
8fb0: 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20  descriptor into 
8fc0: 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  *fd.  Return SQL
8fd0: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
8fe0: 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68  s or some.** oth
8ff0: 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  er error code if
9000: 20 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20   we fail..**.** 
9010: 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f  The OS will auto
9020: 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
9030: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
9040: 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 0a 2a  ile when it is.*
9050: 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61  * closed..*/.sta
9060: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 70  tic int sqlite3p
9070: 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 63 68  ager_opentemp(ch
9080: 61 72 20 2a 7a 46 69 6c 65 2c 20 4f 73 46 69 6c  ar *zFile, OsFil
9090: 65 20 2a 66 64 29 7b 0a 20 20 69 6e 74 20 63 6e  e *fd){.  int cn
90a0: 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b  t = 8;.  int rc;
90b0: 0a 20 20 64 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d  .  do{.    cnt--
90c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 54  ;.    sqlite3OsT
90d0: 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 46 69 6c  empFileName(zFil
90e0: 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  e);.    rc = sql
90f0: 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73  ite3OsOpenExclus
9100: 69 76 65 28 7a 46 69 6c 65 2c 20 66 64 2c 20 31  ive(zFile, fd, 1
9110: 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 63 6e 74  );.  }while( cnt
9120: 3e 30 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  >0 && rc!=SQLITE
9130: 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  _OK );.  return 
9140: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
9150: 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 63  ate a new page c
9160: 61 63 68 65 20 61 6e 64 20 70 75 74 20 61 20 70  ache and put a p
9170: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
9180: 67 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50  ge cache in *ppP
9190: 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c  ager..** The fil
91a0: 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e  e to be cached n
91b0: 65 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20  eed not exist.  
91c0: 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  The file is not 
91d0: 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20  locked until.** 
91e0: 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
91f0: 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  o sqlite3pager_g
9200: 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79  et() and is only
9210: 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c   held open until
9220: 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67   the.** last pag
9230: 65 20 69 73 20 72 65 6c 65 61 73 65 64 20 75 73  e is released us
9240: 69 6e 67 20 73 71 6c 69 74 65 33 70 61 67 65 72  ing sqlite3pager
9250: 5f 75 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20  _unref()..**.** 
9260: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
9270: 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64  NULL then a rand
9280: 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f  omly-named tempo
9290: 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65  rary file is cre
92a0: 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64  ated.** and used
92b0: 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20   as the file to 
92c0: 62 65 20 63 61 63 68 65 64 2e 20 20 54 68 65 20  be cached.  The 
92d0: 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c  file will be del
92e0: 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69  eted.** automati
92f0: 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73  cally when it is
9300: 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20   closed..*/.int 
9310: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65  sqlite3pager_ope
9320: 6e 28 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50  n(.  Pager **ppP
9330: 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  ager,         /*
9340: 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65   Return the Page
9350: 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  r structure here
9360: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
9370: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f   *zFilename,   /
9380: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
9390: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
93a0: 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50  pen */.  int mxP
93b0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
93c0: 20 20 2f 2a 20 4d 61 78 20 6e 75 6d 62 65 72 20    /* Max number 
93d0: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  of in-memory cac
93e0: 68 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  he pages */.  in
93f0: 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
9400: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
9410: 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20  bytes append to 
9420: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
9430: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65  age */.  int use
9440: 4a 6f 75 72 6e 61 6c 2c 20 20 20 20 20 20 20 20  Journal,        
9450: 20 20 2f 2a 20 54 52 55 45 20 74 6f 20 75 73 65    /* TRUE to use
9460: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
9470: 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  nal on this file
9480: 20 2a 2f 0a 20 20 76 6f 69 64 20 20 2a 70 42 75   */.  void  *pBu
9490: 73 79 48 61 6e 64 6c 65 72 20 20 20 20 20 20 2f  syHandler      /
94a0: 2a 20 42 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  * Busy callback 
94b0: 2a 2f 0a 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  */.){.  Pager *p
94c0: 50 61 67 65 72 3b 0a 20 20 63 68 61 72 20 2a 7a  Pager;.  char *z
94d0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 3b 0a 20 20  FullPathname;.  
94e0: 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 0a 20 20 4f  int nameLen;.  O
94f0: 73 46 69 6c 65 20 66 64 3b 0a 20 20 69 6e 74 20  sFile fd;.  int 
9500: 72 63 2c 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d  rc, i;.  int tem
9510: 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 6d 65 6d  pFile;.  int mem
9520: 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  Db = 0;.  int re
9530: 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 63 68  adOnly = 0;.  ch
9540: 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f  ar zTemp[SQLITE_
9550: 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a  TEMPNAME_SIZE];.
9560: 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b  .  *ppPager = 0;
9570: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d  .  if( sqlite3_m
9580: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a  alloc_failed ){.
9590: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
95a0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  E_NOMEM;.  }.  i
95b0: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
95c0: 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
95d0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
95e0: 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72  Filename,":memor
95f0: 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  y:")==0 ){.     
9600: 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20   memDb = 1;.    
9610: 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20    zFullPathname 
9620: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 34  = sqliteMalloc(4
9630: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 46 75  );.      if( zFu
9640: 6c 6c 50 61 74 68 6e 61 6d 65 20 29 20 73 74 72  llPathname ) str
9650: 63 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  cpy(zFullPathnam
9660: 65 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 63  e, "");.      rc
9670: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
9680: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
9690: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
96a0: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
96b0: 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
96c0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
96d0: 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69  te3OsOpenReadWri
96e0: 74 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  te(zFullPathname
96f0: 2c 20 26 66 64 2c 20 26 72 65 61 64 4f 6e 6c 79  , &fd, &readOnly
9700: 29 3b 0a 20 20 20 20 20 20 74 65 6d 70 46 69 6c  );.      tempFil
9710: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 0;.    }.  }
9720: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
9730: 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e  qlite3pager_open
9740: 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26 66 64 29  temp(zTemp, &fd)
9750: 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20  ;.    zFilename 
9760: 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75  = zTemp;.    zFu
9770: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
9780: 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
9790: 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
97a0: 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b     tempFile = 1;
97b0: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
97c0: 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
97d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
97e0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
97f0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
9800: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
9810: 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  teFree(zFullPath
9820: 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  name);.    retur
9830: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
9840: 4e 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 4c 65 6e  N;.  }.  nameLen
9850: 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6c 6c 50   = strlen(zFullP
9860: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 70 50 61 67  athname);.  pPag
9870: 65 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  er = sqliteMallo
9880: 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65  c( sizeof(*pPage
9890: 72 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a 33 20 2b  r) + nameLen*3 +
98a0: 20 33 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61   30 );.  if( pPa
98b0: 67 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ger==0 ){.    sq
98c0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64  lite3OsClose(&fd
98d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
98e0: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
98f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
9900: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
9910: 20 53 45 54 5f 50 41 47 45 52 28 70 50 61 67 65   SET_PAGER(pPage
9920: 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46  r);.  pPager->zF
9930: 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ilename = (char*
9940: 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70  )&pPager[1];.  p
9950: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
9960: 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69  y = &pPager->zFi
9970: 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31  lename[nameLen+1
9980: 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  ];.  pPager->zJo
9990: 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d  urnal = &pPager-
99a0: 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 61 6d 65  >zDirectory[name
99b0: 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79  Len+1];.  strcpy
99c0: 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
99d0: 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  me, zFullPathnam
99e0: 65 29 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61  e);.  strcpy(pPa
99f0: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c  ger->zDirectory,
9a00: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
9a10: 0a 20 20 66 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e  .  for(i=nameLen
9a20: 3b 20 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d  ; i>0 && pPager-
9a30: 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d  >zDirectory[i-1]
9a40: 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20  !='/'; i--){}.  
9a50: 69 66 28 20 69 3e 30 20 29 20 70 50 61 67 65 72  if( i>0 ) pPager
9a60: 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31  ->zDirectory[i-1
9a70: 5d 20 3d 20 30 3b 0a 20 20 73 74 72 63 70 79 28  ] = 0;.  strcpy(
9a80: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
9a90: 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
9aa0: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
9ab0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
9ac0: 20 73 74 72 63 70 79 28 26 70 50 61 67 65 72 2d   strcpy(&pPager-
9ad0: 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65  >zJournal[nameLe
9ae0: 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b  n], "-journal");
9af0: 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20  .  pPager->fd = 
9b00: 66 64 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  fd;.  pPager->jo
9b10: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20  urnalOpen = 0;. 
9b20: 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
9b30: 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c  nal = useJournal
9b40: 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50   && !memDb;.  pP
9b50: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
9b60: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74   0;.  pPager->st
9b70: 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 70  mtInUse = 0;.  p
9b80: 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
9b90: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
9ba0: 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70  e = memDb-1;.  p
9bb0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
9bc0: 3d 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  = SQLITE_PAGE_SI
9bd0: 5a 45 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  ZE;.  pPager->st
9be0: 6d 74 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50  mtSize = 0;.  pP
9bf0: 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
9c00: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
9c10: 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Page = 0;.  pPag
9c20: 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50  er->mxPage = mxP
9c30: 61 67 65 3e 35 20 3f 20 6d 78 50 61 67 65 20 3a  age>5 ? mxPage :
9c40: 20 31 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73   10;.  pPager->s
9c50: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
9c60: 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  OCK;.  pPager->e
9c70: 72 72 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50  rrMask = 0;.  pP
9c80: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d  ager->tempFile =
9c90: 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61   tempFile;.  pPa
9ca0: 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d  ger->memDb = mem
9cb0: 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65  Db;.  pPager->re
9cc0: 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c  adOnly = readOnl
9cd0: 79 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  y;.  pPager->nee
9ce0: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61  dSync = 0;.  pPa
9cf0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50  ger->noSync = pP
9d00: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c  ager->tempFile |
9d10: 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20  | !useJournal;. 
9d20: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
9d30: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
9d40: 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b  FirstSynced = 0;
9d50: 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  .  pPager->pLast
9d60: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
9d70: 6e 45 78 74 72 61 20 3d 20 6e 45 78 74 72 61 3b  nExtra = nExtra;
9d80: 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  .  pPager->pBusy
9d90: 48 61 6e 64 6c 65 72 20 3d 20 28 42 75 73 79 48  Handler = (BusyH
9da0: 61 6e 64 6c 65 72 20 2a 29 70 42 75 73 79 48 61  andler *)pBusyHa
9db0: 6e 64 6c 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28  ndler;.  memset(
9dc0: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30  pPager->aHash, 0
9dd0: 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
9de0: 3e 61 48 61 73 68 29 29 3b 0a 20 20 2a 70 70 50  >aHash));.  *ppP
9df0: 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20  ager = pPager;. 
9e00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9e10: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
9e20: 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66  the destructor f
9e30: 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20  or this pager.  
9e40: 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  If not NULL, the
9e50: 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 63   destructor is c
9e60: 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68  alled.** when th
9e70: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
9e80: 74 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 72  t on each page r
9e90: 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 54 68  eaches zero.  Th
9ea0: 65 20 64 65 73 74 72 75 63 74 6f 72 20 63 61 6e  e destructor can
9eb0: 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63  .** be used to c
9ec0: 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74  lean up informat
9ed0: 69 6f 6e 20 69 6e 20 74 68 65 20 65 78 74 72 61  ion in the extra
9ee0: 20 73 65 67 6d 65 6e 74 20 61 70 70 65 6e 64 65   segment appende
9ef0: 64 20 74 6f 20 65 61 63 68 20 70 61 67 65 2e 0a  d to each page..
9f00: 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74 72 75  **.** The destru
9f10: 63 74 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c  ctor is not call
9f20: 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 73  ed as a result s
9f30: 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73  qlite3pager_clos
9f40: 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75  e().  .** Destru
9f50: 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20 63  ctors are only c
9f60: 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33  alled by sqlite3
9f70: 70 61 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a  pager_unref()..*
9f80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
9f90: 67 65 72 5f 73 65 74 5f 64 65 73 74 72 75 63 74  ger_set_destruct
9fa0: 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
9fb0: 2c 20 76 6f 69 64 20 28 2a 78 44 65 73 63 29 28  , void (*xDesc)(
9fc0: 76 6f 69 64 2a 2c 69 6e 74 29 29 7b 0a 20 20 70  void*,int)){.  p
9fd0: 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
9fe0: 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f  or = xDesc;.}../
9ff0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72 65 69  *.** Set the rei
a000: 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 74  nitializer for t
a010: 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e  his pager.  If n
a020: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69  ot NULL, the rei
a030: 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73  nitializer.** is
a040: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
a050: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70 61   content of a pa
a060: 67 65 20 69 6e 20 63 61 63 68 65 20 69 73 20 72  ge in cache is r
a070: 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f  estored to its o
a080: 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65  riginal.** value
a090: 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
a0a0: 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65  a rollback.  The
a0b0: 20 63 61 6c 6c 62 61 63 6b 20 67 69 76 65 73 20   callback gives 
a0c0: 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64  higher-level cod
a0d0: 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e  e.** an opportun
a0e0: 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74  ity to restore t
a0f0: 68 65 20 45 58 54 52 41 20 73 65 63 74 69 6f 6e  he EXTRA section
a100: 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74   to agree with t
a110: 68 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70  he restored.** p
a120: 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69  age data..*/.voi
a130: 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  d sqlite3pager_s
a140: 65 74 5f 72 65 69 6e 69 74 65 72 28 50 61 67 65  et_reiniter(Page
a150: 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
a160: 28 2a 78 52 65 69 6e 69 74 29 28 76 6f 69 64 2a  (*xReinit)(void*
a170: 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72  ,int)){.  pPager
a180: 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52  ->xReiniter = xR
a190: 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  einit;.}../*.** 
a1a0: 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c  Return the total
a1b0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
a1c0: 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   in the disk fil
a1d0: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
a1e0: 68 0a 2a 2a 20 70 50 61 67 65 72 2e 0a 2a 2f 0a  h.** pPager..*/.
a1f0: 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
a200: 5f 70 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  _pagecount(Pager
a210: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 6f 66 66   *pPager){.  off
a220: 5f 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  _t n;.  assert( 
a230: 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69  pPager!=0 );.  i
a240: 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
a250: 65 3e 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e>=0 ){.    retu
a260: 72 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  rn pPager->dbSiz
a270: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  e;.  }.  if( sql
a280: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26  ite3OsFileSize(&
a290: 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 21  pPager->fd, &n)!
a2a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
a2b0: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73    pPager->errMas
a2c0: 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 44  k |= PAGER_ERR_D
a2d0: 49 53 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ISK;.    return 
a2e0: 30 3b 0a 20 20 7d 0a 20 20 6e 20 2f 3d 20 53 51  0;.  }.  n /= SQ
a2f0: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 3b 0a  LITE_PAGE_SIZE;.
a300: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
a310: 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
a320: 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
a330: 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 7d  >dbSize = n;.  }
a340: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
a350: 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65  /*.** Forward de
a360: 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  claration.*/.sta
a370: 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72  tic int syncJour
a380: 6e 61 6c 28 50 61 67 65 72 2a 2c 20 63 6f 6e 73  nal(Pager*, cons
a390: 74 20 63 68 61 72 2a 29 3b 0a 0a 0a 2f 2a 0a 2a  t char*);.../*.*
a3a0: 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61 67 65 20  * Unlink a page 
a3b0: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69  from the free li
a3c0: 73 74 20 28 74 68 65 20 6c 69 73 74 20 6f 66 20  st (the list of 
a3d0: 61 6c 6c 20 70 61 67 65 73 20 77 68 65 72 65 20  all pages where 
a3e0: 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20  nRef==0).** and 
a3f0: 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63 6f  from its hash co
a400: 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a  llision chain..*
a410: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
a420: 6c 69 6e 6b 50 61 67 65 28 50 67 48 64 72 20 2a  linkPage(PgHdr *
a430: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
a440: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
a450: 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70 20  ger;..  /* Keep 
a460: 74 68 65 20 70 46 69 72 73 74 53 79 6e 63 65 64  the pFirstSynced
a470: 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e   pointer pointin
a480: 67 20 61 74 20 74 68 65 20 66 69 72 73 74 20 73  g at the first s
a490: 79 6e 63 68 72 6f 6e 69 7a 65 64 20 70 61 67 65  ynchronized page
a4a0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 70   */.  if( pPg==p
a4b0: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
a4c0: 63 65 64 20 29 7b 0a 20 20 20 20 50 67 48 64 72  ced ){.    PgHdr
a4d0: 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74   *p = pPg->pNext
a4e0: 46 72 65 65 3b 0a 20 20 20 20 77 68 69 6c 65 28  Free;.    while(
a4f0: 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e   p && p->needSyn
a500: 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78  c ){ p = p->pNex
a510: 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 70 50 61  tFree; }.    pPa
a520: 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
a530: 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  d = p;.  }..  /*
a540: 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65   Unlink from the
a550: 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69   freelist */.  i
a560: 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65  f( pPg->pPrevFre
a570: 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 50  e ){.    pPg->pP
a580: 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72  revFree->pNextFr
a590: 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  ee = pPg->pNextF
a5a0: 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ree;.  }else{.  
a5b0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a5c0: 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67 20 29 3b  ->pFirst==pPg );
a5d0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69  .    pPager->pFi
a5e0: 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  rst = pPg->pNext
a5f0: 46 72 65 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Free;.  }.  if( 
a600: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29  pPg->pNextFree )
a610: 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  {.    pPg->pNext
a620: 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20  Free->pPrevFree 
a630: 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
a640: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
a650: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
a660: 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20  Last==pPg );.   
a670: 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
a680: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
a690: 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78  .  }.  pPg->pNex
a6a0: 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72  tFree = pPg->pPr
a6b0: 65 76 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 2f  evFree = 0;..  /
a6c0: 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68  * Unlink from th
a6d0: 65 20 70 67 6e 6f 20 68 61 73 68 20 74 61 62 6c  e pgno hash tabl
a6e0: 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e  e */.  if( pPg->
a6f0: 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20  pNextHash ){.   
a700: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d   pPg->pNextHash-
a710: 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
a720: 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d  ->pPrevHash;.  }
a730: 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65  .  if( pPg->pPre
a740: 76 48 61 73 68 20 29 7b 0a 20 20 20 20 70 50 67  vHash ){.    pPg
a750: 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65  ->pPrevHash->pNe
a760: 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e  xtHash = pPg->pN
a770: 65 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65  extHash;.  }else
a780: 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70 61  {.    int h = pa
a790: 67 65 72 5f 68 61 73 68 28 70 50 67 2d 3e 70 67  ger_hash(pPg->pg
a7a0: 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  no);.    assert(
a7b0: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
a7c0: 5d 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  ]==pPg );.    pP
a7d0: 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d  ager->aHash[h] =
a7e0: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b   pPg->pNextHash;
a7f0: 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78  .  }.  pPg->pNex
a800: 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72  tHash = pPg->pPr
a810: 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f  evHash = 0;.}../
a820: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a830: 65 20 69 73 20 75 73 65 64 20 74 6f 20 74 72 75  e is used to tru
a840: 6e 63 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ncate an in-memo
a850: 72 79 20 64 61 74 61 62 61 73 65 2e 20 20 44 65  ry database.  De
a860: 6c 65 74 65 0a 2a 2a 20 65 76 65 72 79 20 70 61  lete.** every pa
a870: 67 65 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69  ges whose pgno i
a880: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50  s larger than pP
a890: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e 64  ager->dbSize and
a8a0: 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63 65 64   is unreferenced
a8b0: 2e 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 64 20  ..** Referenced 
a8c0: 70 61 67 65 73 20 6c 61 72 67 65 72 20 74 68 61  pages larger tha
a8d0: 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  n pPager->dbSize
a8e0: 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2f 0a   are zeroed..*/.
a8f0: 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65 6d 6f  static void memo
a900: 72 79 54 72 75 6e 63 61 74 65 28 50 61 67 65 72  ryTruncate(Pager
a910: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
a920: 64 72 20 2a 70 50 67 3b 0a 20 20 50 67 48 64 72  dr *pPg;.  PgHdr
a930: 20 2a 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20 64   **ppPg;.  int d
a940: 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
a950: 64 62 53 69 7a 65 3b 0a 0a 20 20 70 70 50 67 20  dbSize;..  ppPg 
a960: 3d 20 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  = &pPager->pAll;
a970: 0a 20 20 77 68 69 6c 65 28 20 28 70 50 67 20 3d  .  while( (pPg =
a980: 20 2a 70 70 50 67 29 21 3d 30 20 29 7b 0a 20 20   *ppPg)!=0 ){.  
a990: 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c    if( pPg->pgno<
a9a0: 3d 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  =dbSize ){.     
a9b0: 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e   ppPg = &pPg->pN
a9c0: 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73  extAll;.    }els
a9d0: 65 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e  e if( pPg->nRef>
a9e0: 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  0 ){.      memse
a9f0: 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  t(PGHDR_TO_DATA(
aa00: 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  pPg), 0, pPager-
aa10: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
aa20: 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70    ppPg = &pPg->p
aa30: 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c  NextAll;.    }el
aa40: 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 50 67 20  se{.      *ppPg 
aa50: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b  = pPg->pNextAll;
aa60: 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67  .      unlinkPag
aa70: 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 73 71  e(pPg);.      sq
aa80: 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20  liteFree(pPg);. 
aa90: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61       pPager->nPa
aaa0: 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ge--;.    }.  }.
aab0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  }../*.** Truncat
aac0: 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74 68  e the file to th
aad0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
aae0: 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a  s specified..*/.
aaf0: 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
ab00: 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  _truncate(Pager 
ab10: 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
ab20: 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  age){.  int rc;.
ab30: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
ab40: 53 69 7a 65 3c 30 20 29 7b 0a 20 20 20 20 73 71  Size<0 ){.    sq
ab50: 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63  lite3pager_pagec
ab60: 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
ab70: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
ab80: 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20  errMask!=0 ){.  
ab90: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
aba0: 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20  code(pPager);.  
abb0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
abc0: 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 3d 28 75  .  if( nPage>=(u
abd0: 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e  nsigned)pPager->
abe0: 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  dbSize ){.    re
abf0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ac00: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
ac10: 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70  ->memDb ){.    p
ac20: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
ac30: 6e 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 6f 72  nPage;.    memor
ac40: 79 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  yTruncate(pPager
ac50: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
ac60: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73  LITE_OK;.  }.  s
ac70: 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
ac80: 72 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71  r, 0);.  rc = sq
ac90: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
aca0: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  &pPager->fd, SQL
acb0: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2a 28 6f  ITE_PAGE_SIZE*(o
acc0: 66 66 5f 74 29 6e 50 61 67 65 29 3b 0a 20 20 69  ff_t)nPage);.  i
acd0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
ace0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
acf0: 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  dbSize = nPage;.
ad00: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
ad10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f  .}../*.** Shutdo
ad20: 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  wn the page cach
ad30: 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d  e.  Free all mem
ad40: 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c  ory and close al
ad50: 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  l files..**.** I
ad60: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
ad70: 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20  was in progress 
ad80: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
ad90: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61  e is called, tha
ada0: 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
adb0: 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
adc0: 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e    All outstandin
add0: 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61  g pages are inva
ade0: 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74  lidated.** and t
adf0: 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66  heir memory is f
ae00: 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d  reed.  Any attem
ae10: 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65  pt to use a page
ae20: 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
ae30: 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61  ith this page ca
ae40: 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66  che after this f
ae50: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
ae60: 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72  will likely.** r
ae70: 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64  esult in a cored
ae80: 75 6d 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ump..*/.int sqli
ae90: 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 50  te3pager_close(P
aea0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
aeb0: 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e   PgHdr *pPg, *pN
aec0: 65 78 74 3b 0a 20 20 73 77 69 74 63 68 28 20 70  ext;.  switch( p
aed0: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 29 7b 0a  Pager->state ){.
aee0: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 52      case PAGER_R
aef0: 45 53 45 52 56 45 44 3a 0a 20 20 20 20 63 61 73  ESERVED:.    cas
af00: 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  e PAGER_EXCLUSIV
af10: 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
af20: 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
af30: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
af40: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d  if( !pPager->mem
af50: 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  Db ){.        sq
af60: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70  lite3OsUnlock(&p
af70: 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f  Pager->fd, NO_LO
af80: 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
af90: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
afa0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
afb0: 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
afc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
afd0: 20 50 41 47 45 52 5f 53 48 41 52 45 44 3a 20 7b   PAGER_SHARED: {
afe0: 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
aff0: 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
b000: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
b010: 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  lock(&pPager->fd
b020: 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
b030: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
b040: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
b050: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44  lt: {.      /* D
b060: 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20  o nothing */.   
b070: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b080: 20 20 7d 0a 20 20 66 6f 72 28 70 50 67 3d 70 50    }.  for(pPg=pP
b090: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
b0a0: 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20   pPg=pNext){.   
b0b0: 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e   pNext = pPg->pN
b0c0: 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69  extAll;.    sqli
b0d0: 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d  teFree(pPg);.  }
b0e0: 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
b0f0: 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73 71 6c  memDb ){.    sql
b100: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61  ite3OsClose(&pPa
b110: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20 20  ger->fd);.  }.  
b120: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
b130: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
b140: 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65  ;.  /* Temp file
b150: 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61  s are automatica
b160: 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20 74  lly deleted by t
b170: 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70  he OS.  ** if( p
b180: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
b190: 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65  ){.  **   sqlite
b1a0: 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
b1b0: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
b1c0: 2a 2a 20 7d 0a 20 20 2a 2f 0a 20 20 43 4c 52 5f  ** }.  */.  CLR_
b1d0: 50 41 47 45 52 28 70 50 61 67 65 72 29 3b 0a 20  PAGER(pPager);. 
b1e0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 7a 46 69   if( pPager->zFi
b1f0: 6c 65 6e 61 6d 65 21 3d 28 63 68 61 72 2a 29 26  lename!=(char*)&
b200: 70 50 61 67 65 72 5b 31 5d 20 29 7b 0a 20 20 20  pPager[1] ){.   
b210: 20 61 73 73 65 72 74 28 20 30 20 29 3b 20 20 2f   assert( 0 );  /
b220: 2a 20 43 61 6e 6e 6f 74 20 68 61 70 70 65 6e 20  * Cannot happen 
b230: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  */.    sqliteFre
b240: 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  e(pPager->zFilen
b250: 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
b260: 46 72 65 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  Free(pPager->zJo
b270: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69  urnal);.    sqli
b280: 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 7a  teFree(pPager->z
b290: 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 7d 0a  Directory);.  }.
b2a0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
b2b0: 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
b2c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
b2d0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  ** Return the pa
b2e0: 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
b2f0: 65 20 67 69 76 65 6e 20 70 61 67 65 20 64 61 74  e given page dat
b300: 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74  a..*/.Pgno sqlit
b310: 65 33 70 61 67 65 72 5f 70 61 67 65 6e 75 6d 62  e3pager_pagenumb
b320: 65 72 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  er(void *pData){
b330: 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20 44 41  .  PgHdr *p = DA
b340: 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
b350: 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  a);.  return p->
b360: 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pgno;.}../*.** T
b370: 68 65 20 70 61 67 65 5f 72 65 66 28 29 20 66 75  he page_ref() fu
b380: 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74  nction increment
b390: 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  s the reference 
b3a0: 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65  count for a page
b3b0: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  ..** If the page
b3c0: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e   is currently on
b3d0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 28 74   the freelist (t
b3e0: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
b3f0: 6e 74 20 69 73 20 7a 65 72 6f 29 20 74 68 65 6e  nt is zero) then
b400: 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20 66 72  .** remove it fr
b410: 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  om the freelist.
b420: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74  .**.** For non-t
b430: 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67  est systems, pag
b440: 65 5f 72 65 66 28 29 20 69 73 20 61 20 6d 61 63  e_ref() is a mac
b450: 72 6f 20 74 68 61 74 20 63 61 6c 6c 73 20 5f 70  ro that calls _p
b460: 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c  age_ref().** onl
b470: 69 6e 65 20 6f 66 20 74 68 65 20 72 65 66 65 72  ine of the refer
b480: 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65  ence count is ze
b490: 72 6f 2e 20 20 46 6f 72 20 74 65 73 74 20 73 79  ro.  For test sy
b4a0: 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28  stems, page_ref(
b4b0: 29 0a 2a 2a 20 69 73 20 61 20 72 65 61 6c 20 66  ).** is a real f
b4c0: 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68 61 74 20  unction so that 
b4d0: 77 65 20 63 61 6e 20 73 65 74 20 62 72 65 61 6b  we can set break
b4e0: 70 6f 69 6e 74 73 20 61 6e 64 20 74 72 61 63 65  points and trace
b4f0: 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76   it..*/.static v
b500: 6f 69 64 20 5f 70 61 67 65 5f 72 65 66 28 50 67  oid _page_ref(Pg
b510: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  Hdr *pPg){.  if(
b520: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
b530: 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
b540: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e   is currently on
b550: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
b560: 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20  Remove it. */.  
b570: 20 20 69 66 28 20 70 50 67 3d 3d 70 50 67 2d 3e    if( pPg==pPg->
b580: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
b590: 6e 63 65 64 20 29 7b 0a 20 20 20 20 20 20 50 67  nced ){.      Pg
b5a0: 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e  Hdr *p = pPg->pN
b5b0: 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20 20 77  extFree;.      w
b5c0: 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65  hile( p && p->ne
b5d0: 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d  edSync ){ p = p-
b5e0: 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20  >pNextFree; }.  
b5f0: 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
b600: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
b610: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  p;.    }.    if(
b620: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
b630: 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  ){.      pPg->pP
b640: 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72  revFree->pNextFr
b650: 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  ee = pPg->pNextF
b660: 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ree;.    }else{.
b670: 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
b680: 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d  r->pFirst = pPg-
b690: 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
b6a0: 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  }.    if( pPg->p
b6b0: 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20  NextFree ){.    
b6c0: 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65    pPg->pNextFree
b6d0: 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50  ->pPrevFree = pP
b6e0: 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20  g->pPrevFree;.  
b6f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
b700: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 4c 61 73  Pg->pPager->pLas
b710: 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  t = pPg->pPrevFr
b720: 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  ee;.    }.    pP
b730: 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b  g->pPager->nRef+
b740: 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52  +;.  }.  pPg->nR
b750: 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e 46 4f 28  ef++;.  REFINFO(
b760: 70 50 67 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53  pPg);.}.#ifdef S
b770: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 74 61  QLITE_TEST.  sta
b780: 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65  tic void page_re
b790: 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  f(PgHdr *pPg){. 
b7a0: 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66     if( pPg->nRef
b7b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 5f 70 61  ==0 ){.      _pa
b7c0: 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 20  ge_ref(pPg);.   
b7d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
b7e0: 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  g->nRef++;.     
b7f0: 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20   REFINFO(pPg);. 
b800: 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 23     }.  }.#else.#
b810: 20 64 65 66 69 6e 65 20 70 61 67 65 5f 72 65 66   define page_ref
b820: 28 50 29 20 20 20 28 28 50 29 2d 3e 6e 52 65 66  (P)   ((P)->nRef
b830: 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66 28 50 29  ==0?_page_ref(P)
b840: 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e 52 65 66  :(void)(P)->nRef
b850: 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ++).#endif../*.*
b860: 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
b870: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
b880: 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54 68 65  for a page.  The
b890: 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72 20 69   input pointer i
b8a0: 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65  s.** a reference
b8b0: 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 61 74   to the page dat
b8c0: 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  a..*/.int sqlite
b8d0: 33 70 61 67 65 72 5f 72 65 66 28 76 6f 69 64 20  3pager_ref(void 
b8e0: 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
b8f0: 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
b900: 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
b910: 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
b920: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b930: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  K;.}../*.** Sync
b940: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
b950: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
b960: 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65  ake sure all the
b970: 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
b980: 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e  .** been written
b990: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
b9a0: 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65  have actually re
b9b0: 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63  ached the surfac
b9c0: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b  e of the.** disk
b9d0: 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66  .  It is not saf
b9e0: 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
b9f0: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
ba00: 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61 66 74  e file until aft
ba10: 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  er.** the journa
ba20: 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65  l has been synce
ba30: 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69 67 69  d.  If the origi
ba40: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69 73 20  nal database is 
ba50: 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72 65 0a  modified before.
ba60: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** the journal i
ba70: 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61 20 70  s synced and a p
ba80: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
ba90: 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e 63 65  urs, the unsynce
baa0: 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74  d journal.** dat
bab0: 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20  a would be lost 
bac0: 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62 65 20  and we would be 
bad0: 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65  unable to comple
bae0: 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68  tely rollback th
baf0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68  e.** database ch
bb00: 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61 73 65  anges.  Database
bb10: 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c   corruption woul
bb20: 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20  d occur..** .** 
bb30: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73  This routine als
bb40: 6f 20 75 70 64 61 74 65 73 20 74 68 65 20 6e 52  o updates the nR
bb50: 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20  ec field in the 
bb60: 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f  header of the jo
bb70: 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63  urnal..** (See c
bb80: 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70  omments on the p
bb90: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
bba0: 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69  routine for addi
bbb0: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
bbc0: 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20 73  on.).** If the s
bbd0: 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c  ync mode is FULL
bbe0: 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c  , two syncs will
bbf0: 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74 20 74   occur.  First t
bc00: 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c  he whole journal
bc10: 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c 20 74  .** is synced, t
bc20: 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65  hen the nRec fie
bc30: 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 74  ld is updated, t
bc40: 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73 79 6e  hen a second syn
bc50: 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  c occurs..**.** 
bc60: 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61  For temporary da
bc70: 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f 20 6e  tabases, we do n
bc80: 6f 74 20 63 61 72 65 20 69 66 20 77 65 20 61 72  ot care if we ar
bc90: 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61  e able to rollba
bca0: 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20 70 6f  ck.** after a po
bcb0: 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73 6f 20  wer failure, so 
bcc0: 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  sync occurs..**.
bcd0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
bce0: 63 6c 65 61 72 73 20 74 68 65 20 6e 65 65 64 53  clears the needS
bcf0: 79 6e 63 20 66 69 65 6c 64 20 6f 66 20 65 76 65  ync field of eve
bd00: 72 79 20 70 61 67 65 20 63 75 72 72 65 6e 74 20  ry page current 
bd10: 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72  held in.** memor
bd20: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
bd30: 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67   syncJournal(Pag
bd40: 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
bd50: 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
bd60: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
bd70: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
bd80: 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63  E_OK;..  /* Sync
bd90: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66   the journal bef
bda0: 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
bdb0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a  e main database.
bdc0: 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74    ** (assuming t
bdd0: 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61  here is a journa
bde0: 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74  l and it needs t
bdf0: 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20  o be synced.).  
be00: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
be10: 3e 6e 65 65 64 53 79 6e 63 20 7c 7c 20 7a 4d 61  >needSync || zMa
be20: 73 74 65 72 20 29 7b 0a 20 20 20 20 69 66 28 20  ster ){.    if( 
be30: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
be40: 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
be50: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
be60: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20  alOpen );.      
be70: 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50 61 67  /* assert( !pPag
be80: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20 2f 2f  er->noSync ); //
be90: 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20 62 65   noSync might be
bea0: 20 73 65 74 20 69 66 20 73 79 6e 63 68 72 6f 6e   set if synchron
beb0: 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 77 61 73  ous.      ** was
bec0: 20 74 75 72 6e 65 64 20 6f 66 66 20 61 66 74 65   turned off afte
bed0: 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  r the transactio
bee0: 6e 20 77 61 73 20 73 74 61 72 74 65 64 2e 20 20  n was started.  
bef0: 54 69 63 6b 65 74 20 23 36 31 35 20 2a 2f 0a 23  Ticket #615 */.#
bf00: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
bf10: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a      {.        /*
bf20: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 70   Make sure the p
bf30: 50 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f 75 6e  Pager->nRec coun
bf40: 74 65 72 20 77 65 20 61 72 65 20 6b 65 65 70 69  ter we are keepi
bf50: 6e 67 20 61 67 72 65 65 73 0a 20 20 20 20 20 20  ng agrees.      
bf60: 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 6e 52    ** with the nR
bf70: 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d  ec computed from
bf80: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
bf90: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
bfa0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
bfb0: 20 20 6f 66 66 5f 74 20 68 64 72 53 7a 2c 20 70    off_t hdrSz, p
bfc0: 67 53 7a 2c 20 6a 53 7a 3b 0a 20 20 20 20 20 20  gSz, jSz;.      
bfd0: 20 20 68 64 72 53 7a 20 3d 20 4a 4f 55 52 4e 41    hdrSz = JOURNA
bfe0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
bff0: 3b 0a 20 20 20 20 20 20 20 20 70 67 53 7a 20 3d  ;.        pgSz =
c000: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
c010: 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
c020: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
c030: 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e  leSize(&pPager->
c040: 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a 20 20 20 20  jfd, &jSz);.    
c050: 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20      if( rc!=0 ) 
c060: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
c070: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
c080: 72 2d 3e 6e 52 65 63 2a 70 67 53 7a 2b 68 64 72  r->nRec*pgSz+hdr
c090: 53 7a 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20  Sz==jSz );.     
c0a0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
c0b0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  {.        /* Wri
c0c0: 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  te the nRec valu
c0d0: 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
c0e0: 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 20 2a  al file header *
c0f0: 2f 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20  /.        off_t 
c100: 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 69 66 28  szJ;.        if(
c110: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
c120: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  c ){.          T
c130: 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72  RACE2("SYNC jour
c140: 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50  nal of %d\n", pP
c150: 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20  ager->fd.h);.   
c160: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
c170: 74 65 33 4f 73 53 79 6e 63 28 26 70 50 61 67 65  te3OsSync(&pPage
c180: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
c190: 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72     if( rc!=0 ) r
c1a0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
c1b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
c1c0: 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65  te3OsSeek(&pPage
c1d0: 72 2d 3e 6a 66 64 2c 20 73 69 7a 65 6f 66 28 61  r->jfd, sizeof(a
c1e0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
c1f0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
c200: 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72  te32bits(&pPager
c210: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e  ->jfd, pPager->n
c220: 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Rec);.        if
c230: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
c240: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72  ;..        /* Wr
c250: 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ite the name of 
c260: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
c270: 61 6c 20 66 69 6c 65 20 69 66 20 6f 6e 65 20 69  al file if one i
c280: 73 20 73 70 65 63 69 66 69 65 64 20 2a 2f 0a 20  s specified */. 
c290: 20 20 20 20 20 20 20 69 66 28 20 7a 4d 61 73 74         if( zMast
c2a0: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  er ){.          
c2b0: 61 73 73 65 72 74 28 20 73 74 72 6c 65 6e 28 7a  assert( strlen(z
c2c0: 4d 61 73 74 65 72 29 3c 70 50 61 67 65 72 2d 3e  Master)<pPager->
c2d0: 6e 4d 61 73 74 65 72 20 29 3b 0a 20 20 20 20 20  nMaster );.     
c2e0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
c2f0: 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
c300: 3e 6a 66 64 2c 20 32 30 29 3b 0a 20 20 20 20 20  >jfd, 20);.     
c310: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
c320: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
c330: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
c340: 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
c350: 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 73 74  jfd, zMaster, st
c360: 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29 2b 31 29  rlen(zMaster)+1)
c370: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
c380: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
c390: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
c3a0: 20 20 20 73 7a 4a 20 3d 20 4a 4f 55 52 4e 41 4c     szJ = JOURNAL
c3b0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
c3c0: 2b 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2a  +  pPager->nRec*
c3d0: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
c3e0: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 73  ager);.        s
c3f0: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50  qlite3OsSeek(&pP
c400: 61 67 65 72 2d 3e 6a 66 64 2c 20 73 7a 4a 29 3b  ager->jfd, szJ);
c410: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54  .      }.      T
c420: 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72  RACE2("SYNC jour
c430: 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50  nal of %d\n", pP
c440: 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20  ager->fd.h);.   
c450: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
c460: 73 53 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a  sSync(&pPager->j
c470: 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  fd);.      if( r
c480: 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
c490: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
c4a0: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
c4b0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50   1;.    }.    pP
c4c0: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
c4d0: 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73   0;..    /* Eras
c4e0: 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66  e the needSync f
c4f0: 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79 20 70  lag from every p
c500: 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
c510: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
c520: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
c530: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
c540: 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
c550: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  nc = 0;.    }.  
c560: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
c570: 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d  Synced = pPager-
c580: 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 23 69  >pFirst;.  }..#i
c590: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f  fndef NDEBUG.  /
c5a0: 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e  * If the Pager.n
c5b0: 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
c5c0: 63 6c 65 61 72 20 74 68 65 6e 20 74 68 65 20 50  clear then the P
c5d0: 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20  gHdr.needSync.  
c5e0: 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20 61 6c 73  ** flag must als
c5f0: 6f 20 62 65 20 63 6c 65 61 72 20 66 6f 72 20 61  o be clear for a
c600: 6c 6c 20 70 61 67 65 73 2e 20 20 56 65 72 69 66  ll pages.  Verif
c610: 79 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a  y that this.  **
c620: 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 74 72   invariant is tr
c630: 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b  ue..  */.  else{
c640: 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
c650: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
c660: 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
c670: 6c 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l){.      assert
c680: 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d  ( pPg->needSync=
c690: 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  =0 );.    }.    
c6a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
c6b0: 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 70 50  pFirstSynced==pP
c6c0: 61 67 65 72 2d 3e 70 46 69 72 73 74 20 29 3b 0a  ager->pFirst );.
c6d0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
c6e0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
c6f0: 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f  * Given a list o
c700: 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74  f pages (connect
c710: 65 64 20 62 79 20 74 68 65 20 50 67 48 64 72 2e  ed by the PgHdr.
c720: 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20  pDirty pointer) 
c730: 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f  write.** every o
c740: 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65  ne of those page
c750: 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  s out to the dat
c760: 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d  abase file and m
c770: 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20  ark them all.** 
c780: 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61  as clean..*/.sta
c790: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
c7a0: 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48  ite_pagelist(PgH
c7b0: 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61  dr *pList){.  Pa
c7c0: 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69  ger *pPager;.  i
c7d0: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 75 73  nt rc;.  int bus
c7e0: 79 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 70 4c  y = 1;..  if( pL
c7f0: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
c800: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61  SQLITE_OK;.  pPa
c810: 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61  ger = pList->pPa
c820: 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68  ger;..  /* At th
c830: 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d  is point there m
c840: 61 79 20 62 65 20 65 69 74 68 65 72 20 61 20 52  ay be either a R
c850: 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
c860: 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
c870: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
c880: 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
c890: 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c   already an EXCL
c8a0: 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20  USIVE lock, the 
c8b0: 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63  following.  ** c
c8c0: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f  alls to sqlite3O
c8d0: 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f  sLock() are no-o
c8e0: 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f  ps..  **.  ** Mo
c8f0: 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72  ving the lock fr
c900: 6f 6d 20 52 45 53 45 52 56 45 44 20 74 6f 20 45  om RESERVED to E
c910: 58 43 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c  XCLUSIVE actuall
c920: 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67  y involves going
c930: 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e  .  ** through an
c940: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
c950: 61 74 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41  ate PENDING.   A
c960: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72   PENDING lock pr
c970: 65 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20  events new.  ** 
c980: 72 65 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74  readers from att
c990: 61 63 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61  aching to the da
c9a0: 74 61 62 61 73 65 20 62 75 74 20 69 73 20 75 6e  tabase but is un
c9b0: 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75  sufficient for u
c9c0: 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e  s to.  ** write.
c9d0: 20 20 54 68 65 20 69 64 65 61 20 6f 66 20 61 20    The idea of a 
c9e0: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
c9f0: 74 6f 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72  to prevent new r
ca00: 65 61 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a  eaders from.  **
ca10: 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65   coming in while
ca20: 20 77 65 20 77 61 69 74 20 66 6f 72 20 65 78 69   we wait for exi
ca30: 73 74 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f  sting readers to
ca40: 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a   clear..  **.  *
ca50: 2a 20 57 68 69 6c 65 20 74 68 65 20 70 61 67 65  * While the page
ca60: 72 20 69 73 20 69 6e 20 74 68 65 20 52 45 53 45  r is in the RESE
ca70: 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 20  RVED state, the 
ca80: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
ca90: 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75  e file.  ** is u
caa0: 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20  nchanged and we 
cab0: 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74  can rollback wit
cac0: 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70  hout having to p
cad0: 6c 61 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a  layback the.  **
cae0: 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68   journal into th
caf0: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
cb00: 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20  ase file.  Once 
cb10: 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f  we transition to
cb20: 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c  .  ** EXCLUSIVE,
cb30: 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61   it means the da
cb40: 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
cb50: 62 65 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64  been changed and
cb60: 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20   any rollback.  
cb70: 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  ** will require 
cb80: 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61  a journal playba
cb90: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a  ck..  */.  do {.
cba0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
cbb0: 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  OsLock(&pPager->
cbc0: 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  fd, EXCLUSIVE_LO
cbd0: 43 4b 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72  CK);.  }while( r
cbe0: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
cbf0: 26 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  & .      pPager-
cc00: 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 26 26  >pBusyHandler &&
cc10: 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e   .      pPager->
cc20: 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46  pBusyHandler->xF
cc30: 75 6e 63 20 26 26 20 0a 20 20 20 20 20 20 70 50  unc && .      pP
cc40: 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
cc50: 65 72 2d 3e 78 46 75 6e 63 28 70 50 61 67 65 72  er->xFunc(pPager
cc60: 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e  ->pBusyHandler->
cc70: 70 41 72 67 2c 20 22 22 2c 20 62 75 73 79 2b 2b  pArg, "", busy++
cc80: 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21  ).  );.  if( rc!
cc90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
cca0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
ccb0: 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  .  pPager->state
ccc0: 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
ccd0: 56 45 3b 0a 0a 20 20 77 68 69 6c 65 28 20 70 4c  VE;..  while( pL
cce0: 69 73 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ist ){.    asser
ccf0: 74 28 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20  t( pList->dirty 
cd00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
cd10: 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Seek(&pPager->fd
cd20: 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31  , (pList->pgno-1
cd30: 29 2a 28 6f 66 66 5f 74 29 53 51 4c 49 54 45 5f  )*(off_t)SQLITE_
cd40: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
cd50: 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 50 47  CODEC(pPager, PG
cd60: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73  HDR_TO_DATA(pLis
cd70: 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c  t), pList->pgno,
cd80: 20 36 29 3b 0a 20 20 20 20 54 52 41 43 45 32 28   6);.    TRACE2(
cd90: 22 53 54 4f 52 45 20 70 61 67 65 20 25 64 5c 6e  "STORE page %d\n
cda0: 22 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b  ", pList->pgno);
cdb0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
cdc0: 33 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72  3OsWrite(&pPager
cdd0: 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ->fd, PGHDR_TO_D
cde0: 41 54 41 28 70 4c 69 73 74 29 2c 20 53 51 4c 49  ATA(pList), SQLI
cdf0: 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  TE_PAGE_SIZE);. 
ce00: 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
ce10: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
ce20: 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67  List), pList->pg
ce30: 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  no, 0);.    if( 
ce40: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
ce50: 20 20 20 20 70 4c 69 73 74 2d 3e 64 69 72 74 79      pList->dirty
ce60: 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 20   = 0;.    pList 
ce70: 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
ce80: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
ce90: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
cea0: 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65 72 79 20  * Collect every 
ceb0: 64 69 72 74 79 20 70 61 67 65 20 69 6e 74 6f 20  dirty page into 
cec0: 61 20 64 69 72 74 79 20 6c 69 73 74 20 61 6e 64  a dirty list and
ced0: 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70 6f 69  .** return a poi
cee0: 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64  nter to the head
cef0: 20 6f 66 20 74 68 61 74 20 6c 69 73 74 2e 20 20   of that list.  
cf00: 41 6c 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a  All pages are.**
cf10: 20 63 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e 20   collected even 
cf20: 69 66 20 74 68 65 79 20 61 72 65 20 73 74 69 6c  if they are stil
cf30: 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  l in use..*/.sta
cf40: 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
cf50: 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70  _get_all_dirty_p
cf60: 61 67 65 73 28 50 61 67 65 72 20 2a 70 50 61 67  ages(Pager *pPag
cf70: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 2c  er){.  PgHdr *p,
cf80: 20 2a 70 4c 69 73 74 3b 0a 20 20 70 4c 69 73 74   *pList;.  pList
cf90: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 50   = 0;.  for(p=pP
cfa0: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70  ager->pAll; p; p
cfb0: 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  =p->pNextAll){. 
cfc0: 20 20 20 69 66 28 20 70 2d 3e 64 69 72 74 79 20     if( p->dirty 
cfd0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 44 69 72  ){.      p->pDir
cfe0: 74 79 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  ty = pList;.    
cff0: 20 20 70 4c 69 73 74 20 3d 20 70 3b 0a 20 20 20    pList = p;.   
d000: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
d010: 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
d020: 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a  Acquire a page..
d030: 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63  **.** A read loc
d040: 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  k on the disk fi
d050: 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77  le is obtained w
d060: 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61  hen the first pa
d070: 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20  ge is acquired. 
d080: 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f  .** This read lo
d090: 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68  ck is dropped wh
d0a0: 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  en the last page
d0b0: 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a   is released..**
d0c0: 0a 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b 73  .** A _get works
d0d0: 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75   for any page nu
d0e0: 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
d0f0: 6e 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74  n 0.  If the dat
d100: 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73  abase.** file is
d110: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
d120: 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
d130: 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c  , then no actual
d140: 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63   disk.** read oc
d150: 63 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d  curs and the mem
d160: 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65  ory image of the
d170: 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c   page is initial
d180: 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a  ized to.** all z
d190: 65 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61  eros.  The extra
d1a0: 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74   data appended t
d1b0: 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61  o a page is alwa
d1c0: 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a  ys initialized.*
d1d0: 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66  * to zeros the f
d1e0: 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65  irst time a page
d1f0: 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   is loaded into 
d200: 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  memory..**.** Th
d210: 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69  e acquisition mi
d220: 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76  ght fail for sev
d230: 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49  eral reasons.  I
d240: 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20  n all cases,.** 
d250: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
d260: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
d270: 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
d280: 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
d290: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
d2a0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f   sqlite3pager_lo
d2b0: 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68  okup().  Both th
d2c0: 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f  is routine and _
d2d0: 6c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74  lookup() attempt
d2e0: 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61  .** to find a pa
d2f0: 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  ge in the in-mem
d300: 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e  ory cache first.
d310: 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73    If the page is
d320: 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20   not already.** 
d330: 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20  in memory, this 
d340: 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20  routine goes to 
d350: 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20  disk to read it 
d360: 69 6e 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b  in whereas _look
d370: 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74  up().** just ret
d380: 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f  urns 0.  This ro
d390: 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61  utine acquires a
d3a0: 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66   read-lock the f
d3b0: 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20  irst time it.** 
d3c0: 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73  has to go to dis
d3d0: 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73  k, and could als
d3e0: 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c  o playback an ol
d3f0: 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  d journal if nec
d400: 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65  essary..** Since
d410: 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72   _lookup() never
d420: 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69   goes to disk, i
d430: 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64  t never has to d
d440: 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a  eal with locks.*
d450: 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  * or journal fil
d460: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
d470: 65 33 70 61 67 65 72 5f 67 65 74 28 50 61 67 65  e3pager_get(Page
d480: 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
d490: 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50  pgno, void **ppP
d4a0: 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  age){.  PgHdr *p
d4b0: 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  Pg;.  int rc;.. 
d4c0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65   /* Make sure we
d4d0: 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e   have not hit an
d4e0: 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72  y critical error
d4f0: 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72  s..  */ .  asser
d500: 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
d510: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
d520: 30 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d  0 );.  *ppPage =
d530: 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   0;.  if( pPager
d540: 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41  ->errMask & ~(PA
d550: 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b  GER_ERR_FULL) ){
d560: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65  .    return page
d570: 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72  r_errcode(pPager
d580: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
d590: 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
d5a0: 74 20 70 61 67 65 20 61 63 63 65 73 73 65 64 2c  t page accessed,
d5b0: 20 74 68 65 6e 20 67 65 74 20 61 20 53 48 41 52   then get a SHAR
d5c0: 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20  ED lock.  ** on 
d5d0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
d5e0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
d5f0: 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26  ager->nRef==0 &&
d600: 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
d610: 29 7b 0a 20 20 20 20 69 6e 74 20 62 75 73 79 20  ){.    int busy 
d620: 3d 20 31 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  = 1;.    do {.  
d630: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d640: 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  OsLock(&pPager->
d650: 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  fd, SHARED_LOCK)
d660: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63  ;.    }while( rc
d670: 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
d680: 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72   .        pPager
d690: 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 26  ->pBusyHandler &
d6a0: 26 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  & .        pPage
d6b0: 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d  r->pBusyHandler-
d6c0: 3e 78 46 75 6e 63 20 26 26 20 0a 20 20 20 20 20  >xFunc && .     
d6d0: 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79     pPager->pBusy
d6e0: 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 28 70  Handler->xFunc(p
d6f0: 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
d700: 6c 65 72 2d 3e 70 41 72 67 2c 20 22 22 2c 20 62  ler->pArg, "", b
d710: 75 73 79 2b 2b 29 0a 20 20 20 20 29 3b 0a 20 20  usy++).    );.  
d720: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d730: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
d740: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
d750: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
d760: 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
d770: 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75  .    /* If a jou
d780: 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
d790: 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e  , and there is n
d7a0: 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  o RESERVED lock 
d7b0: 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  on the.    ** da
d7c0: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
d7d0: 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64  n it either need
d7e0: 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62  s to be played b
d7f0: 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a  ack or deleted..
d800: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
d810: 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
d820: 6c 20 26 26 20 0a 20 20 20 20 20 20 20 20 73 71  l && .        sq
d830: 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74  lite3OsFileExist
d840: 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  s(pPager->zJourn
d850: 61 6c 29 20 26 26 0a 20 20 20 20 20 20 20 20 21  al) &&.        !
d860: 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65  sqlite3OsCheckRe
d870: 73 65 72 76 65 64 4c 6f 63 6b 28 26 70 50 61 67  servedLock(&pPag
d880: 65 72 2d 3e 66 64 29 20 0a 20 20 20 20 29 7b 0a  er->fd) .    ){.
d890: 20 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a         int rc;..
d8a0: 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e         /* Get an
d8b0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
d8c0: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
d8d0: 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  file. */.       
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 20 20 20 20 20 69 66 28 20 72 63 21 3d  .       if( rc!=
d920: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d930: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
d940: 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  nlock(&pPager->f
d950: 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
d960: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
d970: 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
d980: 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74  CK;.         ret
d990: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 7d  urn rc;.       }
d9a0: 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
d9b0: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58  state = PAGER_EX
d9c0: 43 4c 55 53 49 56 45 3b 0a 0a 20 20 20 20 20 20  CLUSIVE;..      
d9d0: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75   /* Open the jou
d9e0: 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e 67  rnal for reading
d9f0: 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 53   only.  Return S
da00: 51 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20 20  QLITE_BUSY if.  
da10: 20 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20 75       ** we are u
da20: 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68  nable to open th
da30: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
da40: 0a 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  .       **.     
da50: 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c    ** The journal
da60: 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e   file does not n
da70: 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  eed to be locked
da80: 20 69 74 73 65 6c 66 2e 20 20 54 68 65 0a 20 20   itself.  The.  
da90: 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
daa0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 70  file is never op
dab0: 65 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 61  en unless the ma
dac0: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
dad0: 20 68 6f 6c 64 73 0a 20 20 20 20 20 20 20 2a 2a   holds.       **
dae0: 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73   a write lock, s
daf0: 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76 65 72  o there is never
db00: 20 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20 74   any chance of t
db10: 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20  wo or more.     
db20: 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 73 20 6f    ** processes o
db30: 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  pening the journ
db40: 61 6c 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  al at the same t
db50: 69 6d 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20  ime..       */. 
db60: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
db70: 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79  e3OsOpenReadOnly
db80: 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
db90: 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  l, &pPager->jfd)
dba0: 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63 21  ;.       if( rc!
dbb0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
dbc0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
dbd0: 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  Unlock(&pPager->
dbe0: 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
dbf0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
dc00: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
dc10: 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 72 65  OCK;.         re
dc20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
dc30: 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ;.       }.     
dc40: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
dc50: 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20  lOpen = 1;.     
dc60: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
dc70: 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 0a 20  lStarted = 0;.. 
dc80: 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63        /* Playbac
dc90: 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
dca0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20   journal.  Drop 
dcb0: 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69  the database wri
dcc0: 74 65 0a 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63  te.       ** loc
dcd0: 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20  k and reacquire 
dce0: 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20  the read lock.. 
dcf0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
dd00: 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
dd10: 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
dd20: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
dd30: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
dd40: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
dd50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20         }.    }. 
dd60: 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65     pPg = 0;.  }e
dd70: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72  lse{.    /* Sear
dd80: 63 68 20 66 6f 72 20 70 61 67 65 20 69 6e 20 63  ch for page in c
dd90: 61 63 68 65 20 2a 2f 0a 20 20 20 20 70 50 67 20  ache */.    pPg 
dda0: 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
ddb0: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
ddc0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65    if( pPager->me
ddd0: 6d 44 62 20 26 26 20 70 50 61 67 65 72 2d 3e 73  mDb && pPager->s
dde0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
ddf0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  CK ){.      pPag
de00: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
de10: 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a  R_SHARED;.    }.
de20: 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30    }.  if( pPg==0
de30: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72   ){.    /* The r
de40: 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
de50: 20 6e 6f 74 20 69 6e 20 74 68 65 20 70 61 67 65   not in the page
de60: 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69   cache. */.    i
de70: 6e 74 20 68 3b 0a 20 20 20 20 70 50 61 67 65 72  nt h;.    pPager
de80: 2d 3e 6e 4d 69 73 73 2b 2b 3b 0a 20 20 20 20 69  ->nMiss++;.    i
de90: 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  f( pPager->nPage
dea0: 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20  <pPager->mxPage 
deb0: 7c 7c 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  || pPager->pFirs
dec0: 74 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  t==0 || pPager->
ded0: 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 2f  memDb ){.      /
dee0: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70  * Create a new p
def0: 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 70 50 67  age */.      pPg
df00: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
df10: 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 50 67 29  aw( sizeof(*pPg)
df20: 20 2b 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53   + SQLITE_PAGE_S
df30: 49 5a 45 20 0a 20 20 20 20 20 20 20 20 20 20 20  IZE .           
df40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df50: 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29     + sizeof(u32)
df60: 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72   + pPager->nExtr
df70: 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a.              
df80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df90: 2b 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 2a  + pPager->memDb*
dfa0: 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79  sizeof(PgHistory
dfb0: 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
dfc0: 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Pg==0 ){.       
dfd0: 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
dfe0: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
dff0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
e000: 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
e010: 5f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 72 65  _MEM;.        re
e020: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
e030: 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
e040: 20 6d 65 6d 73 65 74 28 70 50 67 2c 20 30 2c 20   memset(pPg, 0, 
e050: 73 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b 0a 20  sizeof(*pPg));. 
e060: 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
e070: 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20  >memDb ){.      
e080: 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
e090: 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
e0a0: 65 72 29 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50  er), 0, sizeof(P
e0b0: 67 48 69 73 74 6f 72 79 29 29 3b 0a 20 20 20 20  gHistory));.    
e0c0: 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70    }.      pPg->p
e0d0: 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
e0e0: 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
e0f0: 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41  All = pPager->pA
e100: 6c 6c 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ll;.      pPager
e110: 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20  ->pAll = pPg;.  
e120: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67      pPager->nPag
e130: 65 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  e++;.    }else{.
e140: 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 20        /* Find a 
e150: 70 61 67 65 20 74 6f 20 72 65 63 79 63 6c 65 2e  page to recycle.
e160: 20 20 54 72 79 20 74 6f 20 6c 6f 63 61 74 65 20    Try to locate 
e170: 61 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  a page that does
e180: 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 72 65   not.      ** re
e190: 71 75 69 72 65 20 75 73 20 74 6f 20 64 6f 20 61  quire us to do a
e1a0: 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20 74 68 65  n fsync() on the
e1b0: 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20 20   journal..      
e1c0: 2a 2f 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70  */.      pPg = p
e1d0: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
e1e0: 63 65 64 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ced;..      /* I
e1f0: 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20 66  f we could not f
e200: 69 6e 64 20 61 20 70 61 67 65 20 74 68 61 74 20  ind a page that 
e210: 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65  does not require
e220: 20 61 6e 20 66 73 79 6e 63 28 29 0a 20 20 20 20   an fsync().    
e230: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72    ** on the jour
e240: 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 66 73  nal file then fs
e250: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
e260: 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20 61  file.  This is a
e270: 0a 20 20 20 20 20 20 2a 2a 20 76 65 72 79 20 73  .      ** very s
e280: 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73  low operation, s
e290: 6f 20 77 65 20 77 6f 72 6b 20 68 61 72 64 20 74  o we work hard t
e2a0: 6f 20 61 76 6f 69 64 20 69 74 2e 20 20 42 75 74  o avoid it.  But
e2b0: 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20 20 20 20   sometimes.     
e2c0: 20 2a 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20   ** it can't be 
e2d0: 68 65 6c 70 65 64 2e 0a 20 20 20 20 20 20 2a 2f  helped..      */
e2e0: 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d  .      if( pPg==
e2f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
e300: 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
e310: 6c 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  l(pPager, 0);.  
e320: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
e330: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
e340: 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
e350: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
e360: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
e370: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20  ITE_IOERR;.     
e380: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 67     }.        pPg
e390: 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73   = pPager->pFirs
e3a0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
e3b0: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
e3c0: 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  ef==0 );..      
e3d0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67  /* Write the pag
e3e0: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
e3f0: 65 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20  e file if it is 
e400: 64 69 72 74 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  dirty..      */.
e410: 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 64        if( pPg->d
e420: 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20  irty ){.        
e430: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65  assert( pPg->nee
e440: 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  dSync==0 );.    
e450: 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20      pPg->pDirty 
e460: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
e470: 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
e480: 67 65 6c 69 73 74 28 20 70 50 67 20 29 3b 0a 20  gelist( pPg );. 
e490: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
e4a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e4b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67        sqlite3pag
e4c0: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
e4d0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  er);.          r
e4e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
e4f0: 52 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  RR;.        }.  
e500: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
e510: 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d  rt( pPg->dirty==
e520: 30 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  0 );..      /* I
e530: 66 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  f the page we ar
e540: 65 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20 6d  e recycling is m
e550: 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52  arked as alwaysR
e560: 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20  ollback, then.  
e570: 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 67      ** set the g
e580: 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c  lobal alwaysRoll
e590: 62 61 63 6b 20 66 6c 61 67 2c 20 74 68 75 73 20  back flag, thus 
e5a0: 64 69 73 61 62 6c 69 6e 67 20 74 68 65 0a 20 20  disabling the.  
e5b0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 64 6f      ** sqlite_do
e5c0: 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 6f 70  nt_rollback() op
e5d0: 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74  timization for t
e5e0: 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20  he rest of this 
e5f0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
e600: 20 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 63 65     ** It is nece
e610: 73 73 61 72 79 20 74 6f 20 64 6f 20 74 68 69 73  ssary to do this
e620: 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67   because the pag
e630: 65 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52  e marked alwaysR
e640: 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 20 20 2a 2a  ollback.      **
e650: 20 6d 69 67 68 74 20 62 65 20 72 65 6c 6f 61 64   might be reload
e660: 65 64 20 61 74 20 61 20 6c 61 74 65 72 20 74 69  ed at a later ti
e670: 6d 65 20 62 75 74 20 61 74 20 74 68 61 74 20 70  me but at that p
e680: 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74 20 72 65  oint we won't re
e690: 6d 65 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20  member.      ** 
e6a0: 74 68 61 74 20 69 73 20 77 61 73 20 6d 61 72 6b  that is was mark
e6b0: 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ed alwaysRollbac
e6c0: 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74  k.  This means t
e6d0: 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 6d 75  hat all pages mu
e6e0: 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 6d  st.      ** be m
e6f0: 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52  arked as alwaysR
e700: 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65 72  ollback from her
e710: 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 20 20 20 20  e on out..      
e720: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 67  */.      if( pPg
e730: 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
e740: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
e750: 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
e760: 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ck = 1;.      }.
e770: 0a 20 20 20 20 20 20 2f 2a 20 55 6e 6c 69 6e 6b  .      /* Unlink
e780: 20 74 68 65 20 6f 6c 64 20 70 61 67 65 20 66 72   the old page fr
e790: 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  om the free list
e7a0: 20 61 6e 64 20 74 68 65 20 68 61 73 68 20 74 61   and the hash ta
e7b0: 62 6c 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ble.      */.   
e7c0: 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50     unlinkPage(pP
e7d0: 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  g);.      pPager
e7e0: 2d 3e 6e 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 7d  ->nOvfl++;.    }
e7f0: 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d  .    pPg->pgno =
e800: 20 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70   pgno;.    if( p
e810: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
e820: 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d  l && (int)pgno<=
e830: 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
e840: 7a 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ze ){.      sqli
e850: 74 65 33 43 68 65 63 6b 4d 65 6d 6f 72 79 28 70  te3CheckMemory(p
e860: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
e870: 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20 20 20 20  l, pgno/8);.    
e880: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
e890: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
e8a0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
e8b0: 75 72 6e 61 6c 20 3d 20 28 70 50 61 67 65 72 2d  urnal = (pPager-
e8c0: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f  >aInJournal[pgno
e8d0: 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26  /8] & (1<<(pgno&
e8e0: 37 29 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 70  7)))!=0;.      p
e8f0: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
e900: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
e910: 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
e920: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  l = 0;.      pPg
e930: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
e940: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
e950: 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 26 26  ager->aInStmt &&
e960: 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67   (int)pgno<=pPag
e970: 65 72 2d 3e 73 74 6d 74 53 69 7a 65 0a 20 20 20  er->stmtSize.   
e980: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50            && (pP
e990: 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 67  ager->aInStmt[pg
e9a0: 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e  no/8] & (1<<(pgn
e9b0: 6f 26 37 29 29 29 21 3d 30 20 29 7b 0a 20 20 20  o&7)))!=0 ){.   
e9c0: 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73     page_add_to_s
e9d0: 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  tmt_list(pPg);. 
e9e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e9f0: 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d  page_remove_from
ea00: 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b  _stmt_list(pPg);
ea10: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
ea20: 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70  dirty = 0;.    p
ea30: 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  Pg->nRef = 1;.  
ea40: 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
ea50: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66      pPager->nRef
ea60: 2b 2b 3b 0a 20 20 20 20 68 20 3d 20 70 61 67 65  ++;.    h = page
ea70: 72 5f 68 61 73 68 28 70 67 6e 6f 29 3b 0a 20 20  r_hash(pgno);.  
ea80: 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
ea90: 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68   = pPager->aHash
eaa0: 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  [h];.    pPager-
eab0: 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b  >aHash[h] = pPg;
eac0: 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e  .    if( pPg->pN
ead0: 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20  extHash ){.     
eae0: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e   assert( pPg->pN
eaf0: 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61  extHash->pPrevHa
eb00: 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  sh==0 );.      p
eb10: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
eb20: 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a  PrevHash = pPg;.
eb30: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
eb40: 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29  ager->nExtra>0 )
eb50: 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50  {.      memset(P
eb60: 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50  GHDR_TO_EXTRA(pP
eb70: 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e  g), 0, pPager->n
eb80: 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20  Extra);.    }.  
eb90: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
eba0: 53 69 7a 65 3c 30 20 29 20 73 71 6c 69 74 65 33  Size<0 ) sqlite3
ebb0: 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
ebc0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
ebd0: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
ebe0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
ebf0: 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
ec00: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
ec10: 67 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  g));.      rc = 
ec20: 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
ec30: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ager);.      ret
ec40: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
ec50: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
ec60: 53 69 7a 65 3c 28 69 6e 74 29 70 67 6e 6f 20 29  Size<(int)pgno )
ec70: 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50  {.      memset(P
ec80: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
ec90: 29 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50 41 47  ), 0, SQLITE_PAG
eca0: 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 65 6c  E_SIZE);.    }el
ecb0: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  se{.      int rc
ecc0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
ecd0: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30  pPager->memDb==0
ece0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
ecf0: 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
ed00: 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 6f  >fd, (pgno-1)*(o
ed10: 66 66 5f 74 29 53 51 4c 49 54 45 5f 50 41 47 45  ff_t)SQLITE_PAGE
ed20: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 72 63  _SIZE);.      rc
ed30: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
ed40: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47  (&pPager->fd, PG
ed50: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
ed60: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
ed70: 5a 45 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45  ZE);.      TRACE
ed80: 32 28 22 46 45 54 43 48 20 70 61 67 65 20 25 64  2("FETCH page %d
ed90: 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  \n", pPg->pgno);
eda0: 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61  .      CODEC(pPa
edb0: 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  ger, PGHDR_TO_DA
edc0: 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70 67  TA(pPg), pPg->pg
edd0: 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20 69 66  no, 3);.      if
ede0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
edf0: 29 7b 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74  ){.        off_t
ee00: 20 66 69 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20   fileSize;.     
ee10: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73     if( sqlite3Os
ee20: 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72  FileSize(&pPager
ee30: 2d 3e 66 64 2c 26 66 69 6c 65 53 69 7a 65 29 21  ->fd,&fileSize)!
ee40: 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20  =SQLITE_OK.     
ee50: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 66 69 6c            || fil
ee60: 65 53 69 7a 65 3e 3d 70 67 6e 6f 2a 53 51 4c 49  eSize>=pgno*SQLI
ee70: 54 45 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a  TE_PAGE_SIZE ){.
ee80: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ee90: 33 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47 48  3pager_unref(PGH
eea0: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29  DR_TO_DATA(pPg))
eeb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
eec0: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
eed0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
eee0: 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
eef0: 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 53 51  DATA(pPg), 0, SQ
ef00: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
ef10: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ef20: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
ef30: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
ef40: 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 69  uested page is i
ef50: 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
ef60: 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d  . */.    pPager-
ef70: 3e 6e 48 69 74 2b 2b 3b 0a 20 20 20 20 70 61 67  >nHit++;.    pag
ef80: 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a  e_ref(pPg);.  }.
ef90: 20 20 2a 70 70 50 61 67 65 20 3d 20 50 47 48 44    *ppPage = PGHD
efa0: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a  R_TO_DATA(pPg);.
efb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
efc0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  OK;.}../*.** Acq
efd0: 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69  uire a page if i
efe0: 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
eff0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
f000: 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20  che.  Do.** not 
f010: 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72  read the page fr
f020: 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e  om disk.  Return
f030: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
f040: 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20  e page,.** or 0 
f050: 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
f060: 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a  ot in cache..**.
f070: 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
f080: 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 2e 20  te3pager_get(). 
f090: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
f0a0: 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
f0b0: 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  tine.** and sqli
f0c0: 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 20 69  te3pager_get() i
f0d0: 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69  s that _get() wi
f0e0: 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ll go to the dis
f0f0: 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e  k and read.** in
f100: 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65   the page if the
f110: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
f120: 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20  eady in cache.  
f130: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
f140: 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20  returns NULL if 
f150: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
f160: 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61  in cache or if a
f170: 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20   disk I/O error 
f180: 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70  .** has ever hap
f190: 70 65 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  pened..*/.void *
f1a0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f  sqlite3pager_loo
f1b0: 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
f1c0: 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
f1d0: 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
f1e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
f1f0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
f200: 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  gno!=0 );.  if( 
f210: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
f220: 26 20 7e 28 50 41 47 45 52 5f 45 52 52 5f 46 55  & ~(PAGER_ERR_FU
f230: 4c 4c 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LL) ){.    retur
f240: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d  n 0;.  }.  pPg =
f250: 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
f260: 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
f270: 66 28 20 70 50 67 3d 3d 30 20 29 20 72 65 74 75  f( pPg==0 ) retu
f280: 72 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72 65 66  rn 0;.  page_ref
f290: 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pPg);.  return 
f2a0: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
f2b0: 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  g);.}../*.** Rel
f2c0: 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  ease a page..**.
f2d0: 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
f2e0: 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
f2f0: 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20  o the page drop 
f300: 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  to zero, then th
f310: 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64  e.** page is add
f320: 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69  ed to the LRU li
f330: 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65  st.  When all re
f340: 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20  ferences to all 
f350: 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c  pages.** are rel
f360: 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63  eased, a rollbac
f370: 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  k occurs and the
f380: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
f390: 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f  abase is.** remo
f3a0: 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ved..*/.int sqli
f3b0: 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 76  te3pager_unref(v
f3c0: 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
f3d0: 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a  gHdr *pPg;..  /*
f3e0: 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Decrement the r
f3f0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
f400: 6f 72 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a  or this page.  *
f410: 2f 0a 20 20 70 50 67 20 3d 20 44 41 54 41 5f 54  /.  pPg = DATA_T
f420: 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
f430: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
f440: 52 65 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d 3e  Ref>0 );.  pPg->
f450: 6e 52 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46  nRef--;.  REFINF
f460: 4f 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68  O(pPg);..  /* Wh
f470: 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
f480: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
f490: 20 70 61 67 65 20 72 65 61 63 68 20 30 2c 20 63   page reach 0, c
f4a0: 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65 73  all the.  ** des
f4b0: 74 72 75 63 74 6f 72 20 61 6e 64 20 61 64 64 20  tructor and add 
f4c0: 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
f4d0: 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  freelist..  */. 
f4e0: 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
f4f0: 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a  0 ){.    Pager *
f500: 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 61 67  pPager;.    pPag
f510: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
f520: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
f530: 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  Free = 0;.    pP
f540: 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70  g->pPrevFree = p
f550: 50 61 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20 20  Pager->pLast;.  
f560: 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20    pPager->pLast 
f570: 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70  = pPg;.    if( p
f580: 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b  Pg->pPrevFree ){
f590: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65  .      pPg->pPre
f5a0: 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65  vFree->pNextFree
f5b0: 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c 73   = pPg;.    }els
f5c0: 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e{.      pPager-
f5d0: 3e 70 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20  >pFirst = pPg;. 
f5e0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67     }.    if( pPg
f5f0: 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 26 26  ->needSync==0 &&
f600: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
f610: 79 6e 63 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ynced==0 ){.    
f620: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
f630: 53 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20 20  Synced = pPg;.  
f640: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
f650: 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20  er->xDestructor 
f660: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
f670: 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70 44 61  >xDestructor(pDa
f680: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
f690: 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  Size);.    }.  .
f6a0: 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20      /* When all 
f6b0: 70 61 67 65 73 20 72 65 61 63 68 20 74 68 65 20  pages reach the 
f6c0: 66 72 65 65 6c 69 73 74 2c 20 64 72 6f 70 20 74  freelist, drop t
f6d0: 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f  he read lock fro
f6e0: 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  m.    ** the dat
f6f0: 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
f700: 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  */.    pPager->n
f710: 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72  Ref--;.    asser
f720: 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e  t( pPager->nRef>
f730: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  =0 );.    if( pP
f740: 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26  ager->nRef==0 &&
f750: 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
f760: 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72  ){.      pager_r
f770: 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
f780: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
f790: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
f7a0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f  *.** Create a jo
f7b0: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
f7c0: 50 61 67 65 72 2e 20 20 54 68 65 72 65 20 73 68  Pager.  There sh
f7d0: 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20  ould already be 
f7e0: 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72  a RESERVED.** or
f7f0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
f800: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
f810: 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  file when this r
f820: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
f830: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
f840: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
f850: 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20  ything.  Return 
f860: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  an error code an
f870: 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a  d release the.**
f880: 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61   write lock if a
f890: 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  nything goes wro
f8a0: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
f8b0: 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  t pager_open_jou
f8c0: 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
f8d0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
f8e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
f8f0: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
f900: 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73 65  SERVED );.  asse
f910: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
f920: 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20  nalOpen==0 );.  
f930: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
f940: 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
f950: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
f960: 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
f970: 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
f980: 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c  rnal = sqliteMal
f990: 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53  loc( pPager->dbS
f9a0: 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69  ize/8 + 1 );.  i
f9b0: 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  f( pPager->aInJo
f9c0: 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  urnal==0 ){.    
f9d0: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
f9e0: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41  &pPager->fd, SHA
f9f0: 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70  RED_LOCK);.    p
fa00: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
fa10: 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
fa20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
fa30: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  OMEM;.  }.  rc =
fa40: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78   sqlite3OsOpenEx
fa50: 63 6c 75 73 69 76 65 28 70 50 61 67 65 72 2d 3e  clusive(pPager->
fa60: 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65  zJournal, &pPage
fa70: 72 2d 3e 6a 66 64 2c 70 50 61 67 65 72 2d 3e 74  r->jfd,pPager->t
fa80: 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  empFile);.  if( 
fa90: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
faa0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
fab0: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
fac0: 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  al);.    pPager-
fad0: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >aInJournal = 0;
fae0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e  .    sqlite3OsUn
faf0: 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  lock(&pPager->fd
fb00: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
fb10: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
fb20: 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
fb30: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
fb40: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
fb50: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  }.  sqlite3OsOpe
fb60: 6e 44 69 72 65 63 74 6f 72 79 28 70 50 61 67 65  nDirectory(pPage
fb70: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 26  r->zDirectory, &
fb80: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
fb90: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
fba0: 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65  pen = 1;.  pPage
fbb0: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
fbc0: 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  d = 0;.  pPager-
fbd0: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
fbe0: 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
fbf0: 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70  ollback = 0;.  p
fc00: 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
fc10: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
fc20: 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20  rrMask!=0 ){.   
fc30: 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63   rc = pager_errc
fc40: 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ode(pPager);.   
fc50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
fc60: 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62    pPager->origDb
fc70: 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
fc80: 62 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 72 65  bSize;..  /* Cre
fc90: 61 74 65 20 74 68 65 20 68 65 61 64 65 72 20 66  ate the header f
fca0: 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 3a 0a  or the journal:.
fcb0: 20 20 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20    ** - 8 bytes: 
fcc0: 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e  Magic identifyin
fcd0: 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  g journal format
fce0: 2e 0a 20 20 2a 2a 20 2d 20 34 20 62 79 74 65 73  ..  ** - 4 bytes
fcf0: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  : Number of reco
fd00: 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  rds in journal, 
fd10: 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f  or -1 no-sync mo
fd20: 64 65 20 69 73 20 6f 6e 2e 0a 20 20 2a 2a 20 2d  de is on..  ** -
fd30: 20 34 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20   4 bytes: Magic 
fd40: 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 63 68  used for page ch
fd50: 65 63 6b 73 75 6d 73 2e 0a 20 20 2a 2a 20 2d 20  ecksums..  ** - 
fd60: 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c  4 bytes: Initial
fd70: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63   database page c
fd80: 6f 75 6e 74 2e 0a 20 20 2a 2a 20 2d 20 34 20 62  ount..  ** - 4 b
fd90: 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20  ytes: Number of 
fda0: 62 79 74 65 73 20 72 65 73 65 72 76 65 64 20 66  bytes reserved f
fdb0: 6f 72 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  or master journa
fdc0: 6c 20 70 74 72 20 28 6e 4d 61 73 74 65 72 29 0a  l ptr (nMaster).
fdd0: 20 20 2a 2a 20 2d 20 6e 4d 61 73 74 65 72 20 62    ** - nMaster b
fde0: 79 74 65 73 3a 20 53 70 61 63 65 20 66 6f 72 20  ytes: Space for 
fdf0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
fe00: 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20   pointer..  */. 
fe10: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
fe20: 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  rite(&pPager->jf
fe30: 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  d, aJournalMagic
fe40: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
fe50: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 69 66 28 20  lMagic));.  if( 
fe60: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
fe70: 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33  .    rc = write3
fe80: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
fe90: 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  fd, pPager->noSy
fea0: 6e 63 20 3f 20 30 78 66 66 66 66 66 66 66 66 20  nc ? 0xffffffff 
feb0: 3a 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  : 0);.  }.  if( 
fec0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
fed0: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 61 6e 64  .    sqlite3Rand
fee0: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50  omness(sizeof(pP
fef0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
ff00: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
ff10: 49 6e 69 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  Init);.    rc = 
ff20: 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50 61  write32bits(&pPa
ff30: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
ff40: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
ff50: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
ff60: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
ff70: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70  = write32bits(&p
ff80: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
ff90: 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d  er->dbSize);.  }
ffa0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
ffb0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
ffc0: 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50   write32bits(&pP
ffd0: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
ffe0: 72 2d 3e 6e 4d 61 73 74 65 72 29 3b 0a 20 20 7d  r->nMaster);.  }
fff0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
10000 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
10010 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65  te3OsSeek(&pPage
10020 72 2d 3e 6a 66 64 2c 20 32 34 20 2b 20 70 50 61  r->jfd, 24 + pPa
10030 67 65 72 2d 3e 6e 4d 61 73 74 65 72 20 2d 20 31  ger->nMaster - 1
10040 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
10050 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67  te3OsWrite(&pPag
10060 65 72 2d 3e 6a 66 64 2c 20 22 5c 30 30 30 22 2c  er->jfd, "\000",
10070 20 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   1);.  }.  if( p
10080 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
10090 70 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  pen && rc==SQLIT
100a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
100b0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
100c0 6d 74 5f 62 65 67 69 6e 28 70 50 61 67 65 72 29  mt_begin(pPager)
100d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
100e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
100f0 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
10100 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
10110 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
10120 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10130 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
10140 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
10150 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 0a 2f 2a  turn rc;  .}../*
10160 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77 72  .** Acquire a wr
10170 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
10180 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6c  database.  The l
10190 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20 77  ock is removed w
101a0 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f  hen.** the any o
101b0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
101c0 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20  happen:.**.**   
101d0 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  *  sqlite3pager_
101e0 63 6f 6d 6d 69 74 28 29 20 69 73 20 63 61 6c 6c  commit() is call
101f0 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
10200 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
10210 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  k() is called..*
10220 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61  *   *  sqlite3pa
10230 67 65 72 5f 63 6c 6f 73 65 28 29 20 69 73 20 63  ger_close() is c
10240 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
10250 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
10260 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  f() is called to
10270 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61   on every outsta
10280 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a  nding page..**.*
10290 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61  * The first para
102a0 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f  meter to this ro
102b0 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74  utine is a point
102c0 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70  er to any open p
102d0 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  age of the.** da
102e0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f  tabase file.  No
102f0 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62  thing changes ab
10300 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d 20 69  out the page - i
10310 74 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79  t is used merely
10320 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61   to.** acquire a
10330 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
10340 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
10350 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61  and as proof tha
10360 74 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c  t there is.** al
10370 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63  ready a read-loc
10380 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
10390 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63  e..**.** The sec
103a0 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e  ond parameter in
103b0 64 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68  dicates how much
103c0 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20   space in bytes 
103d0 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 61  to reserve for a
103e0 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
103f0 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20  al file-name at 
10400 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
10410 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74   journal when it
10420 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a   is created..**.
10430 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ** A journal fil
10440 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74  e is opened if t
10450 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d  his is not a tem
10460 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f  porary file.  Fo
10470 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66  r temporary.** f
10480 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e  iles, the openin
10490 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g of the journal
104a0 20 66 69 6c 65 20 69 73 20 64 65 66 65 72 72 65   file is deferre
104b0 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73  d until there is
104c0 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65   an.** actual ne
104d0 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ed to write to t
104e0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
104f0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
10500 65 20 69 73 20 61 6c 72 65 61 64 79 20 72 65 73  e is already res
10510 65 72 76 65 64 20 66 6f 72 20 77 72 69 74 69 6e  erved for writin
10520 67 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  g, this routine 
10530 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69  is a no-op..*/.i
10540 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
10550 62 65 67 69 6e 28 76 6f 69 64 20 2a 70 44 61 74  begin(void *pDat
10560 61 2c 20 69 6e 74 20 6e 4d 61 73 74 65 72 29 7b  a, int nMaster){
10570 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
10580 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
10590 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70  ata);.  Pager *p
105a0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
105b0 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ger;.  int rc = 
105c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
105d0 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30  ert( pPg->nRef>0
105e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4d   );.  assert( nM
105f0 61 73 74 65 72 3e 3d 30 20 29 3b 0a 20 20 61 73  aster>=0 );.  as
10600 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
10610 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
10620 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  K );.  if( pPage
10630 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
10640 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73  SHARED ){.    as
10650 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
10660 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
10670 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d     if( pPager->m
10680 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 70 50  emDb ){.      pP
10690 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
106a0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
106b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69       pPager->ori
106c0 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  gDbSize = pPager
106d0 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65  ->dbSize;.    }e
106e0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 62  lse{.      int b
106f0 75 73 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 64  usy = 1;.      d
10700 6f 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  o {.        rc =
10710 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26   sqlite3OsLock(&
10720 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45  pPager->fd, RESE
10730 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  RVED_LOCK);.    
10740 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
10750 4c 49 54 45 5f 42 55 53 59 20 26 26 20 0a 20 20  LITE_BUSY && .  
10760 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
10770 70 42 75 73 79 48 61 6e 64 6c 65 72 20 26 26 20  pBusyHandler && 
10780 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
10790 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d  r->pBusyHandler-
107a0 3e 78 46 75 6e 63 20 26 26 20 0a 20 20 20 20 20  >xFunc && .     
107b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75       pPager->pBu
107c0 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63  syHandler->xFunc
107d0 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61  (pPager->pBusyHa
107e0 6e 64 6c 65 72 2d 3e 70 41 72 67 2c 20 22 22 2c  ndler->pArg, "",
107f0 20 62 75 73 79 2b 2b 29 0a 20 20 20 20 20 20 29   busy++).      )
10800 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
10810 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10820 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
10830 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
10840 61 67 65 72 2d 3e 6e 4d 61 73 74 65 72 20 3d 20  ager->nMaster = 
10850 6e 4d 61 73 74 65 72 3b 0a 20 20 20 20 20 20 70  nMaster;.      p
10860 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
10870 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20  AGER_RESERVED;. 
10880 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72       pPager->dir
10890 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20  tyCache = 0;.   
108a0 20 20 20 54 52 41 43 45 33 28 22 54 52 41 4e 53     TRACE3("TRANS
108b0 41 43 54 49 4f 4e 20 25 64 20 6e 4d 61 73 74 65  ACTION %d nMaste
108c0 72 3d 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d  r=%d\n", pPager-
108d0 3e 66 64 2e 68 2c 20 6e 4d 61 73 74 65 72 29 3b  >fd.h, nMaster);
108e0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
108f0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26  r->useJournal &&
10900 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
10910 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  le ){.        rc
10920 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
10930 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
10940 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
10950 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10960 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61  ./*.** Mark a da
10970 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65  ta page as write
10980 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65 20  able.  The page 
10990 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
109a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  the journal .** 
109b0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
109c0 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68 69  re already.  Thi
109d0 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
109e0 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
109f0 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65  making.** change
10a00 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  s to a page..**.
10a10 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  ** The first tim
10a20 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
10a30 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61  s called, the pa
10a40 67 65 72 20 63 72 65 61 74 65 73 20 61 20 6e 65  ger creates a ne
10a50 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  w.** journal and
10a60 20 61 63 71 75 69 72 65 73 20 61 20 52 45 53 45   acquires a RESE
10a70 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
10a80 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 74   database.  If t
10a90 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c  he RESERVED.** l
10aa0 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ock could not be
10ab0 20 61 63 71 75 69 72 65 64 2c 20 74 68 69 73 20   acquired, this 
10ac0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
10ad0 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 68  SQLITE_BUSY.  Th
10ae0 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75  e.** calling rou
10af0 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b 20  tine must check 
10b00 66 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e 20  for that return 
10b10 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61 72  value and be car
10b20 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63  eful not to.** c
10b30 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64  hange any page d
10b40 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20 72  ata until this r
10b50 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
10b60 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
10b70 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
10b80 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ile could not be
10b90 20 77 72 69 74 74 65 6e 20 62 65 63 61 75 73 65   written because
10ba0 20 74 68 65 20 64 69 73 6b 20 69 73 20 66 75 6c   the disk is ful
10bb0 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  l,.** then this 
10bc0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
10bd0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20  SQLITE_FULL and 
10be0 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74  does an immediat
10bf0 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41  e rollback..** A
10c00 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77 72  ll subsequent wr
10c10 69 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c 73  ite attempts als
10c20 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  o return SQLITE_
10c30 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72 65  FULL until there
10c40 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74 6f  .** is a call to
10c50 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f   sqlite3pager_co
10c60 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65  mmit() or sqlite
10c70 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
10c80 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a  ) to.** reset..*
10c90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
10ca0 65 72 5f 77 72 69 74 65 28 76 6f 69 64 20 2a 70  er_write(void *p
10cb0 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
10cc0 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
10cd0 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61  HDR(pData);.  Pa
10ce0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
10cf0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
10d00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
10d10 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
10d20 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69   errors.  */.  i
10d30 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
10d40 73 6b 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72  sk ){ .    retur
10d50 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  n pager_errcode(
10d60 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
10d70 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  f( pPager->readO
10d80 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  nly ){.    retur
10d90 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20  n SQLITE_PERM;. 
10da0 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68   }..  /* Mark th
10db0 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e  e page as dirty.
10dc0 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61    If the page ha
10dd0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
10de0 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74  ritten.  ** to t
10df0 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20  he journal then 
10e00 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69  we can return ri
10e10 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20  ght away..  */. 
10e20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b   pPg->dirty = 1;
10e30 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f  .  if( pPg->inJo
10e40 75 72 6e 61 6c 20 26 26 20 28 70 50 67 2d 3e 69  urnal && (pPg->i
10e50 6e 53 74 6d 74 20 7c 7c 20 70 50 61 67 65 72 2d  nStmt || pPager-
10e60 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29  >stmtInUse==0) )
10e70 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  {.    pPager->di
10e80 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20  rtyCache = 1;.  
10e90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10ea0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  OK;.  }..  /* If
10eb0 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
10ec0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
10ed0 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
10ee0 6f 20 62 65 0a 20 20 2a 2a 20 77 72 69 74 74 65  o be.  ** writte
10ef0 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63  n to the transac
10f00 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  tion journal or 
10f10 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a  the ckeckpoint j
10f20 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 6f 72 20 62  ournal.  ** or b
10f30 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46  oth..  **.  ** F
10f40 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65  irst check to se
10f50 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  e that the trans
10f60 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65  action journal e
10f70 78 69 73 74 73 20 61 6e 64 0a 20 20 2a 2a 20 63  xists and.  ** c
10f80 72 65 61 74 65 20 69 74 20 69 66 20 69 74 20 64  reate it if it d
10f90 6f 65 73 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20  oes not..  */.  
10fa0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
10fb0 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
10fc0 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  OCK );.  rc = sq
10fd0 6c 69 74 65 33 70 61 67 65 72 5f 62 65 67 69 6e  lite3pager_begin
10fe0 28 70 44 61 74 61 2c 20 30 29 3b 0a 20 20 69 66  (pData, 0);.  if
10ff0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11000 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
11010 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
11020 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
11030 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
11040 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
11050 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70  journalOpen && p
11060 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
11070 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  l ){.    rc = pa
11080 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
11090 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
110a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
110b0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
110c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
110d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c  r->journalOpen |
110e0 7c 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  | !pPager->useJo
110f0 75 72 6e 61 6c 20 29 3b 0a 20 20 70 50 61 67 65  urnal );.  pPage
11100 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
11110 31 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74 72 61  1;..  /* The tra
11120 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
11130 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20   now exists and 
11140 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52 56  we have a RESERV
11150 45 44 20 6f 72 20 61 6e 0a 20 20 2a 2a 20 45 58  ED or an.  ** EX
11160 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
11170 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
11180 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74  e file.  Write t
11190 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
111a0 74 6f 0a 20 20 2a 2a 20 74 68 65 20 74 72 61 6e  to.  ** the tran
111b0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
111c0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
111d0 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 2a 2f  re already..  */
111e0 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a  .  if( !pPg->inJ
111f0 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61 67 65  ournal && (pPage
11200 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c  r->useJournal ||
11210 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 29 20   pPager->memDb) 
11220 29 7b 0a 20 20 20 20 69 66 28 20 28 69 6e 74 29  ){.    if( (int)
11230 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61  pPg->pgno <= pPa
11240 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
11250 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 50  ){.      int szP
11260 67 3b 0a 20 20 20 20 20 20 75 33 32 20 73 61 76  g;.      u32 sav
11270 65 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ed;.      if( pP
11280 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
11290 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79         PgHistory
112a0 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
112b0 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
112c0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 54 52  ger);.        TR
112d0 41 43 45 32 28 22 4a 4f 55 52 4e 41 4c 20 70 61  ACE2("JOURNAL pa
112e0 67 65 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70  ge %d\n", pPg->p
112f0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 61 73  gno);.        as
11300 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 4f 72  sert( pHist->pOr
11310 69 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ig==0 );.       
11320 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20   pHist->pOrig = 
11330 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
11340 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
11350 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
11360 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b   pHist->pOrig ){
11370 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
11380 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20  y(pHist->pOrig, 
11390 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
113a0 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g), pPager->page
113b0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Size);.        }
113c0 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  .        pPg->in
113d0 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
113e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
113f0 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 61    u32 cksum = pa
11400 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
11410 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 44 61  , pPg->pgno, pDa
11420 74 61 29 3b 0a 20 20 20 20 20 20 20 20 73 61 76  ta);.        sav
11430 65 64 20 3d 20 2a 28 75 33 32 2a 29 50 47 48 44  ed = *(u32*)PGHD
11440 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 29 3b  R_TO_EXTRA(pPg);
11450 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 33 32  .        store32
11460 62 69 74 73 28 63 6b 73 75 6d 2c 20 70 50 67 2c  bits(cksum, pPg,
11470 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
11480 45 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 50 67  E);.        szPg
11490 20 3d 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53   = SQLITE_PAGE_S
114a0 49 5a 45 2b 38 3b 0a 20 20 20 20 20 20 20 20 73  IZE+8;.        s
114b0 74 6f 72 65 33 32 62 69 74 73 28 70 50 67 2d 3e  tore32bits(pPg->
114c0 70 67 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a  pgno, pPg, -4);.
114d0 20 20 20 20 20 20 20 20 43 4f 44 45 43 28 70 50          CODEC(pP
114e0 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
114f0 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20  ->pgno, 7);.    
11500 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11510 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d  OsWrite(&pPager-
11520 3e 6a 66 64 2c 20 26 28 28 63 68 61 72 2a 29 70  >jfd, &((char*)p
11530 44 61 74 61 29 5b 2d 34 5d 2c 20 73 7a 50 67 29  Data)[-4], szPg)
11540 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 33  ;.        TRACE3
11550 28 22 4a 4f 55 52 4e 41 4c 20 70 61 67 65 20 25  ("JOURNAL page %
11560 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
11570 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67  , pPg->pgno, pPg
11580 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20  ->needSync);.   
11590 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65       CODEC(pPage
115a0 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
115b0 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  gno, 0);.       
115c0 20 2a 28 75 33 32 2a 29 50 47 48 44 52 5f 54 4f   *(u32*)PGHDR_TO
115d0 5f 45 58 54 52 41 28 70 50 67 29 20 3d 20 73 61  _EXTRA(pPg) = sa
115e0 76 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ved;.        if(
115f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11600 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
11610 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
11620 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
11630 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
11640 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52  Mask |= PAGER_ER
11650 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20  R_FULL;.        
11660 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
11670 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
11680 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20  Pager->nRec++;. 
11690 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
116a0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
116b0 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  l!=0 );.        
116c0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
116d0 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  al[pPg->pgno/8] 
116e0 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
116f0 26 37 29 3b 0a 20 20 20 20 20 20 20 20 70 50 67  &7);.        pPg
11700 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50  ->needSync = !pP
11710 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20  ager->noSync;.  
11720 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
11730 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20  rnal = 1;.      
11740 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
11750 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20  mtInUse ){.     
11760 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
11770 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  Stmt[pPg->pgno/8
11780 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
11790 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20  no&7);.         
117a0 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
117b0 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
117c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
117d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
117e0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
117f0 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
11800 53 74 61 72 74 65 64 20 26 26 20 21 70 50 61 67  Started && !pPag
11810 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20  er->noSync;.    
11820 20 20 54 52 41 43 45 33 28 22 41 50 50 45 4e 44    TRACE3("APPEND
11830 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
11840 63 3d 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67  c=%d\n", pPg->pg
11850 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  no, pPg->needSyn
11860 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  c);.    }.    if
11870 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20  ( pPg->needSync 
11880 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
11890 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
118a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
118b0 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
118c0 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20  journal is open 
118d0 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
118e0 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 2a 2a 20  not in it,.  ** 
118f0 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63  then write the c
11900 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74  urrent page to t
11910 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
11920 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74  rnal.  Note that
11930 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d  .  ** the statem
11940 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ent journal form
11950 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20  at differs from 
11960 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75  the standard jou
11970 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 2a 2a  rnal format.  **
11980 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74   in that it omit
11990 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  s the checksums 
119a0 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a  and the header..
119b0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
119c0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20  r->stmtInUse && 
119d0 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20  !pPg->inStmt && 
119e0 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d  (int)pPg->pgno<=
119f0 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
11a00 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
11a10 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c  pPg->inJournal |
11a20 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  | (int)pPg->pgno
11a30 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  >pPager->origDbS
11a40 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ize );.    if( p
11a50 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
11a60 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
11a70 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
11a80 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
11a90 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  er);.      asser
11aa0 74 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d  t( pHist->pStmt=
11ab0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 48 69 73  =0 );.      pHis
11ac0 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69 74  t->pStmt = sqlit
11ad0 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67  eMallocRaw( pPag
11ae0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  er->pageSize );.
11af0 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d        if( pHist-
11b00 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  >pStmt ){.      
11b10 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e    memcpy(pHist->
11b20 70 53 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f  pStmt, PGHDR_TO_
11b30 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65  DATA(pPg), pPage
11b40 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
11b50 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43      }.      TRAC
11b60 45 32 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E2("STMT-JOURNAL
11b70 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50 67   page %d\n", pPg
11b80 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 65 6c  ->pgno);.    }el
11b90 73 65 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 33  se{.      store3
11ba0 32 62 69 74 73 28 70 50 67 2d 3e 70 67 6e 6f 2c  2bits(pPg->pgno,
11bb0 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20 20 20 20   pPg, -4);.     
11bc0 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70   CODEC(pPager, p
11bd0 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
11be0 20 37 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   7);.      rc = 
11bf0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26  sqlite3OsWrite(&
11c00 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 28 28  pPager->stfd, ((
11c10 63 68 61 72 2a 29 70 44 61 74 61 29 2d 34 2c 20  char*)pData)-4, 
11c20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
11c30 2b 34 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45  +4);.      TRACE
11c40 32 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  2("STMT-JOURNAL 
11c50 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50 67 2d  page %d\n", pPg-
11c60 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43 4f  >pgno);.      CO
11c70 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74  DEC(pPager, pDat
11c80 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 30 29  a, pPg->pgno, 0)
11c90 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
11ca0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11cb0 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
11cc0 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
11cd0 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  r);.        pPag
11ce0 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50  er->errMask |= P
11cf0 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20  AGER_ERR_FULL;. 
11d00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
11d10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11d20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
11d30 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ++;.      assert
11d40 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
11d50 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  t!=0 );.      pP
11d60 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
11d70 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
11d80 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
11d90 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 5f 61      }.    page_a
11da0 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
11db0 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  pPg);.  }..  /* 
11dc0 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62  Update the datab
11dd0 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74  ase size and ret
11de0 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  urn..  */.  if( 
11df0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28  pPager->dbSize<(
11e00 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b  int)pPg->pgno ){
11e10 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
11e20 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  ize = pPg->pgno;
11e30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
11e40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
11e50 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70 61  n TRUE if the pa
11e60 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  ge given in the 
11e70 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65  argument was pre
11e80 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a  viously passed.*
11e90 2a 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65  * to sqlite3page
11ea0 72 5f 77 72 69 74 65 28 29 2e 20 20 49 6e 20 6f  r_write().  In o
11eb0 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75  ther words, retu
11ec0 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
11ed0 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65   ok.** to change
11ee0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
11ef0 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74  the page..*/.int
11f00 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73   sqlite3pager_is
11f10 77 72 69 74 65 61 62 6c 65 28 76 6f 69 64 20 2a  writeable(void *
11f20 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
11f30 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50  *pPg = DATA_TO_P
11f40 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 72  GHDR(pData);.  r
11f50 65 74 75 72 6e 20 70 50 67 2d 3e 64 69 72 74 79  eturn pPg->dirty
11f60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61  ;.}../*.** Repla
11f70 63 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ce the content o
11f80 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  f a single page 
11f90 77 69 74 68 20 74 68 65 20 69 6e 66 6f 72 6d 61  with the informa
11fa0 74 69 6f 6e 20 69 6e 20 74 68 65 20 74 68 69 72  tion in the thir
11fb0 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  d.** argument..*
11fc0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
11fd0 65 72 5f 6f 76 65 72 77 72 69 74 65 28 50 61 67  er_overwrite(Pag
11fe0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
11ff0 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 70 44 61   pgno, void *pDa
12000 74 61 29 7b 0a 20 20 76 6f 69 64 20 2a 70 50 61  ta){.  void *pPa
12010 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ge;.  int rc;.. 
12020 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
12030 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20 70  er_get(pPager, p
12040 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0a 20 20  gno, &pPage);.  
12050 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
12060 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
12070 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
12080 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  (pPage);.    if(
12090 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
120a0 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
120b0 50 61 67 65 2c 20 70 44 61 74 61 2c 20 53 51 4c  Page, pData, SQL
120c0 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
120d0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
120e0 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61  3pager_unref(pPa
120f0 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
12100 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
12110 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f   call to this ro
12120 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20  utine tells the 
12130 70 61 67 65 72 20 74 68 61 74 20 69 74 20 69 73  pager that it is
12140 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
12150 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69  o.** write the i
12160 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61  nformation on pa
12170 67 65 20 22 70 67 6e 6f 22 20 62 61 63 6b 20 74  ge "pgno" back t
12180 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e  o the disk, even
12190 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20   though.** that 
121a0 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61  page might be ma
121b0 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a 2a  rked as dirty..*
121c0 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69  *.** The overlyi
121d0 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65  ng software laye
121e0 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
121f0 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66  tine when all of
12200 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20   the data.** on 
12210 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69  the given page i
12220 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20 70  s unused.  The p
12230 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70  ager marks the p
12240 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a  age as clean so.
12250 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  ** that it does 
12260 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20  not get written 
12270 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54  to disk..**.** T
12280 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74  ests show that t
12290 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
122a0 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20  , together with 
122b0 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61  the.** sqlite3pa
122c0 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  ger_dont_rollbac
122d0 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20  k() below, more 
122e0 74 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65 20  than double the 
122f0 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67  speed.** of larg
12300 65 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69  e INSERT operati
12310 6f 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70 6c  ons and quadrupl
12320 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c  e the speed of l
12330 61 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a  arge DELETEs..**
12340 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f  .** When this ro
12350 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
12360 20 73 65 74 20 74 68 65 20 61 6c 77 61 79 73 52   set the alwaysR
12370 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f 20  ollback flag to 
12380 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75  true..** Subsequ
12390 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ent calls to sql
123a0 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72  ite3pager_dont_r
123b0 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68  ollback() for th
123c0 65 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77  e same page.** w
123d0 69 6c 6c 20 74 68 65 72 65 61 66 74 65 72 20 62  ill thereafter b
123e0 65 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73  e ignored.  This
123f0 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
12400 20 61 76 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d   avoid a problem
12410 0a 2a 2a 20 77 68 65 72 65 20 61 20 70 61 67 65  .** where a page
12420 20 77 69 74 68 20 64 61 74 61 20 69 73 20 61 64   with data is ad
12430 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
12440 69 73 74 20 64 75 72 69 6e 67 20 6f 6e 65 20 70  ist during one p
12450 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e  art of.** a tran
12460 73 61 63 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d  saction then rem
12470 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72  oved from the fr
12480 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 61 20  eelist during a 
12490 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66  later part.** of
124a0 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61   the same transa
124b0 63 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64  ction and reused
124c0 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20   for some other 
124d0 70 75 72 70 6f 73 65 2e 20 20 57 68 65 6e 20 69  purpose.  When i
124e0 74 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 61 64  t.** is first ad
124f0 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
12500 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ist, this routin
12510 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 57 68  e is called.  Wh
12520 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68  en reused,.** th
12530 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  e dont_rollback(
12540 29 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  ) routine is cal
12550 6c 65 64 2e 20 20 42 75 74 20 62 65 63 61 75 73  led.  But becaus
12560 65 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61  e the page conta
12570 69 6e 73 0a 2a 2a 20 63 72 69 74 69 63 61 6c 20  ins.** critical 
12580 64 61 74 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e  data, we still n
12590 65 65 64 20 74 6f 20 62 65 20 73 75 72 65 20 69  eed to be sure i
125a0 74 20 67 65 74 73 20 72 6f 6c 6c 65 64 20 62 61  t gets rolled ba
125b0 63 6b 20 69 6e 20 73 70 69 74 65 0a 2a 2a 20 6f  ck in spite.** o
125c0 66 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62  f the dont_rollb
125d0 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76  ack() call..*/.v
125e0 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
125f0 5f 64 6f 6e 74 5f 77 72 69 74 65 28 50 61 67 65  _dont_write(Page
12600 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
12610 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
12620 70 50 67 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61  pPg;..  pPg = pa
12630 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
12640 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 70 50 67 2d  r, pgno);.  pPg-
12650 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
12660 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 20 26  = 1;.  if( pPg &
12670 26 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a  & pPg->dirty ){.
12680 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
12690 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70 50 67  dbSize==(int)pPg
126a0 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61 67 65 72  ->pgno && pPager
126b0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70 50 61  ->origDbSize<pPa
126c0 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
126d0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
126e0 70 61 67 65 73 20 69 73 20 74 68 65 20 6c 61 73  pages is the las
126f0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69  t page in the fi
12700 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  le and the file 
12710 68 61 73 20 67 72 6f 77 6e 0a 20 20 20 20 20 20  has grown.      
12720 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20 63 75  ** during the cu
12730 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
12740 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d  n, then do NOT m
12750 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
12760 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20  clean..      ** 
12770 57 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  When the databas
12780 65 20 66 69 6c 65 20 67 72 6f 77 73 2c 20 77 65  e file grows, we
12790 20 6d 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20   must make sure 
127a0 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61  that the last pa
127b0 67 65 0a 20 20 20 20 20 20 2a 2a 20 67 65 74 73  ge.      ** gets
127c0 20 77 72 69 74 74 65 6e 20 61 74 20 6c 65 61 73   written at leas
127d0 74 20 6f 6e 63 65 20 73 6f 20 74 68 61 74 20 74  t once so that t
127e0 68 65 20 64 69 73 6b 20 66 69 6c 65 20 77 69 6c  he disk file wil
127f0 6c 20 62 65 20 74 68 65 20 63 6f 72 72 65 63 74  l be the correct
12800 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20  .      ** size. 
12810 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72  If you do not wr
12820 69 74 65 20 74 68 69 73 20 70 61 67 65 20 61 6e  ite this page an
12830 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
12840 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  e file.      ** 
12850 6f 6e 20 74 68 65 20 64 69 73 6b 20 65 6e 64 73  on the disk ends
12860 20 75 70 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d   up being too sm
12870 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20 6c 65  all, that can le
12880 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 0a 20  ad to database. 
12890 20 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 69       ** corrupti
128a0 6f 6e 20 64 75 72 69 6e 67 20 74 68 65 20 6e 65  on during the ne
128b0 78 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  xt transaction..
128c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c        */.    }el
128d0 73 65 7b 0a 20 20 20 20 20 20 54 52 41 43 45 33  se{.      TRACE3
128e0 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67  ("DONT_WRITE pag
128f0 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  e %d of %d\n", p
12900 67 6e 6f 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e  gno, pPager->fd.
12910 68 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64  h);.      pPg->d
12920 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  irty = 0;.    }.
12930 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63    }.}../*.** A c
12940 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
12950 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61  ine tells the pa
12960 67 65 72 20 74 68 61 74 20 69 66 20 61 20 72 6f  ger that if a ro
12970 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a 2a  llback occurs,.*
12980 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  * it is not nece
12990 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f 72 65  ssary to restore
129a0 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68 65   the data on the
129b0 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20 54 68   given page.  Th
129c0 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74  is.** means that
129d0 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20   the pager does 
129e0 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65 63 6f  not have to reco
129f0 72 64 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  rd the given pag
12a00 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c  e in the.** roll
12a10 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f  back journal..*/
12a20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
12a30 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  er_dont_rollback
12a40 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
12a50 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41   PgHdr *pPg = DA
12a60 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
12a70 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  a);.  Pager *pPa
12a80 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
12a90 72 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  r;..  if( pPager
12aa0 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 45  ->state!=PAGER_E
12ab0 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50 61 67  XCLUSIVE || pPag
12ac0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
12ad0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
12ae0 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  f( pPg->alwaysRo
12af0 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65 72  llback || pPager
12b00 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
12b10 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44   || pPager->memD
12b20 62 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  b ) return;.  if
12b30 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  ( !pPg->inJourna
12b40 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70  l && (int)pPg->p
12b50 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f  gno <= pPager->o
12b60 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
12b70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
12b80 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >aInJournal!=0 )
12b90 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
12ba0 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67  nJournal[pPg->pg
12bb0 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
12bc0 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70  ->pgno&7);.    p
12bd0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
12be0 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  1;.    if( pPage
12bf0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
12c00 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
12c10 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
12c20 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
12c30 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 70 61  gno&7);.      pa
12c40 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
12c50 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ist(pPg);.    }.
12c60 20 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54      TRACE3("DONT
12c70 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20 25  _ROLLBACK page %
12c80 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d  d of %d\n", pPg-
12c90 3e 70 67 6e 6f 2c 20 70 50 61 67 65 72 2d 3e 66  >pgno, pPager->f
12ca0 64 2e 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  d.h);.  }.  if( 
12cb0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
12cc0 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d  e && !pPg->inStm
12cd0 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70  t && (int)pPg->p
12ce0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d  gno<=pPager->stm
12cf0 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73  tSize ){.    ass
12d00 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  ert( pPg->inJour
12d10 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d  nal || (int)pPg-
12d20 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72  >pgno>pPager->or
12d30 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20  igDbSize );.    
12d40 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
12d50 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20  aInStmt!=0 );.  
12d60 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
12d70 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
12d80 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
12d90 37 29 3b 0a 20 20 20 20 70 61 67 65 5f 61 64 64  7);.    page_add
12da0 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  _to_stmt_list(pP
12db0 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  g);.  }.}.../*.*
12dc0 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69 73 74  * Clear a PgHist
12dd0 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61  ory block.*/.sta
12de0 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 48 69  tic void clearHi
12df0 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72 79 20  story(PgHistory 
12e00 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c 69 74  *pHist){.  sqlit
12e10 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 4f 72  eFree(pHist->pOr
12e20 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  ig);.  sqliteFre
12e30 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b  e(pHist->pStmt);
12e40 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  .  pHist->pOrig 
12e50 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70 53  = 0;.  pHist->pS
12e60 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  tmt = 0;.}../*.*
12e70 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61  * Commit all cha
12e80 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
12e90 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73 65  base and release
12ea0 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e   the write lock.
12eb0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  .**.** If the co
12ec0 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20 61  mmit fails for a
12ed0 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c  ny reason, a rol
12ee0 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69 73  lback attempt is
12ef0 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20   made.** and an 
12f00 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
12f10 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20  turned.  If the 
12f20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53  commit worked, S
12f30 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
12f40 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
12f50 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d  sqlite3pager_com
12f60 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
12f70 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
12f80 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69  PgHdr *pPg;..  i
12f90 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
12fa0 73 6b 3d 3d 50 41 47 45 52 5f 45 52 52 5f 46 55  sk==PAGER_ERR_FU
12fb0 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  LL ){.    rc = s
12fc0 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
12fd0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
12fe0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
12ff0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
13000 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
13010 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
13020 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  rc;.  }.  if( pP
13030 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30  ager->errMask!=0
13040 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
13050 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65  er_errcode(pPage
13060 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
13070 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  c;.  }.  if( pPa
13080 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52  ger->state<PAGER
13090 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
130a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
130b0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 52 41 43  RROR;.  }.  TRAC
130c0 45 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22  E2("COMMIT %d\n"
130d0 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b  , pPager->fd.h);
130e0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d  .  if( pPager->m
130f0 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 67 20  emDb ){.    pPg 
13100 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f  = pager_get_all_
13110 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67  dirty_pages(pPag
13120 65 72 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  er);.    while( 
13130 70 50 67 20 29 7b 0a 20 20 20 20 20 20 63 6c 65  pPg ){.      cle
13140 61 72 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f  arHistory(PGHDR_
13150 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
13160 67 65 72 29 29 3b 0a 20 20 20 20 20 20 70 50 67  ger));.      pPg
13170 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
13180 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
13190 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  l = 0;.      pPg
131a0 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
131b0 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74      pPg->pPrevSt
131c0 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53  mt = pPg->pNextS
131d0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tmt = 0;.      p
131e0 50 67 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79  Pg = pPg->pDirty
131f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
13200 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  er->pStmt = 0;. 
13210 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
13220 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
13230 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13240 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
13250 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
13260 63 68 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  che==0 ){.    /*
13270 20 45 78 69 74 20 65 61 72 6c 79 20 28 77 69 74   Exit early (wit
13280 68 6f 75 74 20 64 6f 69 6e 67 20 74 68 65 20 74  hout doing the t
13290 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e 67 20 73 71  ime-consuming sq
132a0 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 63 61  lite3OsSync() ca
132b0 6c 6c 73 29 0a 20 20 20 20 2a 2a 20 69 66 20 74  lls).    ** if t
132c0 68 65 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e  here have been n
132d0 6f 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  o changes to the
132e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
132f0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
13300 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 3d  Pager->needSync=
13310 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  =0 );.    rc = p
13320 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
13330 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
13340 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
13350 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  1;.    return rc
13360 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
13370 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13380 70 65 6e 20 29 3b 0a 23 69 66 20 30 0a 20 20 72  pen );.#if 0.  r
13390 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
133a0 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 69 66  pPager, 0);.  if
133b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
133c0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d  ){.    goto comm
133d0 69 74 5f 61 62 6f 72 74 3b 0a 20 20 7d 0a 20 20  it_abort;.  }.  
133e0 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f  pPg = pager_get_
133f0 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28  all_dirty_pages(
13400 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
13410 50 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  Pg ){.    rc = p
13420 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
13430 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 69 66  ist(pPg);.    if
13440 28 20 72 63 20 7c 7c 20 28 21 70 50 61 67 65 72  ( rc || (!pPager
13450 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 73 71 6c 69  ->noSync && sqli
13460 74 65 33 4f 73 53 79 6e 63 28 26 70 50 61 67 65  te3OsSync(&pPage
13470 72 2d 3e 66 64 29 21 3d 53 51 4c 49 54 45 5f 4f  r->fd)!=SQLITE_O
13480 4b 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  K) ){.      goto
13490 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20   commit_abort;. 
134a0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
134b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
134c0 67 65 72 5f 73 79 6e 63 28 70 50 61 67 65 72 2c  ger_sync(pPager,
134d0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
134e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
134f0 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72  goto commit_abor
13500 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70 61  t;.  }.  rc = pa
13510 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
13520 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
13530 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
13540 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20    return rc;..  
13550 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
13560 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
13570 6f 6e 67 20 64 75 72 69 6e 67 20 74 68 65 20 63  ong during the c
13580 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 20  ommit process.. 
13590 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61 62 6f 72 74   */.commit_abort
135a0 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  :.  rc = sqlite3
135b0 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
135c0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
135d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
135e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
135f0 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ULL;.  }.  retur
13600 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
13610 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e  ollback all chan
13620 67 65 73 2e 20 20 54 68 65 20 64 61 74 61 62 61  ges.  The databa
13630 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f  se falls back to
13640 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d 6f   PAGER_SHARED mo
13650 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65  de..** All in-me
13660 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73  mory cache pages
13670 20 72 65 76 65 72 74 20 74 6f 20 74 68 65 69 72   revert to their
13680 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63   original data c
13690 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20  ontents..** The 
136a0 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74  journal is delet
136b0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
136c0 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61  outine cannot fa
136d0 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f  il unless some o
136e0 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
136f0 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  not following.**
13700 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63   the correct loc
13710 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28 53  king protocol (S
13720 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29 20  QLITE_PROTOCOL) 
13730 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f  or unless some o
13740 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20  ther.** process 
13750 69 73 20 77 72 69 74 69 6e 67 20 74 72 61 73 68  is writing trash
13760 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
13770 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43  l file (SQLITE_C
13780 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e  ORRUPT) or.** un
13790 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c  less a prior mal
137a0 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53 51  loc() failed (SQ
137b0 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70  LITE_NOMEM).  Ap
137c0 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a  propriate error.
137d0 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65 74  ** codes are ret
137e0 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68  urned for all th
137f0 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20  ese occasions.  
13800 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51  Otherwise,.** SQ
13810 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
13820 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
13830 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
13840 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
13850 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 52  {.  int rc;.  TR
13860 41 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25  ACE2("ROLLBACK %
13870 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64  d\n", pPager->fd
13880 2e 68 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  .h);.  if( pPage
13890 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
138a0 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f  PgHdr *p;.    fo
138b0 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  r(p=pPager->pAll
138c0 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41  ; p; p=p->pNextA
138d0 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73  ll){.      PgHis
138e0 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20  tory *pHist;.   
138f0 20 20 20 69 66 28 20 21 70 2d 3e 64 69 72 74 79     if( !p->dirty
13900 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
13910 20 20 20 70 48 69 73 74 20 3d 20 50 47 48 44 52     pHist = PGHDR
13920 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67  _TO_HIST(p, pPag
13930 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  er);.      if( p
13940 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20  Hist->pOrig ){. 
13950 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47         memcpy(PG
13960 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20  HDR_TO_DATA(p), 
13970 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70 50  pHist->pOrig, pP
13980 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
13990 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 32 28  .        TRACE2(
139a0 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25  "ROLLBACK-PAGE %
139b0 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 29 3b 0a  d\n", p->pgno);.
139c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
139d0 20 20 20 20 20 54 52 41 43 45 32 28 22 50 41 47       TRACE2("PAG
139e0 45 20 25 64 20 69 73 20 63 6c 65 61 6e 5c 6e 22  E %d is clean\n"
139f0 2c 20 70 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  , p->pgno);.    
13a00 20 20 7d 0a 20 20 20 20 20 20 63 6c 65 61 72 48    }.      clearH
13a10 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20  istory(pHist);. 
13a20 20 20 20 20 20 70 2d 3e 64 69 72 74 79 20 3d 20       p->dirty = 
13a30 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a 6f  0;.      p->inJo
13a40 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
13a50 20 70 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a   p->inStmt = 0;.
13a60 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 53 74        p->pPrevSt
13a70 6d 74 20 3d 20 70 2d 3e 70 4e 65 78 74 53 74 6d  mt = p->pNextStm
13a80 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 0;.    }.   
13a90 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
13aa0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
13ab0 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
13ac0 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20 20  >origDbSize;.   
13ad0 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28   memoryTruncate(
13ae0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61  pPager);.    pPa
13af0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
13b00 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
13b10 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
13b20 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  ARED;.    return
13b30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
13b40 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
13b50 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21 70  dirtyCache || !p
13b60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
13b70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  en ){.    rc = p
13b80 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
13b90 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
13ba0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
13bb0 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  1;.    return rc
13bc0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
13bd0 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20  ger->errMask!=0 
13be0 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  && pPager->errMa
13bf0 73 6b 21 3d 50 41 47 45 52 5f 45 52 52 5f 46 55  sk!=PAGER_ERR_FU
13c00 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  LL ){.    if( pP
13c10 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
13c20 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a  ER_EXCLUSIVE ){.
13c30 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79        pager_play
13c40 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b  back(pPager, 1);
13c50 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
13c60 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  n pager_errcode(
13c70 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
13c80 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
13c90 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
13ca0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
13cb0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
13cc0 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61  reload_cache(pPa
13cd0 67 65 72 29 3b 0a 20 20 20 20 72 63 32 20 3d 20  ger);.    rc2 = 
13ce0 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
13cf0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  k(pPager);.    i
13d00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13d10 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
13d20 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  c2;.    }.  }els
13d30 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  e{.    rc = page
13d40 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
13d50 72 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28  r, 1);.  }.  if(
13d60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13d70 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
13d80 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 70  E_CORRUPT;.    p
13d90 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c  Pager->errMask |
13da0 3d 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52  = PAGER_ERR_CORR
13db0 55 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  UPT;.  }.  pPage
13dc0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
13dd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13de0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
13df0 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  E if the databas
13e00 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  e file is opened
13e10 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74   read-only.  Ret
13e20 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20  urn FALSE.** if 
13e30 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
13e40 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74  (in theory) writ
13e50 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  able..*/.int sql
13e60 69 74 65 33 70 61 67 65 72 5f 69 73 72 65 61 64  ite3pager_isread
13e70 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67  only(Pager *pPag
13e80 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
13e90 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a  ager->readOnly;.
13ea0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
13eb0 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
13ec0 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
13ed0 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a  alysis only..*/.
13ee0 69 6e 74 20 2a 73 71 6c 69 74 65 33 70 61 67 65  int *sqlite3page
13ef0 72 5f 73 74 61 74 73 28 50 61 67 65 72 20 2a 70  r_stats(Pager *p
13f00 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63  Pager){.  static
13f10 20 69 6e 74 20 61 5b 39 5d 3b 0a 20 20 61 5b 30   int a[9];.  a[0
13f20 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  ] = pPager->nRef
13f30 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67 65  ;.  a[1] = pPage
13f40 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d  r->nPage;.  a[2]
13f50 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67   = pPager->mxPag
13f60 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67  e;.  a[3] = pPag
13f70 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b  er->dbSize;.  a[
13f80 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61  4] = pPager->sta
13f90 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61  te;.  a[5] = pPa
13fa0 67 65 72 2d 3e 65 72 72 4d 61 73 6b 3b 0a 20 20  ger->errMask;.  
13fb0 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[6] = pPager->n
13fc0 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50  Hit;.  a[7] = pP
13fd0 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61  ager->nMiss;.  a
13fe0 5b 38 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4f  [8] = pPager->nO
13ff0 76 66 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b  vfl;.  return a;
14000 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
14010 65 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c  e statement roll
14020 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a  back point..**.*
14030 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
14040 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
14050 77 69 74 68 20 74 68 65 20 74 72 61 6e 73 61 63  with the transac
14060 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72  tion journal alr
14070 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41  eady.** open.  A
14080 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 20 6a   new statement j
14090 6f 75 72 6e 61 6c 20 69 73 20 63 72 65 61 74 65  ournal is create
140a0 64 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  d that can be us
140b0 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a  ed to rollback.*
140c0 2a 20 63 68 61 6e 67 65 73 20 6f 66 20 61 20 73  * changes of a s
140d0 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e  ingle SQL comman
140e0 64 20 77 69 74 68 69 6e 20 61 20 6c 61 72 67 65  d within a large
140f0 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  r transaction..*
14100 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
14110 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28 50 61  er_stmt_begin(Pa
14120 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
14130 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a  int rc;.  char z
14140 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50  Temp[SQLITE_TEMP
14150 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 20 20 61 73  NAME_SIZE];.  as
14160 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73  sert( !pPager->s
14170 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20 54 52  tmtInUse );.  TR
14180 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49 4e  ACE2("STMT-BEGIN
14190 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e   %d\n", pPager->
141a0 66 64 2e 68 29 3b 0a 20 20 69 66 28 20 70 50 61  fd.h);.  if( pPa
141b0 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
141c0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
141d0 55 73 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  Use = 1;.    pPa
141e0 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
141f0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
14200 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14210 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
14220 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
14230 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70 50 61 67  Open ){.    pPag
14240 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e  er->stmtAutoopen
14250 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
14260 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
14270 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
14280 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
14290 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  .  pPager->aInSt
142a0 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  mt = sqliteMallo
142b0 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  c( pPager->dbSiz
142c0 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28  e/8 + 1 );.  if(
142d0 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
142e0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
142f0 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72  e3OsLock(&pPager
14300 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
14310 4b 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  K);.    return S
14320 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
14330 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
14340 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
14350 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72  FileSize(&pPager
14360 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e  ->jfd, &pPager->
14370 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66  stmtJSize);.  if
14380 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74  ( rc ) goto stmt
14390 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20  _begin_failed;. 
143a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
143b0 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 0a 20  >stmtJSize == . 
143c0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2a     pPager->nRec*
143d0 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
143e0 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f  ager) + JOURNAL_
143f0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
14400 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65  ;.#endif.  pPage
14410 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 0a 20  r->stmtJSize =. 
14420 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
14430 2a 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70  *JOURNAL_PG_SZ(p
14440 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c  Pager) + JOURNAL
14450 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
14460 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  .  pPager->stmtS
14470 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
14480 53 69 7a 65 3b 0a 20 20 69 66 28 20 21 70 50 61  Size;.  if( !pPa
14490 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b  ger->stmtOpen ){
144a0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
144b0 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28  3pager_opentemp(
144c0 7a 54 65 6d 70 2c 20 26 70 50 61 67 65 72 2d 3e  zTemp, &pPager->
144d0 73 74 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  stfd);.    if( r
144e0 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65  c ) goto stmt_be
144f0 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  gin_failed;.    
14500 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
14510 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
14520 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a  ->stmtNRec = 0;.
14530 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
14540 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72  mtInUse = 1;.  r
14550 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14560 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61  . .stmt_begin_fa
14570 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67  iled:.  if( pPag
14580 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20  er->aInStmt ){. 
14590 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
145a0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a  ager->aInStmt);.
145b0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
145c0 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  tmt = 0;.  }.  r
145d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
145e0 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74  ** Commit a stat
145f0 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ement..*/.int sq
14600 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f  lite3pager_stmt_
14610 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50  commit(Pager *pP
14620 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
14630 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
14640 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
14650 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 54 52  , *pNext;.    TR
14660 41 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49  ACE2("STMT-COMMI
14670 54 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d  T %d\n", pPager-
14680 3e 66 64 2e 68 29 3b 0a 20 20 20 20 69 66 28 20  >fd.h);.    if( 
14690 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29  !pPager->memDb )
146a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
146b0 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 73  sSeek(&pPager->s
146c0 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f  tfd, 0);.      /
146d0 2a 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  * sqlite3OsTrunc
146e0 61 74 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66  ate(&pPager->stf
146f0 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20  d, 0); */.      
14700 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67  sqliteFree( pPag
14710 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a 20  er->aInStmt );. 
14720 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
14730 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Stmt = 0;.    }.
14740 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
14750 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20  er->pStmt; pPg; 
14760 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  pPg=pNext){.    
14770 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70    pNext = pPg->p
14780 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20 20 20 20  NextStmt;.      
14790 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 53  assert( pPg->inS
147a0 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50 67  tmt );.      pPg
147b0 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
147c0 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74      pPg->pPrevSt
147d0 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53  mt = pPg->pNextS
147e0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  tmt = 0;.      i
147f0 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  f( pPager->memDb
14800 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69   ){.        PgHi
14810 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
14820 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
14830 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
14840 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48     sqliteFree(pH
14850 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20  ist->pStmt);.   
14860 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
14870 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
14880 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
14890 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20  >stmtNRec = 0;. 
148a0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49     pPager->stmtI
148b0 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  nUse = 0;.    pP
148c0 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
148d0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
148e0 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b  tmtAutoopen = 0;
148f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14900 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  _OK;.}../*.** Ro
14910 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65  llback a stateme
14920 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
14930 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 72 6f 6c  e3pager_stmt_rol
14940 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
14950 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
14960 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
14970 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 54  mtInUse ){.    T
14980 52 41 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c  RACE2("STMT-ROLL
14990 42 41 43 4b 20 25 64 5c 6e 22 2c 20 70 50 61 67  BACK %d\n", pPag
149a0 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20 20 69  er->fd.h);.    i
149b0 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  f( pPager->memDb
149c0 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20   ){.      PgHdr 
149d0 2a 70 50 67 3b 0a 20 20 20 20 20 20 66 6f 72 28  *pPg;.      for(
149e0 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d  pPg=pPager->pStm
149f0 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  t; pPg; pPg=pPg-
14a00 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20 20  >pNextStmt){.   
14a10 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
14a20 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
14a30 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
14a40 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
14a50 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a  pHist->pStmt ){.
14a60 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
14a70 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
14a80 50 67 29 2c 20 70 48 69 73 74 2d 3e 70 53 74 6d  Pg), pHist->pStm
14a90 74 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  t, pPager->pageS
14aa0 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ize);.          
14ab0 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74  sqliteFree(pHist
14ac0 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  ->pStmt);.      
14ad0 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
14ae0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
14af0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
14b00 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
14b10 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b  Pager->stmtSize;
14b20 0a 20 20 20 20 20 20 6d 65 6d 6f 72 79 54 72 75  .      memoryTru
14b30 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20  ncate(pPager);. 
14b40 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
14b50 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
14b60 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
14b70 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70  _stmt_playback(p
14b80 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
14b90 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73    sqlite3pager_s
14ba0 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65  tmt_commit(pPage
14bb0 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
14bc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14bd0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
14be0 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b  tmtAutoopen = 0;
14bf0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14c00 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
14c10 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
14c20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
14c30 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
14c40 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65  har *sqlite3page
14c50 72 5f 66 69 6c 65 6e 61 6d 65 28 50 61 67 65 72  r_filename(Pager
14c60 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
14c70 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  urn pPager->zFil
14c80 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
14c90 53 65 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f  Set the codec fo
14ca0 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a  r this pager.*/.
14cb0 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
14cc0 72 5f 73 65 74 5f 63 6f 64 65 63 28 0a 20 20 50  r_set_codec(.  P
14cd0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20  ager *pPager,.  
14ce0 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 29 28 76  void (*xCodec)(v
14cf0 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c  oid*,void*,Pgno,
14d00 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43  int),.  void *pC
14d10 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61  odecArg.){.  pPa
14d20 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43  ger->xCodec = xC
14d30 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e  odec;.  pPager->
14d40 70 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64  pCodecArg = pCod
14d50 65 63 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ecArg;.}../*.** 
14d60 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  Sync the databas
14d70 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70  e file for the p
14d80 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61  ager pPager. zMa
14d90 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74  ster points to t
14da0 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20  he name.** of a 
14db0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
14dc0 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ile that should 
14dd0 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
14de0 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a  the individual.*
14df0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
14e00 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e  zMaster may be N
14e10 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e  ULL, which is in
14e20 74 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20  terpreted as no 
14e30 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
14e40 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61  l (a single data
14e50 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
14e60 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  )..**.** This ro
14e70 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68  utine ensures th
14e80 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  at the journal i
14e90 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69  s synced, all di
14ea0 72 74 79 20 70 61 67 65 73 20 77 72 69 74 74 65  rty pages writte
14eb0 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61  n.** to the data
14ec0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68  base file and th
14ed0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14ee0 73 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79  synced. The only
14ef0 20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72   thing that.** r
14f00 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74  emains to commit
14f10 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
14f20 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68   is to delete th
14f30 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
14f40 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75  or.** master jou
14f50 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65  rnal file if spe
14f60 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e  cified)..**.** N
14f70 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73  ote that if zMas
14f80 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20  ter==NULL, this 
14f90 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69  does not overwri
14fa0 74 65 20 61 20 70 72 65 76 69 6f 75 73 20 76 61  te a previous va
14fb0 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f  lue.** passed to
14fc0 20 61 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72   an sqlite3pager
14fd0 5f 73 79 6e 63 28 29 20 63 61 6c 6c 2e 0a 2a 2f  _sync() call..*/
14fe0 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
14ff0 72 5f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50  r_sync(Pager *pP
15000 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ager, const char
15010 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
15020 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
15030 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
15040 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
15050 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20  db, or no pages 
15060 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
15070 6e 20 74 6f 2c 20 74 68 69 73 0a 20 20 2a 2a 20  n to, this.  ** 
15080 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
15090 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
150a0 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26  !pPager->memDb &
150b0 26 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43  & pPager->dirtyC
150c0 61 63 68 65 20 29 7b 0a 20 20 20 20 50 67 48 64  ache ){.    PgHd
150d0 72 20 2a 70 50 67 3b 0a 20 20 20 20 61 73 73 65  r *pPg;.    asse
150e0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
150f0 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20  nalOpen );..    
15100 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  /* Sync the jour
15110 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  nal file */.    
15120 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
15130 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
15140 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
15150 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
15160 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 20 20 20 20  sync_exit;..    
15170 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72  /* Write all dir
15180 74 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ty pages to the 
15190 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
151a0 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72  .    pPg = pager
151b0 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70  _get_all_dirty_p
151c0 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20  ages(pPager);.  
151d0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
151e0 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29  te_pagelist(pPg)
151f0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
15200 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
15210 79 6e 63 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f  ync_exit;..    /
15220 2a 20 49 66 20 61 6e 79 20 70 61 67 65 73 20 77  * If any pages w
15230 65 72 65 20 61 63 74 75 61 6c 6c 79 20 77 72 69  ere actually wri
15240 74 74 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 64  tten, sync the d
15250 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
15260 20 20 20 20 69 66 28 20 70 50 67 20 26 26 20 21      if( pPg && !
15270 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
15280 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
15290 69 74 65 33 4f 73 53 79 6e 63 28 26 70 50 61 67  ite3OsSync(&pPag
152a0 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 7d 0a 20  er->fd);.    }. 
152b0 20 7d 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20   }..sync_exit:. 
152c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
152d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
152e0 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  UG./*.** Return 
152f0 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
15300 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6c 6f  e of the file lo
15310 63 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ck for the given
15320 20 70 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 72   pager..** The r
15330 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 6f  eturn value is o
15340 6e 65 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53  ne of NO_LOCK, S
15350 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45  HARED_LOCK, RESE
15360 52 56 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45  RVED_LOCK,.** PE
15370 4e 44 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45  NDING_LOCK, or E
15380 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
15390 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
153a0 65 72 5f 6c 6f 63 6b 73 74 61 74 65 28 50 61 67  er_lockstate(Pag
153b0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
153c0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 66 64  eturn pPager->fd
153d0 2e 6c 6f 63 6b 74 79 70 65 3b 0a 7d 0a 23 65 6e  .locktype;.}.#en
153e0 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
153f0 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 50 72  TE_TEST./*.** Pr
15400 69 6e 74 20 61 20 6c 69 73 74 69 6e 67 20 6f 66  int a listing of
15410 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 64 20   all referenced 
15420 70 61 67 65 73 20 61 6e 64 20 74 68 65 69 72 20  pages and their 
15430 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f  ref count..*/.vo
15440 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
15450 72 65 66 64 75 6d 70 28 50 61 67 65 72 20 2a 70  refdump(Pager *p
15460 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
15470 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70 50 67 3d  *pPg;.  for(pPg=
15480 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
15490 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
154a0 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70  tAll){.    if( p
154b0 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29 20 63 6f  Pg->nRef<=0 ) co
154c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 72 69 6e  ntinue;.    prin
154d0 74 66 28 22 50 41 47 45 20 25 33 64 20 61 64 64  tf("PAGE %3d add
154e0 72 3d 30 78 25 30 38 78 20 6e 52 65 66 3d 25 64  r=0x%08x nRef=%d
154f0 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67  \n", .       pPg
15500 2d 3e 70 67 6e 6f 2c 20 28 69 6e 74 29 50 47 48  ->pgno, (int)PGH
15510 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
15520 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d   pPg->nRef);.  }
15530 0a 7d 0a 23 65 6e 64 69 66 0a                    .}.#endif.