/ Hex Artifact Content
Login

Artifact 43556f37b80efdccb853dbf86b3d09470d791d0d:


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 30  : pager.c,v 1.10
0350: 36 20 32 30 30 34 2f 30 35 2f 31 30 20 31 30 3a  6 2004/05/10 10:
0360: 33 34 3a 34 39 20 64 61 6e 69 65 6c 6b 31 39 37  34:49 danielk197
0370: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c  7 Exp $.*/.#incl
0380: 75 64 65 20 22 6f 73 2e 68 22 20 20 20 20 20 20  ude "os.h"      
0390: 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 66 69     /* Must be fi
03a0: 72 73 74 20 74 6f 20 65 6e 61 62 6c 65 20 6c 61  rst to enable la
03b0: 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74  rge file support
03c0: 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71   */.#include "sq
03d0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c  liteInt.h".#incl
03e0: 75 64 65 20 22 70 61 67 65 72 2e 68 22 0a 23 69  ude "pager.h".#i
03f0: 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68  nclude <assert.h
0400: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69  >.#include <stri
0410: 6e 67 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63  ng.h>../*.** Mac
0420: 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65 73  ros for troubles
0430: 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61 6c  hooting.  Normal
0440: 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f  ly turned off.*/
0450: 0a 23 69 66 20 30 0a 73 74 61 74 69 63 20 50 61  .#if 0.static Pa
0460: 67 65 72 20 2a 6d 61 69 6e 50 61 67 65 72 20 3d  ger *mainPager =
0470: 20 30 3b 0a 23 64 65 66 69 6e 65 20 53 45 54 5f   0;.#define SET_
0480: 50 41 47 45 52 28 58 29 20 20 69 66 28 20 6d 61  PAGER(X)  if( ma
0490: 69 6e 50 61 67 65 72 3d 3d 30 20 29 20 6d 61 69  inPager==0 ) mai
04a0: 6e 50 61 67 65 72 20 3d 20 28 58 29 0a 23 64 65  nPager = (X).#de
04b0: 66 69 6e 65 20 43 4c 52 5f 50 41 47 45 52 28 58  fine CLR_PAGER(X
04c0: 29 20 20 69 66 28 20 6d 61 69 6e 50 61 67 65 72  )  if( mainPager
04d0: 3d 3d 28 58 29 20 29 20 6d 61 69 6e 50 61 67 65  ==(X) ) mainPage
04e0: 72 20 3d 20 30 0a 23 64 65 66 69 6e 65 20 54 52  r = 0.#define TR
04f0: 41 43 45 31 28 58 29 20 20 20 20 20 69 66 28 20  ACE1(X)     if( 
0500: 70 50 61 67 65 72 3d 3d 6d 61 69 6e 50 61 67 65  pPager==mainPage
0510: 72 20 29 20 66 70 72 69 6e 74 66 28 73 74 64 65  r ) fprintf(stde
0520: 72 72 2c 58 29 0a 23 64 65 66 69 6e 65 20 54 52  rr,X).#define TR
0530: 41 43 45 32 28 58 2c 59 29 20 20 20 69 66 28 20  ACE2(X,Y)   if( 
0540: 70 50 61 67 65 72 3d 3d 6d 61 69 6e 50 61 67 65  pPager==mainPage
0550: 72 20 29 20 66 70 72 69 6e 74 66 28 73 74 64 65  r ) fprintf(stde
0560: 72 72 2c 58 2c 59 29 0a 23 64 65 66 69 6e 65 20  rr,X,Y).#define 
0570: 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 20 69 66  TRACE3(X,Y,Z) if
0580: 28 20 70 50 61 67 65 72 3d 3d 6d 61 69 6e 50 61  ( pPager==mainPa
0590: 67 65 72 20 29 20 66 70 72 69 6e 74 66 28 73 74  ger ) fprintf(st
05a0: 64 65 72 72 2c 58 2c 59 2c 5a 29 0a 23 65 6c 73  derr,X,Y,Z).#els
05b0: 65 0a 23 64 65 66 69 6e 65 20 53 45 54 5f 50 41  e.#define SET_PA
05c0: 47 45 52 28 58 29 0a 23 64 65 66 69 6e 65 20 43  GER(X).#define C
05d0: 4c 52 5f 50 41 47 45 52 28 58 29 0a 23 64 65 66  LR_PAGER(X).#def
05e0: 69 6e 65 20 54 52 41 43 45 31 28 58 29 0a 23 64  ine TRACE1(X).#d
05f0: 65 66 69 6e 65 20 54 52 41 43 45 32 28 58 2c 59  efine TRACE2(X,Y
0600: 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 33  ).#define TRACE3
0610: 28 58 2c 59 2c 5a 29 0a 23 65 6e 64 69 66 0a 0a  (X,Y,Z).#endif..
0620: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ./*.** The page 
0630: 63 61 63 68 65 20 61 73 20 61 20 77 68 6f 6c 65  cache as a whole
0640: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e   is always in on
0650: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
0660: 6e 67 0a 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a  ng.** states:.**
0670: 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 55 4e 4c  .**   SQLITE_UNL
0680: 4f 43 4b 20 20 20 20 20 20 20 54 68 65 20 70 61  OCK       The pa
0690: 67 65 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ge cache is not 
06a0: 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e  currently readin
06b0: 67 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20  g or .**        
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
06d0: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
06e0: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 72 65  ase file.  There
06f0: 20 69 73 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20   is no.**       
0700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0710: 64 61 74 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d  data held in mem
0720: 6f 72 79 2e 20 20 54 68 69 73 20 69 73 20 74 68  ory.  This is th
0730: 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20  e initial.**    
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0750: 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20     state..**.** 
0760: 20 20 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43    SQLITE_READLOC
0770: 4b 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63  K     The page c
0780: 61 63 68 65 20 69 73 20 72 65 61 64 69 6e 67 20  ache is reading 
0790: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07b0: 20 20 20 20 20 20 20 57 72 69 74 69 6e 67 20 69         Writing i
07c0: 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e  s not permitted.
07d0: 20 20 54 68 65 72 65 20 63 61 6e 20 62 65 0a 2a    There can be.*
07e0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
07f0: 20 20 20 20 20 20 20 20 6d 75 6c 74 69 70 6c 65          multiple
0800: 20 72 65 61 64 65 72 73 20 61 63 63 65 73 73 69   readers accessi
0810: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
0820: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
0840: 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
0850: 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c  ime..**.**   SQL
0860: 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 20 20  ITE_WRITELOCK   
0870: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0880: 69 73 20 77 72 69 74 69 6e 67 20 74 68 65 20 64  is writing the d
0890: 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20  atabase..**     
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08b0: 20 20 41 63 63 65 73 73 20 69 73 20 65 78 63 6c    Access is excl
08c0: 75 73 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72  usive.  No other
08d0: 20 70 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a   processes or.**
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08f0: 20 20 20 20 20 20 20 74 68 72 65 61 64 73 20 63         threads c
0900: 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 6f 72  an be reading or
0910: 20 77 72 69 74 69 6e 67 20 77 68 69 6c 65 20 6f   writing while o
0920: 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ne.**           
0930: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63              proc
0940: 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 2e 0a  ess is writing..
0950: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63  **.** The page c
0960: 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69 6e  ache comes up in
0970: 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 2e 20   SQLITE_UNLOCK. 
0980: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
0990: 61 0a 2a 2a 20 73 71 6c 69 74 65 5f 70 61 67 65  a.** sqlite_page
09a0: 5f 67 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74  _get() occurs, t
09b0: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
09c0: 69 6f 6e 73 20 74 6f 20 53 51 4c 49 54 45 5f 52  ions to SQLITE_R
09d0: 45 41 44 4c 4f 43 4b 2e 0a 2a 2a 20 41 66 74 65  EADLOCK..** Afte
09e0: 72 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65  r all pages have
09f0: 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20 75   been released u
0a00: 73 69 6e 67 20 73 71 6c 69 74 65 5f 70 61 67 65  sing sqlite_page
0a10: 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65  _unref(),.** the
0a20: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
0a30: 6e 73 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54  ns back to SQLIT
0a40: 45 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66  E_UNLOCK.  The f
0a50: 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74 68 61  irst time.** tha
0a60: 74 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 77 72  t sqlite_page_wr
0a70: 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2c  ite() is called,
0a80: 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73   the state trans
0a90: 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20 53 51 4c  itions to.** SQL
0aa0: 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 2e 20 20  ITE_WRITELOCK.  
0ab0: 28 4e 6f 74 65 20 74 68 61 74 20 73 71 6c 69 74  (Note that sqlit
0ac0: 65 5f 70 61 67 65 5f 77 72 69 74 65 28 29 20 63  e_page_write() c
0ad0: 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63 61  an only be.** ca
0ae0: 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73 74  lled on an outst
0af0: 61 6e 64 69 6e 67 20 70 61 67 65 20 77 68 69 63  anding page whic
0b00: 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  h means that the
0b10: 20 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20 62   pager must.** b
0b20: 65 20 69 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  e in SQLITE_READ
0b30: 4c 4f 43 4b 20 62 65 66 6f 72 65 20 69 74 20 74  LOCK before it t
0b40: 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 53 51  ransitions to SQ
0b50: 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 2e 29  LITE_WRITELOCK.)
0b60: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 70  .** The sqlite_p
0b70: 61 67 65 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 61  age_rollback() a
0b80: 6e 64 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 63  nd sqlite_page_c
0b90: 6f 6d 6d 69 74 28 29 20 66 75 6e 63 74 69 6f 6e  ommit() function
0ba0: 73 20 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  s .** transition
0bb0: 20 74 68 65 20 73 74 61 74 65 20 66 72 6f 6d 20   the state from 
0bc0: 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b  SQLITE_WRITELOCK
0bd0: 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f   back to SQLITE_
0be0: 52 45 41 44 4c 4f 43 4b 2e 0a 2a 2f 0a 23 64 65  READLOCK..*/.#de
0bf0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e 4c 4f  fine SQLITE_UNLO
0c00: 43 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e  CK      0.#defin
0c10: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43  e SQLITE_READLOC
0c20: 4b 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20 53  K    1.#define S
0c30: 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20  QLITE_WRITELOCK 
0c40: 20 20 32 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68    2.../*.** Each
0c50: 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65   in-memory image
0c60: 20 6f 66 20 61 20 70 61 67 65 20 62 65 67 69 6e   of a page begin
0c70: 73 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  s with the follo
0c80: 77 69 6e 67 20 68 65 61 64 65 72 2e 0a 2a 2a 20  wing header..** 
0c90: 54 68 69 73 20 68 65 61 64 65 72 20 69 73 20 6f  This header is o
0ca0: 6e 6c 79 20 76 69 73 69 62 6c 65 20 74 6f 20 74  nly visible to t
0cb0: 68 69 73 20 70 61 67 65 72 20 6d 6f 64 75 6c 65  his pager module
0cc0: 2e 20 20 54 68 65 20 63 6c 69 65 6e 74 0a 2a 2a  .  The client.**
0cd0: 20 63 6f 64 65 20 74 68 61 74 20 63 61 6c 6c 73   code that calls
0ce0: 20 70 61 67 65 72 20 73 65 65 73 20 6f 6e 6c 79   pager sees only
0cf0: 20 74 68 65 20 64 61 74 61 20 74 68 61 74 20 66   the data that f
0d00: 6f 6c 6c 6f 77 73 20 74 68 65 20 68 65 61 64 65  ollows the heade
0d10: 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20  r..**.** Client 
0d20: 63 6f 64 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c  code should call
0d30: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
0d40: 69 74 65 28 29 20 6f 6e 20 61 20 70 61 67 65 20  ite() on a page 
0d50: 70 72 69 6f 72 20 74 6f 20 6d 61 6b 69 6e 67 0a  prior to making.
0d60: 2a 2a 20 61 6e 79 20 6d 6f 64 69 66 69 63 61 74  ** any modificat
0d70: 69 6f 6e 73 20 74 6f 20 74 68 61 74 20 70 61 67  ions to that pag
0d80: 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69  e.  The first ti
0d90: 6d 65 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  me sqlite3pager_
0da0: 77 72 69 74 65 28 29 0a 2a 2a 20 69 73 20 63 61  write().** is ca
0db0: 6c 6c 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e  lled, the origin
0dc0: 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  al page contents
0dd0: 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74   are written int
0de0: 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a  o the rollback.*
0df0: 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67  * journal and Pg
0e00: 48 64 72 2e 69 6e 4a 6f 75 72 6e 61 6c 20 61 6e  Hdr.inJournal an
0e10: 64 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  d PgHdr.needSync
0e20: 20 61 72 65 20 73 65 74 2e 20 20 4c 61 74 65 72   are set.  Later
0e30: 2c 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 6a 6f  , once.** the jo
0e40: 75 72 6e 61 6c 20 70 61 67 65 20 68 61 73 20 6d  urnal page has m
0e50: 61 64 65 20 69 74 20 6f 6e 74 6f 20 74 68 65 20  ade it onto the 
0e60: 64 69 73 6b 20 73 75 72 66 61 63 65 2c 20 50 67  disk surface, Pg
0e70: 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 2a 2a 20  Hdr.needSync.** 
0e80: 69 73 20 63 6c 65 61 72 65 64 2e 20 20 54 68 65  is cleared.  The
0e90: 20 6d 6f 64 69 66 69 65 64 20 70 61 67 65 20 63   modified page c
0ea0: 61 6e 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e  annot be written
0eb0: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6f   back into the o
0ec0: 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62  riginal.** datab
0ed0: 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74  ase file until t
0ee0: 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 73  he journal pages
0ef0: 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
0f00: 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 74 68 65   to disk and the
0f10: 0a 2a 2a 20 50 67 48 64 72 2e 6e 65 65 64 53 79  .** PgHdr.needSy
0f20: 6e 63 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61  nc has been clea
0f30: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  red..**.** The P
0f40: 67 48 64 72 2e 64 69 72 74 79 20 66 6c 61 67 20  gHdr.dirty flag 
0f50: 69 73 20 73 65 74 20 77 68 65 6e 20 73 71 6c 69  is set when sqli
0f60: 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29  te3pager_write()
0f70: 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 0a 2a   is called and.*
0f80: 2a 20 69 73 20 63 6c 65 61 72 65 64 20 61 67 61  * is cleared aga
0f90: 69 6e 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  in when the page
0fa0: 20 63 6f 6e 74 65 6e 74 20 69 73 20 77 72 69 74   content is writ
0fb0: 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ten back to the 
0fc0: 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61  original.** data
0fd0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 74 79  base file..*/.ty
0fe0: 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67 48  pedef struct PgH
0ff0: 64 72 20 50 67 48 64 72 3b 0a 73 74 72 75 63 74  dr PgHdr;.struct
1000: 20 50 67 48 64 72 20 7b 0a 20 20 50 61 67 65 72   PgHdr {.  Pager
1010: 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20   *pPager;       
1020: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1030: 20 70 61 67 65 72 20 74 6f 20 77 68 69 63 68 20   pager to which 
1040: 74 68 69 73 20 70 61 67 65 20 62 65 6c 6f 6e 67  this page belong
1050: 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  s */.  Pgno pgno
1060: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1070: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
1080: 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69  e number for thi
1090: 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64  s page */.  PgHd
10a0: 72 20 2a 70 4e 65 78 74 48 61 73 68 2c 20 2a 70  r *pNextHash, *p
10b0: 50 72 65 76 48 61 73 68 3b 20 20 2f 2a 20 48 61  PrevHash;  /* Ha
10c0: 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61  sh collision cha
10d0: 69 6e 20 66 6f 72 20 50 67 48 64 72 2e 70 67 6e  in for PgHdr.pgn
10e0: 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b  o */.  int nRef;
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1100: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1110: 6f 66 20 75 73 65 72 73 20 6f 66 20 74 68 69 73  of users of this
1120: 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72   page */.  PgHdr
1130: 20 2a 70 4e 65 78 74 46 72 65 65 2c 20 2a 70 50   *pNextFree, *pP
1140: 72 65 76 46 72 65 65 3b 20 20 2f 2a 20 46 72 65  revFree;  /* Fre
1150: 65 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 77  elist of pages w
1160: 68 65 72 65 20 6e 52 65 66 3d 3d 30 20 2a 2f 0a  here nRef==0 */.
1170: 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 41 6c    PgHdr *pNextAl
1180: 6c 2c 20 2a 70 50 72 65 76 41 6c 6c 3b 20 20 20  l, *pPrevAll;   
1190: 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c   /* A list of al
11a0: 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48  l pages */.  PgH
11b0: 64 72 20 2a 70 4e 65 78 74 43 6b 70 74 2c 20 2a  dr *pNextCkpt, *
11c0: 70 50 72 65 76 43 6b 70 74 3b 20 20 2f 2a 20 4c  pPrevCkpt;  /* L
11d0: 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ist of pages in 
11e0: 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a  the checkpoint j
11f0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69  ournal */.  u8 i
1200: 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  nJournal;       
1210: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
1220: 55 45 20 69 66 20 68 61 73 20 62 65 65 6e 20 77  UE if has been w
1230: 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61  ritten to journa
1240: 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 43 6b 70 74  l */.  u8 inCkpt
1250: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1260: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66        /* TRUE if
1270: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1280: 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  checkpoint journ
1290: 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79  al */.  u8 dirty
12a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12b0: 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69         /* TRUE i
12c0: 66 20 77 65 20 6e 65 65 64 20 74 6f 20 77 72 69  f we need to wri
12d0: 74 65 20 62 61 63 6b 20 63 68 61 6e 67 65 73 20  te back changes 
12e0: 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63  */.  u8 needSync
12f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1300: 20 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75 72      /* Sync jour
1310: 6e 61 6c 20 62 65 66 6f 72 65 20 77 72 69 74 69  nal before writi
1320: 6e 67 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  ng this page */.
1330: 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62    u8 alwaysRollb
1340: 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ack;            
1350: 20 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e 74   /* Disable dont
1360: 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20  _rollback() for 
1370: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50  this page */.  P
1380: 67 48 64 72 20 2a 70 44 69 72 74 79 3b 20 20 20  gHdr *pDirty;   
1390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13a0: 20 44 69 72 74 79 20 70 61 67 65 73 20 73 6f 72   Dirty pages sor
13b0: 74 65 64 20 62 79 20 50 67 48 64 72 2e 70 67 6e  ted by PgHdr.pgn
13c0: 6f 20 2a 2f 0a 20 20 2f 2a 20 53 51 4c 49 54 45  o */.  /* SQLITE
13d0: 5f 50 41 47 45 5f 53 49 5a 45 20 62 79 74 65 73  _PAGE_SIZE bytes
13e0: 20 6f 66 20 70 61 67 65 20 64 61 74 61 20 66 6f   of page data fo
13f0: 6c 6c 6f 77 20 74 68 69 73 20 68 65 61 64 65 72  llow this header
1400: 20 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72 2e 6e   */.  /* Pager.n
1410: 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20 6c  Extra bytes of l
1420: 6f 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c 6f 77  ocal data follow
1430: 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20 2a   the page data *
1440: 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d  /.};.../*.** A m
1450: 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69 6e  acro used for in
1460: 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65 63  voking the codec
1470: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
1480: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
1490: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64 65  E_HAS_CODEC.# de
14a0: 66 69 6e 65 20 43 4f 44 45 43 28 50 2c 44 2c 4e  fine CODEC(P,D,N
14b0: 2c 58 29 20 69 66 28 20 50 2d 3e 78 43 6f 64 65  ,X) if( P->xCode
14c0: 63 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28 50  c ){ P->xCodec(P
14d0: 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c  ->pCodecArg,D,N,
14e0: 58 29 3b 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65  X); }.#else.# de
14f0: 66 69 6e 65 20 43 4f 44 45 43 28 50 2c 44 2c 4e  fine CODEC(P,D,N
1500: 2c 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,X).#endif../*.*
1510: 2a 20 43 6f 6e 76 65 72 74 20 61 20 70 6f 69 6e  * Convert a poin
1520: 74 65 72 20 74 6f 20 61 20 50 67 48 64 72 20 69  ter to a PgHdr i
1530: 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  nto a pointer to
1540: 20 69 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e 64   its data.** and
1550: 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f 0a   back again..*/.
1560: 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f  #define PGHDR_TO
1570: 5f 44 41 54 41 28 50 29 20 20 28 28 76 6f 69 64  _DATA(P)  ((void
1580: 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a 23 64 65  *)(&(P)[1])).#de
1590: 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47 48  fine DATA_TO_PGH
15a0: 44 52 28 44 29 20 20 28 26 28 28 50 67 48 64 72  DR(D)  (&((PgHdr
15b0: 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65 66  *)(D))[-1]).#def
15c0: 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45 58 54  ine PGHDR_TO_EXT
15d0: 52 41 28 50 29 20 28 28 76 6f 69 64 2a 29 26 28  RA(P) ((void*)&(
15e0: 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31 5d 29  (char*)(&(P)[1])
15f0: 29 5b 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  )[SQLITE_PAGE_SI
1600: 5a 45 5d 29 0a 0a 2f 2a 0a 2a 2a 20 48 6f 77 20  ZE])../*.** How 
1610: 62 69 67 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  big to make the 
1620: 68 61 73 68 20 74 61 62 6c 65 20 75 73 65 64 20  hash table used 
1630: 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20 69 6e 2d  for locating in-
1640: 6d 65 6d 6f 72 79 20 70 61 67 65 73 0a 2a 2a 20  memory pages.** 
1650: 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  by page number..
1660: 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 50 47 5f  */.#define N_PG_
1670: 48 41 53 48 20 32 30 34 38 0a 0a 2f 2a 0a 2a 2a  HASH 2048../*.**
1680: 20 48 61 73 68 20 61 20 70 61 67 65 20 6e 75 6d   Hash a page num
1690: 62 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70  ber.*/.#define p
16a0: 61 67 65 72 5f 68 61 73 68 28 50 4e 29 20 20 28  ager_hash(PN)  (
16b0: 28 50 4e 29 26 28 4e 5f 50 47 5f 48 41 53 48 2d  (PN)&(N_PG_HASH-
16c0: 31 29 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65  1))../*.** A ope
16d0: 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  n page cache is 
16e0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
16f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
1700: 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63  ucture..*/.struc
1710: 74 20 50 61 67 65 72 20 7b 0a 20 20 63 68 61 72  t Pager {.  char
1720: 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20   *zFilename;    
1730: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1740: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1750: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
1760: 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  zJournal;       
1770: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1780: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1790: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69  e */.  char *zDi
17a0: 72 65 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20  rectory;        
17b0: 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20     /* Directory 
17c0: 68 6f 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e  hold database an
17d0: 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  d journal files 
17e0: 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 66 64 2c 20  */.  OsFile fd, 
17f0: 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  jfd;            
1800: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
1810: 74 6f 72 73 20 66 6f 72 20 64 61 74 61 62 61 73  tors for databas
1820: 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f  e and journal */
1830: 0a 20 20 4f 73 46 69 6c 65 20 63 70 66 64 3b 20  .  OsFile cpfd; 
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1850: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
1860: 72 20 66 6f 72 20 74 68 65 20 63 68 65 63 6b 70  r for the checkp
1870: 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  oint journal */.
1880: 20 20 69 6e 74 20 64 62 53 69 7a 65 3b 20 20 20    int dbSize;   
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18a0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
18b0: 20 69 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   in the file */.
18c0: 20 20 69 6e 74 20 6f 72 69 67 44 62 53 69 7a 65    int origDbSize
18d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
18e0: 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74   dbSize before t
18f0: 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67  he current chang
1900: 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6b 70 74 53  e */.  int ckptS
1910: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
1920: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61     /* Size of da
1930: 74 61 62 61 73 65 20 28 69 6e 20 70 61 67 65 73  tabase (in pages
1940: 29 20 61 74 20 63 6b 70 74 5f 62 65 67 69 6e 28  ) at ckpt_begin(
1950: 29 20 2a 2f 0a 20 20 6f 66 66 5f 74 20 63 6b 70  ) */.  off_t ckp
1960: 74 4a 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  tJSize;         
1970: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f     /* Size of jo
1980: 75 72 6e 61 6c 20 61 74 20 63 6b 70 74 5f 62 65  urnal at ckpt_be
1990: 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e  gin() */.  int n
19a0: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
19b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
19c0: 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65   of pages writte
19d0: 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
19e0: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49   */.  u32 cksumI
19f0: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
1a00: 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f    /* Quasi-rando
1a10: 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f  m value added to
1a20: 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20   every checksum 
1a30: 2a 2f 0a 20 20 69 6e 74 20 63 6b 70 74 4e 52 65  */.  int ckptNRe
1a40: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1a50: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
1a60: 63 6f 72 64 73 20 69 6e 20 74 68 65 20 63 68 65  cords in the che
1a70: 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20  ckpoint journal 
1a80: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 3b  */.  int nExtra;
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa0: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
1ab0: 79 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20  y bytes to each 
1ac0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
1ad0: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74  /.  void (*xDest
1ae0: 72 75 63 74 6f 72 29 28 76 6f 69 64 2a 29 3b 20  ructor)(void*); 
1af0: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
1b00: 74 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69 6e  tine when freein
1b10: 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  g pages */.  int
1b20: 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
1b30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
1b40: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  l number of in-m
1b50: 65 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f 0a 20  emory pages */. 
1b60: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b80: 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  Number of in-mem
1b90: 6f 72 79 20 70 61 67 65 73 20 77 69 74 68 20 50  ory pages with P
1ba0: 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20  gHdr.nRef>0 */. 
1bb0: 20 69 6e 74 20 6d 78 50 61 67 65 3b 20 20 20 20   int mxPage;    
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bd0: 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
1be0: 66 20 70 61 67 65 73 20 74 6f 20 68 6f 6c 64 20  f pages to hold 
1bf0: 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 69 6e  in cache */.  in
1c00: 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 2c 20 6e  t nHit, nMiss, n
1c10: 4f 76 66 6c 3b 20 20 20 20 20 2f 2a 20 43 61 63  Ovfl;     /* Cac
1c20: 68 65 20 68 69 74 73 2c 20 6d 69 73 73 69 6e 67  he hits, missing
1c30: 2c 20 61 6e 64 20 4c 52 55 20 6f 76 65 72 66 6c  , and LRU overfl
1c40: 6f 77 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ows */.  void (*
1c50: 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f  xCodec)(void*,vo
1c60: 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f  id*,Pgno,int); /
1c70: 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e  * Routine for en
1c80: 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a  /decoding data *
1c90: 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63  /.  void *pCodec
1ca0: 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Arg;            
1cb0: 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
1cc0: 74 20 74 6f 20 78 43 6f 64 65 63 28 29 20 2a 2f  t to xCodec() */
1cd0: 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65  .  u8 journalOpe
1ce0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n;             /
1cf0: 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61  * True if journa
1d00: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
1d10: 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20  rs is valid */. 
1d20: 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74   u8 journalStart
1d30: 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ed;          /* 
1d40: 54 72 75 65 20 69 66 20 68 65 61 64 65 72 20 6f  True if header o
1d50: 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  f journal is syn
1d60: 63 65 64 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a  ced */.  u8 useJ
1d70: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
1d80: 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f       /* Use a ro
1d90: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f  llback journal o
1da0: 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  n this file */. 
1db0: 20 75 38 20 63 6b 70 74 4f 70 65 6e 3b 20 20 20   u8 ckptOpen;   
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dd0: 54 72 75 65 20 69 66 20 74 68 65 20 63 68 65 63  True if the chec
1de0: 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  kpoint journal i
1df0: 73 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20 63  s open */.  u8 c
1e00: 6b 70 74 49 6e 55 73 65 3b 20 20 20 20 20 20 20  kptInUse;       
1e10: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1e20: 77 65 20 61 72 65 20 69 6e 20 61 20 63 68 65 63  we are in a chec
1e30: 6b 70 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 63  kpoint */.  u8 c
1e40: 6b 70 74 41 75 74 6f 6f 70 65 6e 3b 20 20 20 20  kptAutoopen;    
1e50: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
1e60: 63 6b 70 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65  ckpt journal whe
1e70: 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69  n main journal i
1e80: 73 20 6f 70 65 6e 65 64 2a 2f 0a 20 20 75 38 20  s opened*/.  u8 
1e90: 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  noSync;         
1ea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
1eb0: 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  ot sync the jour
1ec0: 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  nal if true */. 
1ed0: 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20   u8 fullSync;   
1ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ef0: 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20 6f  Do extra syncs o
1f00: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  f the journal fo
1f10: 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a  r robustness */.
1f20: 20 20 75 38 20 73 74 61 74 65 3b 20 20 20 20 20    u8 state;     
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f40: 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 2c 20   SQLITE_UNLOCK, 
1f50: 5f 52 45 41 44 4c 4f 43 4b 20 6f 72 20 5f 57 52  _READLOCK or _WR
1f60: 49 54 45 4c 4f 43 4b 20 2a 2f 0a 20 20 75 38 20  ITELOCK */.  u8 
1f70: 65 72 72 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  errMask;        
1f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
1f90: 6f 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73  of several kinds
1fa0: 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20   of errors */.  
1fb0: 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20  u8 tempFile;    
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
1fd0: 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65  Filename is a te
1fe0: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a  mporary file */.
1ff0: 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20    u8 readOnly;  
2000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2010: 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64   True for a read
2020: 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
2030: 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b  /.  u8 needSync;
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2050: 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 66 73  /* True if an fs
2060: 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65 64 20  ync() is needed 
2070: 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  on the journal *
2080: 2f 0a 20 20 75 38 20 64 69 72 74 79 46 69 6c 65  /.  u8 dirtyFile
2090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20a0: 2f 2a 20 54 72 75 65 20 69 66 20 64 61 74 61 62  /* True if datab
20b0: 61 73 65 20 66 69 6c 65 20 68 61 73 20 63 68 61  ase file has cha
20c0: 6e 67 65 64 20 69 6e 20 61 6e 79 20 77 61 79 20  nged in any way 
20d0: 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f  */.  u8 alwaysRo
20e0: 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20  llback;         
20f0: 20 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e 74   /* Disable dont
2100: 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20  _rollback() for 
2110: 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75  all pages */.  u
2120: 38 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20  8 *aInJournal;  
2130: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
2140: 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70  e bit for each p
2150: 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
2160: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  ase file */.  u8
2170: 20 2a 61 49 6e 43 6b 70 74 3b 20 20 20 20 20 20   *aInCkpt;      
2180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
2190: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61   bit for each pa
21a0: 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
21b0: 73 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  se */.  PgHdr *p
21c0: 46 69 72 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20  First, *pLast;  
21d0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
21e0: 72 65 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50  ree pages */.  P
21f0: 67 48 64 72 20 2a 70 46 69 72 73 74 53 79 6e 63  gHdr *pFirstSync
2200: 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ed;        /* Fi
2210: 72 73 74 20 66 72 65 65 20 70 61 67 65 20 77 69  rst free page wi
2220: 74 68 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  th PgHdr.needSyn
2230: 63 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20  c==0 */.  PgHdr 
2240: 2a 70 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  *pAll;          
2250: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
2260: 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20   all pages */.  
2270: 50 67 48 64 72 20 2a 70 43 6b 70 74 3b 20 20 20  PgHdr *pCkpt;   
2280: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2290: 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ist of pages in 
22a0: 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a  the checkpoint j
22b0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64  ournal */.  PgHd
22c0: 72 20 2a 61 48 61 73 68 5b 4e 5f 50 47 5f 48 41  r *aHash[N_PG_HA
22d0: 53 48 5d 3b 20 20 20 20 2f 2a 20 48 61 73 68 20  SH];    /* Hash 
22e0: 74 61 62 6c 65 20 74 6f 20 6d 61 70 20 70 61 67  table to map pag
22f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 50 67 48 64  e number of PgHd
2300: 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  r */.};../*.** T
2310: 68 65 73 65 20 61 72 65 20 62 69 74 73 20 74 68  hese are bits th
2320: 61 74 20 63 61 6e 20 62 65 20 73 65 74 20 69 6e  at can be set in
2330: 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 2e 0a   Pager.errMask..
2340: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
2350: 5f 45 52 52 5f 46 55 4c 4c 20 20 20 20 20 30 78  _ERR_FULL     0x
2360: 30 31 20 20 2f 2a 20 61 20 77 72 69 74 65 28 29  01  /* a write()
2370: 20 66 61 69 6c 65 64 20 2a 2f 0a 23 64 65 66 69   failed */.#defi
2380: 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d  ne PAGER_ERR_MEM
2390: 20 20 20 20 20 20 30 78 30 32 20 20 2f 2a 20 6d        0x02  /* m
23a0: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 2a  alloc() failed *
23b0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
23c0: 45 52 52 5f 4c 4f 43 4b 20 20 20 20 20 30 78 30  ERR_LOCK     0x0
23d0: 34 20 20 2f 2a 20 65 72 72 6f 72 20 69 6e 20 74  4  /* error in t
23e0: 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f  he locking proto
23f0: 63 6f 6c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  col */.#define P
2400: 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54  AGER_ERR_CORRUPT
2410: 20 20 30 78 30 38 20 20 2f 2a 20 64 61 74 61 62    0x08  /* datab
2420: 61 73 65 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 63  ase or journal c
2430: 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 23 64 65  orruption */.#de
2440: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 44  fine PAGER_ERR_D
2450: 49 53 4b 20 20 20 20 20 30 78 31 30 20 20 2f 2a  ISK     0x10  /*
2460: 20 67 65 6e 65 72 61 6c 20 64 69 73 6b 20 49 2f   general disk I/
2470: 4f 20 65 72 72 6f 72 20 2d 20 62 61 64 20 68 61  O error - bad ha
2480: 72 64 20 64 72 69 76 65 3f 20 2a 2f 0a 0a 2f 2a  rd drive? */../*
2490: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
24a0: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 70 61  file contains pa
24b0: 67 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68  ge records in th
24c0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 66  e following.** f
24d0: 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 41 63 74  ormat..**.** Act
24e0: 75 61 6c 6c 79 2c 20 74 68 69 73 20 73 74 72 75  ually, this stru
24f0: 63 74 75 72 65 20 69 73 20 74 68 65 20 63 6f 6d  cture is the com
2500: 70 6c 65 74 65 20 70 61 67 65 20 72 65 63 6f 72  plete page recor
2510: 64 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 66  d for pager.** f
2520: 6f 72 6d 61 74 73 20 6c 65 73 73 20 74 68 61 6e  ormats less than
2530: 20 33 2e 20 20 42 65 67 69 6e 6e 69 6e 67 20 77   3.  Beginning w
2540: 69 74 68 20 66 6f 72 6d 61 74 20 33 2c 20 74 68  ith format 3, th
2550: 69 73 20 72 65 63 6f 72 64 20 69 73 20 73 75 72  is record is sur
2560: 72 6f 75 6e 64 65 64 0a 2a 2a 20 62 79 20 74 77  rounded.** by tw
2570: 6f 20 63 68 65 63 6b 73 75 6d 73 2e 0a 2a 2f 0a  o checksums..*/.
2580: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
2590: 61 67 65 52 65 63 6f 72 64 20 50 61 67 65 52 65  ageRecord PageRe
25a0: 63 6f 72 64 3b 0a 73 74 72 75 63 74 20 50 61 67  cord;.struct Pag
25b0: 65 52 65 63 6f 72 64 20 7b 0a 20 20 50 67 6e 6f  eRecord {.  Pgno
25c0: 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
25e0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  he page number *
25f0: 2f 0a 20 20 63 68 61 72 20 61 44 61 74 61 5b 53  /.  char aData[S
2600: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 5d  QLITE_PAGE_SIZE]
2610: 3b 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20  ;   /* Original 
2620: 64 61 74 61 20 66 6f 72 20 70 61 67 65 20 70 67  data for page pg
2630: 6e 6f 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  no */.};../*.** 
2640: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
2650: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
2660: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
2670: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
2680: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
2690: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
26a0: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
26b0: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
26c0: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  eck..**.** There
26d0: 20 61 72 65 20 74 68 72 65 65 20 6a 6f 75 72 6e   are three journ
26e0: 61 6c 20 66 6f 72 6d 61 74 73 20 28 73 6f 20 66  al formats (so f
26f0: 61 72 29 2e 20 54 68 65 20 31 73 74 20 6a 6f 75  ar). The 1st jou
2700: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 77 72 69 74  rnal format writ
2710: 65 73 0a 2a 2a 20 33 32 2d 62 69 74 20 69 6e 74  es.** 32-bit int
2720: 65 67 65 72 73 20 69 6e 20 74 68 65 20 62 79 74  egers in the byt
2730: 65 2d 6f 72 64 65 72 20 6f 66 20 74 68 65 20 68  e-order of the h
2740: 6f 73 74 20 6d 61 63 68 69 6e 65 2e 20 20 4e 65  ost machine.  Ne
2750: 77 0a 2a 2a 20 66 6f 72 6d 61 74 73 20 77 72 69  w.** formats wri
2760: 74 65 73 20 69 6e 74 65 67 65 72 73 20 61 73 20  tes integers as 
2770: 62 69 67 2d 65 6e 64 69 61 6e 2e 20 20 41 6c 6c  big-endian.  All
2780: 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 73 20 75 73   new journals us
2790: 65 20 74 68 65 0a 2a 2a 20 6e 65 77 20 66 6f 72  e the.** new for
27a0: 6d 61 74 2c 20 62 75 74 20 77 65 20 68 61 76 65  mat, but we have
27b0: 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 72   to be able to r
27c0: 65 61 64 20 61 6e 20 6f 6c 64 65 72 20 6a 6f 75  ead an older jou
27d0: 72 6e 61 6c 20 69 6e 20 6f 72 64 65 72 0a 2a 2a  rnal in order.**
27e0: 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75   to rollback jou
27f0: 72 6e 61 6c 73 20 63 72 65 61 74 65 64 20 62 79  rnals created by
2800: 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20   older versions 
2810: 6f 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a  of the library..
2820: 2a 2a 0a 2a 2a 20 54 68 65 20 33 72 64 20 6a 6f  **.** The 3rd jo
2830: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 28 61 64  urnal format (ad
2840: 64 65 64 20 66 6f 72 20 32 2e 38 2e 30 29 20 61  ded for 2.8.0) a
2850: 64 64 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73  dds additional s
2860: 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e  anity.** checkin
2870: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  g information to
2880: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
2890: 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c  f the power fail
28a0: 73 20 77 68 69 6c 65 20 74 68 65 0a 2a 2a 20 6a  s while the.** j
28b0: 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20  ournal is being 
28c0: 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61  written, semi-ra
28d0: 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74  ndom garbage dat
28e0: 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69  a might appear i
28f0: 6e 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n.** the journal
2900: 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65   file after powe
2910: 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20  r is restored.  
2920: 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  If an attempt is
2930: 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f   then made.** to
2940: 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61   roll the journa
2950: 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  l back, the data
2960: 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f  base could be co
2970: 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64  rrupted.  The ad
2980: 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69  ditional.** sani
2990: 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61  ty checking data
29a0: 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74   is an attempt t
29b0: 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67  o discover the g
29c0: 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  arbage in the.**
29d0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e   journal and ign
29e0: 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ore it..**.** Th
29f0: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
2a00: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
2a10: 72 20 74 68 65 20 33 72 64 20 6a 6f 75 72 6e 61  r the 3rd journa
2a20: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74  l format consist
2a30: 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74  s.** of a 32-bit
2a40: 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63   checksum on eac
2a50: 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20  h page of data. 
2a60: 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f   The checksum co
2a70: 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65  vers both.** the
2a80: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
2a90: 20 74 68 65 20 53 51 4c 49 54 45 5f 50 41 47 45   the SQLITE_PAGE
2aa0: 5f 53 49 5a 45 20 62 79 74 65 73 20 6f 66 20 64  _SIZE bytes of d
2ab0: 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65  ata for the page
2ac0: 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20  ..** This cksum 
2ad0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
2ae0: 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f  o a 32-bit rando
2af0: 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70  m value that app
2b00: 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a  ears in the.** j
2b10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68  ournal file righ
2b20: 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64  t after the head
2b30: 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20  er.  The random 
2b40: 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69  initializer is i
2b50: 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63  mportant,.** bec
2b60: 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74  ause garbage dat
2b70: 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  a that appears a
2b80: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a  t the end of a j
2b90: 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79  ournal is likely
2ba0: 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61  .** data that wa
2bb0: 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20  s once in other 
2bc0: 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20  files that have 
2bd0: 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64  now been deleted
2be0: 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72  .  If the.** gar
2bf0: 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66  bage data came f
2c00: 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20  rom an obsolete 
2c10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
2c20: 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68  e checksums migh
2c30: 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e  t.** be correct.
2c40: 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c    But by initial
2c50: 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73  izing the checks
2c60: 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c  um to random val
2c70: 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64  ue which.** is d
2c80: 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65  ifferent for eve
2c90: 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d  ry journal, we m
2ca0: 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73  inimize that ris
2cb0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  k..*/.static con
2cc0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
2cd0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 31 5b   aJournalMagic1[
2ce0: 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78  ] = {.  0xd9, 0x
2cf0: 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20  d5, 0x05, 0xf9, 
2d00: 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33  0x20, 0xa1, 0x63
2d10: 2c 20 30 78 64 34 2c 0a 7d 3b 0a 73 74 61 74 69  , 0xd4,.};.stati
2d20: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
2d30: 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61   char aJournalMa
2d40: 67 69 63 32 5b 5d 20 3d 20 7b 0a 20 20 30 78 64  gic2[] = {.  0xd
2d50: 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30  9, 0xd5, 0x05, 0
2d60: 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c  xf9, 0x20, 0xa1,
2d70: 20 30 78 36 33 2c 20 30 78 64 35 2c 0a 7d 3b 0a   0x63, 0xd5,.};.
2d80: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
2d90: 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72  igned char aJour
2da0: 6e 61 6c 4d 61 67 69 63 33 5b 5d 20 3d 20 7b 0a  nalMagic3[] = {.
2db0: 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78    0xd9, 0xd5, 0x
2dc0: 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20  05, 0xf9, 0x20, 
2dd0: 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 36  0xa1, 0x63, 0xd6
2de0: 2c 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 4a 4f 55  ,.};.#define JOU
2df0: 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 31 20 31 0a  RNAL_FORMAT_1 1.
2e00: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
2e10: 46 4f 52 4d 41 54 5f 32 20 32 0a 23 64 65 66 69  FORMAT_2 2.#defi
2e20: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41  ne JOURNAL_FORMA
2e30: 54 5f 33 20 33 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  T_3 3../*.** The
2e40: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 74 65 67   following integ
2e50: 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  er determines wh
2e60: 61 74 20 66 6f 72 6d 61 74 20 74 6f 20 75 73 65  at format to use
2e70: 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 0a 2a   when creating.*
2e80: 2a 20 6e 65 77 20 70 72 69 6d 61 72 79 20 6a 6f  * new primary jo
2e90: 75 72 6e 61 6c 20 66 69 6c 65 73 2e 20 20 42 79  urnal files.  By
2ea0: 20 64 65 66 61 75 6c 74 20 77 65 20 61 6c 77 61   default we alwa
2eb0: 79 73 20 75 73 65 20 66 6f 72 6d 61 74 20 33 2e  ys use format 3.
2ec0: 0a 2a 2a 20 57 68 65 6e 20 74 65 73 74 69 6e 67  .** When testing
2ed0: 2c 20 77 65 20 63 61 6e 20 73 65 74 20 74 68 69  , we can set thi
2ee0: 73 20 76 61 6c 75 65 20 74 6f 20 6f 6c 64 65 72  s value to older
2ef0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 73   journal formats
2f00: 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20   in order to.** 
2f10: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 6e  make sure that n
2f20: 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  ewer versions of
2f30: 20 74 68 65 20 6c 69 62 72 61 72 79 20 61 72 65   the library are
2f40: 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63   able to rollbac
2f50: 6b 20 6f 6c 64 65 72 0a 2a 2a 20 6a 6f 75 72 6e  k older.** journ
2f60: 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  al files..**.** 
2f70: 4e 6f 74 65 20 74 68 61 74 20 63 68 65 63 6b 70  Note that checkp
2f80: 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 61 6c  oint journals al
2f90: 77 61 79 73 20 75 73 65 20 66 6f 72 6d 61 74 20  ways use format 
2fa0: 32 20 61 6e 64 20 6f 6d 69 74 20 74 68 65 20 68  2 and omit the h
2fb0: 65 61 64 65 72 2e 0a 2a 2f 0a 23 69 66 64 65 66  eader..*/.#ifdef
2fc0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
2fd0: 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 20   journal_format 
2fe0: 3d 20 33 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66  = 3;.#else.# def
2ff0: 69 6e 65 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d  ine journal_form
3000: 61 74 20 33 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  at 3.#endif../*.
3010: 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  ** The size of t
3020: 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 6f 66  he header and of
3030: 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68   each page in th
3040: 65 20 6a 6f 75 72 6e 61 6c 20 76 61 72 69 65 73  e journal varies
3050: 20 61 63 63 6f 72 64 69 6e 67 0a 2a 2a 20 74 6f   according.** to
3060: 20 77 68 69 63 68 20 6a 6f 75 72 6e 61 6c 20 66   which journal f
3070: 6f 72 6d 61 74 20 69 73 20 62 65 69 6e 67 20 75  ormat is being u
3080: 73 65 64 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  sed.  The follow
3090: 69 6e 67 20 6d 61 63 72 6f 73 20 66 69 67 75 72  ing macros figur
30a0: 65 20 6f 75 74 0a 2a 2a 20 74 68 65 20 73 69 7a  e out.** the siz
30b0: 65 73 20 62 61 73 65 64 20 6f 6e 20 66 6f 72 6d  es based on form
30c0: 61 74 20 6e 75 6d 62 65 72 73 2e 0a 2a 2f 0a 23  at numbers..*/.#
30d0: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48  define JOURNAL_H
30e0: 44 52 5f 53 5a 28 58 29 20 5c 0a 20 20 20 28 73  DR_SZ(X) \.   (s
30f0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
3100: 67 69 63 31 29 20 2b 20 73 69 7a 65 6f 66 28 50  gic1) + sizeof(P
3110: 67 6e 6f 29 20 2b 20 28 28 58 29 3e 3d 33 29 2a  gno) + ((X)>=3)*
3120: 32 2a 73 69 7a 65 6f 66 28 75 33 32 29 29 0a 23  2*sizeof(u32)).#
3130: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50  define JOURNAL_P
3140: 47 5f 53 5a 28 58 29 20 5c 0a 20 20 20 28 53 51  G_SZ(X) \.   (SQ
3150: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 20 2b  LITE_PAGE_SIZE +
3160: 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 20 2b 20   sizeof(Pgno) + 
3170: 28 28 58 29 3e 3d 33 29 2a 73 69 7a 65 6f 66 28  ((X)>=3)*sizeof(
3180: 75 33 32 29 29 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61  u32))../*.** Ena
3190: 62 6c 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  ble reference co
31a0: 75 6e 74 20 74 72 61 63 6b 69 6e 67 20 68 65 72  unt tracking her
31b0: 65 3a 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e:.*/.#ifdef SQL
31c0: 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 70  ITE_TEST.  int p
31d0: 61 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e  ager3_refinfo_en
31e0: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 73 74 61 74  able = 0;.  stat
31f0: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65  ic void pager_re
3200: 66 69 6e 66 6f 28 50 67 48 64 72 20 2a 70 29 7b  finfo(PgHdr *p){
3210: 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e 74 20  .    static int 
3220: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  cnt = 0;.    if(
3230: 20 21 70 61 67 65 72 33 5f 72 65 66 69 6e 66 6f   !pager3_refinfo
3240: 5f 65 6e 61 62 6c 65 20 29 20 72 65 74 75 72 6e  _enable ) return
3250: 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 0a 20 20  ;.    printf(.  
3260: 20 20 20 20 20 22 52 45 46 43 4e 54 3a 20 25 34       "REFCNT: %4
3270: 64 20 61 64 64 72 3d 30 78 25 30 38 78 20 6e 52  d addr=0x%08x nR
3280: 65 66 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ef=%d\n",.      
3290: 20 70 2d 3e 70 67 6e 6f 2c 20 28 69 6e 74 29 50   p->pgno, (int)P
32a0: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c  GHDR_TO_DATA(p),
32b0: 20 70 2d 3e 6e 52 65 66 0a 20 20 20 20 29 3b 0a   p->nRef.    );.
32c0: 20 20 20 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20      cnt++;   /* 
32d0: 53 6f 6d 65 74 68 69 6e 67 20 74 6f 20 73 65 74  Something to set
32e0: 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 6f 6e   a breakpoint on
32f0: 20 2a 2f 0a 20 20 7d 0a 23 20 64 65 66 69 6e 65   */.  }.# define
3300: 20 52 45 46 49 4e 46 4f 28 58 29 20 20 70 61 67   REFINFO(X)  pag
3310: 65 72 5f 72 65 66 69 6e 66 6f 28 58 29 0a 23 65  er_refinfo(X).#e
3320: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 52 45 46  lse.# define REF
3330: 49 4e 46 4f 28 58 29 0a 23 65 6e 64 69 66 0a 0a  INFO(X).#endif..
3340: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d  /*.** Read a 32-
3350: 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  bit integer from
3360: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
3370: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f  descriptor.  Sto
3380: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  re the integer.*
3390: 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69  * that is read i
33a0: 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e  n *pRes.  Return
33b0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
33c0: 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c  erything worked,
33d0: 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20   or an.** error 
33e0: 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e  code is somethin
33f0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  g goes wrong..**
3400: 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
3410: 61 6c 20 66 6f 72 6d 61 74 20 69 73 20 32 20 6f  al format is 2 o
3420: 72 20 33 2c 20 72 65 61 64 20 61 20 62 69 67 2d  r 3, read a big-
3430: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 2e 20  endian integer. 
3440: 20 49 66 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   If the.** journ
3450: 61 6c 20 66 6f 72 6d 61 74 20 69 73 20 31 2c 20  al format is 1, 
3460: 72 65 61 64 20 61 6e 20 69 6e 74 65 67 65 72 20  read an integer 
3470: 69 6e 20 74 68 65 20 6e 61 74 69 76 65 20 62 79  in the native by
3480: 74 65 2d 6f 72 64 65 72 20 6f 66 20 74 68 65 0a  te-order of the.
3490: 2a 2a 20 68 6f 73 74 20 6d 61 63 68 69 6e 65 2e  ** host machine.
34a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
34b0: 65 61 64 33 32 62 69 74 73 28 69 6e 74 20 66 6f  ead32bits(int fo
34c0: 72 6d 61 74 2c 20 4f 73 46 69 6c 65 20 2a 66 64  rmat, OsFile *fd
34d0: 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20  , u32 *pRes){.  
34e0: 75 33 32 20 72 65 73 3b 0a 20 20 69 6e 74 20 72  u32 res;.  int r
34f0: 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
3500: 33 4f 73 52 65 61 64 28 66 64 2c 20 26 72 65 73  3OsRead(fd, &res
3510: 2c 20 73 69 7a 65 6f 66 28 72 65 73 29 29 3b 0a  , sizeof(res));.
3520: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
3530: 5f 4f 4b 20 26 26 20 66 6f 72 6d 61 74 3e 4a 4f  _OK && format>JO
3540: 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 31 20 29  URNAL_FORMAT_1 )
3550: 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  {.    unsigned c
3560: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 20 20 6d  har ac[4];.    m
3570: 65 6d 63 70 79 28 61 63 2c 20 26 72 65 73 2c 20  emcpy(ac, &res, 
3580: 34 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 28 61  4);.    res = (a
3590: 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63 5b  c[0]<<24) | (ac[
35a0: 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32 5d  1]<<16) | (ac[2]
35b0: 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 20 20  <<8) | ac[3];.  
35c0: 7d 0a 20 20 2a 70 52 65 73 20 3d 20 72 65 73 3b  }.  *pRes = res;
35d0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
35e0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
35f0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
3600: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  to the given fil
3610: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52  e descriptor.  R
3620: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
3630: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  ** on success or
3640: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
3650: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
3660: 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66   wrong..**.** If
3670: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
3680: 6d 61 74 20 69 73 20 32 20 6f 72 20 33 2c 20 77  mat is 2 or 3, w
3690: 72 69 74 65 20 74 68 65 20 69 6e 74 65 67 65 72  rite the integer
36a0: 20 61 73 20 34 20 62 69 67 2d 65 6e 64 69 61 6e   as 4 big-endian
36b0: 0a 2a 2a 20 62 79 74 65 73 2e 20 20 49 66 20 74  .** bytes.  If t
36c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  he journal forma
36d0: 74 20 69 73 20 31 2c 20 77 72 69 74 65 20 74 68  t is 1, write th
36e0: 65 20 69 6e 74 65 67 65 72 20 69 6e 20 74 68 65  e integer in the
36f0: 20 6e 61 74 69 76 65 0a 2a 2a 20 62 79 74 65 20   native.** byte 
3700: 6f 72 64 65 72 2e 20 20 49 6e 20 6e 6f 72 6d 61  order.  In norma
3710: 6c 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 6e 6c  l operation, onl
3720: 79 20 66 6f 72 6d 61 74 73 20 32 20 61 6e 64 20  y formats 2 and 
3730: 33 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a 20 4a  3 are used..** J
3740: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 31 20  ournal format 1 
3750: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  is only used for
3760: 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61   testing..*/.sta
3770: 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62  tic int write32b
3780: 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20  its(OsFile *fd, 
3790: 75 33 32 20 76 61 6c 29 7b 0a 20 20 75 6e 73 69  u32 val){.  unsi
37a0: 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b  gned char ac[4];
37b0: 0a 20 20 69 66 28 20 6a 6f 75 72 6e 61 6c 5f 66  .  if( journal_f
37c0: 6f 72 6d 61 74 3c 3d 31 20 29 7b 0a 20 20 20 20  ormat<=1 ){.    
37d0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
37e0: 57 72 69 74 65 28 66 64 2c 20 26 76 61 6c 2c 20  Write(fd, &val, 
37f0: 34 29 3b 0a 20 20 7d 0a 20 20 61 63 5b 30 5d 20  4);.  }.  ac[0] 
3800: 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26 20 30 78  = (val>>24) & 0x
3810: 66 66 3b 0a 20 20 61 63 5b 31 5d 20 3d 20 28 76  ff;.  ac[1] = (v
3820: 61 6c 3e 3e 31 36 29 20 26 20 30 78 66 66 3b 0a  al>>16) & 0xff;.
3830: 20 20 61 63 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e    ac[2] = (val>>
3840: 38 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b  8) & 0xff;.  ac[
3850: 33 5d 20 3d 20 76 61 6c 20 26 20 30 78 66 66 3b  3] = val & 0xff;
3860: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
3870: 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c  3OsWrite(fd, ac,
3880: 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   4);.}../*.** Wr
3890: 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ite a 32-bit int
38a0: 65 67 65 72 20 69 6e 74 6f 20 61 20 70 61 67 65  eger into a page
38b0: 20 68 65 61 64 65 72 20 72 69 67 68 74 20 62 65   header right be
38c0: 66 6f 72 65 20 74 68 65 0a 2a 2a 20 70 61 67 65  fore the.** page
38d0: 20 64 61 74 61 2e 20 20 54 68 69 73 20 77 69 6c   data.  This wil
38e0: 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 20  l overwrite the 
38f0: 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69  PgHdr.pDirty poi
3900: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nter..**.** The 
3910: 69 6e 74 65 67 65 72 20 69 73 20 62 69 67 2d 65  integer is big-e
3920: 6e 64 69 61 6e 20 66 6f 72 20 66 6f 72 6d 61 74  ndian for format
3930: 73 20 32 20 61 6e 64 20 33 20 61 6e 64 20 6e 61  s 2 and 3 and na
3940: 74 69 76 65 20 62 79 74 65 20 6f 72 64 65 72 0a  tive byte order.
3950: 2a 2a 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  ** for journal f
3960: 6f 72 6d 61 74 20 31 2e 0a 2a 2f 0a 73 74 61 74  ormat 1..*/.stat
3970: 69 63 20 76 6f 69 64 20 73 74 6f 72 65 33 32 62  ic void store32b
3980: 69 74 73 28 75 33 32 20 76 61 6c 2c 20 50 67 48  its(u32 val, PgH
3990: 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65  dr *p, int offse
39a0: 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  t){.  unsigned c
39b0: 68 61 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20  har *ac;.  ac = 
39c0: 26 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  &((unsigned char
39d0: 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  *)PGHDR_TO_DATA(
39e0: 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69  p))[offset];.  i
39f0: 66 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61  f( journal_forma
3a00: 74 3c 3d 31 20 29 7b 0a 20 20 20 20 6d 65 6d 63  t<=1 ){.    memc
3a10: 70 79 28 61 63 2c 20 26 76 61 6c 2c 20 34 29 3b  py(ac, &val, 4);
3a20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 63  .  }else{.    ac
3a30: 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34 29 20  [0] = (val>>24) 
3a40: 26 20 30 78 66 66 3b 0a 20 20 20 20 61 63 5b 31  & 0xff;.    ac[1
3a50: 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26 20  ] = (val>>16) & 
3a60: 30 78 66 66 3b 0a 20 20 20 20 61 63 5b 32 5d 20  0xff;.    ac[2] 
3a70: 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66  = (val>>8) & 0xf
3a80: 66 3b 0a 20 20 20 20 61 63 5b 33 5d 20 3d 20 76  f;.    ac[3] = v
3a90: 61 6c 20 26 20 30 78 66 66 3b 0a 20 20 7d 0a 7d  al & 0xff;.  }.}
3aa0: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  .../*.** Convert
3ab0: 20 74 68 65 20 62 69 74 73 20 69 6e 20 74 68 65   the bits in the
3ac0: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
3ad0: 20 69 6e 74 6f 20 61 6e 20 61 70 70 72 6f 70 72   into an appropr
3ae0: 61 74 65 0a 2a 2a 20 72 65 74 75 72 6e 20 63 6f  ate.** return co
3af0: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
3b00: 74 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  t pager_errcode(
3b10: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
3b20: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
3b30: 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
3b40: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41  er->errMask & PA
3b50: 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 29 20 20  GER_ERR_LOCK )  
3b60: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 52    rc = SQLITE_PR
3b70: 4f 54 4f 43 4f 4c 3b 0a 20 20 69 66 28 20 70 50  OTOCOL;.  if( pP
3b80: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
3b90: 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 20 29  PAGER_ERR_DISK )
3ba0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
3bb0: 49 4f 45 52 52 3b 0a 20 20 69 66 28 20 70 50 61  IOERR;.  if( pPa
3bc0: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50  ger->errMask & P
3bd0: 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 20  AGER_ERR_FULL ) 
3be0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
3bf0: 55 4c 4c 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ULL;.  if( pPage
3c00: 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47  r->errMask & PAG
3c10: 45 52 5f 45 52 52 5f 4d 45 4d 20 29 20 20 20 20  ER_ERR_MEM )    
3c20: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
3c30: 45 4d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  EM;.  if( pPager
3c40: 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45  ->errMask & PAGE
3c50: 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 20 29 20  R_ERR_CORRUPT ) 
3c60: 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
3c70: 55 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  UPT;.  return rc
3c80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f  ;.}../*.** Add o
3c90: 72 20 72 65 6d 6f 76 65 20 61 20 70 61 67 65 20  r remove a page 
3ca0: 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66  from the list of
3cb0: 20 61 6c 6c 20 70 61 67 65 73 20 74 68 61 74 20   all pages that 
3cc0: 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a 20 63 68  are in the.** ch
3cd0: 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  eckpoint journal
3ce0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65  ..**.** The Page
3cf0: 72 20 6b 65 65 70 73 20 61 20 73 65 70 61 72 61  r keeps a separa
3d00: 74 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73  te list of pages
3d10: 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e   that are curren
3d20: 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65 20 63 68  tly in.** the ch
3d30: 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  eckpoint journal
3d40: 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 74 68  .  This helps th
3d50: 65 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  e sqlite3pager_s
3d60: 74 6d 74 5f 63 6f 6d 6d 69 74 28 29 0a 2a 2a 20  tmt_commit().** 
3d70: 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55 43 48  routine run MUCH
3d80: 20 66 61 73 74 65 72 20 66 6f 72 20 74 68 65 20   faster for the 
3d90: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
3da0: 65 20 74 68 65 72 65 20 61 72 65 20 6d 61 6e 79  e there are many
3db0: 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d 65 6d  .** pages in mem
3dc0: 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20 61 20 66  ory but only a f
3dd0: 65 77 20 61 72 65 20 69 6e 20 74 68 65 20 63 68  ew are in the ch
3de0: 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  eckpoint journal
3df0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3e00: 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
3e10: 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50  t_list(PgHdr *pP
3e20: 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
3e30: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
3e40: 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e  r;.  if( pPg->in
3e50: 43 6b 70 74 20 29 20 72 65 74 75 72 6e 3b 0a 20  Ckpt ) return;. 
3e60: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
3e70: 72 65 76 43 6b 70 74 3d 3d 30 20 26 26 20 70 50  revCkpt==0 && pP
3e80: 67 2d 3e 70 4e 65 78 74 43 6b 70 74 3d 3d 30 20  g->pNextCkpt==0 
3e90: 29 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 43  );.  pPg->pPrevC
3ea0: 6b 70 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  kpt = 0;.  if( p
3eb0: 50 61 67 65 72 2d 3e 70 43 6b 70 74 20 29 7b 0a  Pager->pCkpt ){.
3ec0: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 43 6b 70      pPager->pCkp
3ed0: 74 2d 3e 70 50 72 65 76 43 6b 70 74 20 3d 20 70  t->pPrevCkpt = p
3ee0: 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  Pg;.  }.  pPg->p
3ef0: 4e 65 78 74 43 6b 70 74 20 3d 20 70 50 61 67 65  NextCkpt = pPage
3f00: 72 2d 3e 70 43 6b 70 74 3b 0a 20 20 70 50 61 67  r->pCkpt;.  pPag
3f10: 65 72 2d 3e 70 43 6b 70 74 20 3d 20 70 50 67 3b  er->pCkpt = pPg;
3f20: 0a 20 20 70 50 67 2d 3e 69 6e 43 6b 70 74 20 3d  .  pPg->inCkpt =
3f30: 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69   1;.}.static voi
3f40: 64 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72  d page_remove_fr
3f50: 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48  om_stmt_list(PgH
3f60: 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
3f70: 21 70 50 67 2d 3e 69 6e 43 6b 70 74 20 29 20 72  !pPg->inCkpt ) r
3f80: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67  eturn;.  if( pPg
3f90: 2d 3e 70 50 72 65 76 43 6b 70 74 20 29 7b 0a 20  ->pPrevCkpt ){. 
3fa0: 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
3fb0: 70 50 72 65 76 43 6b 70 74 2d 3e 70 4e 65 78 74  pPrevCkpt->pNext
3fc0: 43 6b 70 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20  Ckpt==pPg );.   
3fd0: 20 70 50 67 2d 3e 70 50 72 65 76 43 6b 70 74 2d   pPg->pPrevCkpt-
3fe0: 3e 70 4e 65 78 74 43 6b 70 74 20 3d 20 70 50 67  >pNextCkpt = pPg
3ff0: 2d 3e 70 4e 65 78 74 43 6b 70 74 3b 0a 20 20 7d  ->pNextCkpt;.  }
4000: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
4010: 28 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70  ( pPg->pPager->p
4020: 43 6b 70 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20  Ckpt==pPg );.   
4030: 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 43   pPg->pPager->pC
4040: 6b 70 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  kpt = pPg->pNext
4050: 43 6b 70 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Ckpt;.  }.  if( 
4060: 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74 20 29  pPg->pNextCkpt )
4070: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
4080: 67 2d 3e 70 4e 65 78 74 43 6b 70 74 2d 3e 70 50  g->pNextCkpt->pP
4090: 72 65 76 43 6b 70 74 3d 3d 70 50 67 20 29 3b 0a  revCkpt==pPg );.
40a0: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 43 6b      pPg->pNextCk
40b0: 70 74 2d 3e 70 50 72 65 76 43 6b 70 74 20 3d 20  pt->pPrevCkpt = 
40c0: 70 50 67 2d 3e 70 50 72 65 76 43 6b 70 74 3b 0a  pPg->pPrevCkpt;.
40d0: 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74    }.  pPg->pNext
40e0: 43 6b 70 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d  Ckpt = 0;.  pPg-
40f0: 3e 70 50 72 65 76 43 6b 70 74 20 3d 20 30 3b 0a  >pPrevCkpt = 0;.
4100: 20 20 70 50 67 2d 3e 69 6e 43 6b 70 74 20 3d 20    pPg->inCkpt = 
4110: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  0;.}../*.** Find
4120: 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 68   a page in the h
4130: 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ash table given 
4140: 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  its page number.
4150: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f    Return.** a po
4160: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
4170: 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  e or NULL if not
4180: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
4190: 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c  c PgHdr *pager_l
41a0: 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
41b0: 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
41c0: 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50  .  PgHdr *p = pP
41d0: 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 61 67 65  ager->aHash[page
41e0: 72 5f 68 61 73 68 28 70 67 6e 6f 29 5d 3b 0a 20  r_hash(pgno)];. 
41f0: 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
4200: 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20  pgno!=pgno ){.  
4210: 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61    p = p->pNextHa
4220: 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  sh;.  }.  return
4230: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c   p;.}../*.** Unl
4240: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
4250: 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65 20 69   and clear the i
4260: 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20  n-memory cache. 
4270: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
4280: 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20   sets the state 
4290: 6f 66 20 74 68 65 20 70 61 67 65 72 20 62 61 63  of the pager bac
42a0: 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77 61 73  k to what it was
42b0: 20 77 68 65 6e 20 69 74 20 77 61 73 20 66 69 72   when it was fir
42c0: 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41  st.** opened.  A
42d0: 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ny outstanding p
42e0: 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64  ages are invalid
42f0: 61 74 65 64 20 61 6e 64 20 73 75 62 73 65 71 75  ated and subsequ
4300: 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20  ent attempts.** 
4310: 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65 20  to access those 
4320: 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  pages will likel
4330: 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  y result in a co
4340: 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69  redump..*/.stati
4350: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
4360: 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
4370: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c  ){.  PgHdr *pPg,
4380: 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70   *pNext;.  for(p
4390: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
43a0: 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29   pPg; pPg=pNext)
43b0: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50  {.    pNext = pP
43c0: 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
43d0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29   sqliteFree(pPg)
43e0: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
43f0: 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 70 50  pFirst = 0;.  pP
4400: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
4410: 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ed = 0;.  pPager
4420: 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70  ->pLast = 0;.  p
4430: 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b  Pager->pAll = 0;
4440: 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  .  memset(pPager
4450: 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
4460: 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
4470: 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50  ));.  pPager->nP
4480: 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  age = 0;.  if( p
4490: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 51  Pager->state>=SQ
44a0: 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 29  LITE_WRITELOCK )
44b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67  {.    sqlite3pag
44c0: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
44d0: 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  er);.  }.  sqlit
44e0: 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67  e3OsUnlock(&pPag
44f0: 65 72 2d 3e 66 64 29 3b 0a 20 20 70 50 61 67 65  er->fd);.  pPage
4500: 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54  r->state = SQLIT
4510: 45 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67  E_UNLOCK;.  pPag
4520: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
4530: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  .  pPager->nRef 
4540: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
4550: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
4560: 65 6e 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  en==0 );.}../*.*
4570: 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
4580: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
4590: 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65  he pager has the
45a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70   journal file op
45b0: 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 77 72 69 74  en and.** a writ
45c0: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
45d0: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f  tabase.  This ro
45e0: 75 74 69 6e 65 20 72 65 6c 65 61 73 65 73 20 74  utine releases t
45f0: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 77  he database.** w
4600: 72 69 74 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63  rite lock and ac
4610: 71 75 69 72 65 73 20 61 20 72 65 61 64 20 6c 6f  quires a read lo
4620: 63 6b 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e  ck in its place.
4630: 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    The journal fi
4640: 6c 65 0a 2a 2a 20 69 73 20 64 65 6c 65 74 65 64  le.** is deleted
4650: 20 61 6e 64 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a   and closed..**.
4660: 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73 69 64 65  ** TODO: Conside
4670: 72 20 6b 65 65 70 69 6e 67 20 74 68 65 20 6a 6f  r keeping the jo
4680: 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20  urnal file open 
4690: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61  for temporary da
46a0: 74 61 62 61 73 65 73 2e 0a 2a 2a 20 54 68 69 73  tabases..** This
46b0: 20 6d 69 67 68 74 20 67 69 76 65 20 61 20 70 65   might give a pe
46c0: 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76  rformance improv
46d0: 65 6d 65 6e 74 20 6f 6e 20 77 69 6e 64 6f 77 73  ement on windows
46e0: 20 77 68 65 72 65 20 6f 70 65 6e 69 6e 67 0a 2a   where opening.*
46f0: 2a 20 61 20 66 69 6c 65 20 69 73 20 61 6e 20 65  * a file is an e
4700: 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69  xpensive operati
4710: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
4720: 74 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  t pager_unwritel
4730: 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
4740: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
4750: 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 66  PgHdr *pPg;.  if
4760: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  ( pPager->state<
4770: 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b  SQLITE_WRITELOCK
4780: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
4790: 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 70 61  _OK;.  sqlite3pa
47a0: 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28  ger_stmt_commit(
47b0: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
47c0: 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20  Pager->ckptOpen 
47d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
47e0: 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 63  Close(&pPager->c
47f0: 70 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72  pfd);.    pPager
4800: 2d 3e 63 6b 70 74 4f 70 65 6e 20 3d 20 30 3b 0a  ->ckptOpen = 0;.
4810: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
4820: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
4830: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
4840: 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ose(&pPager->jfd
4850: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  );.    pPager->j
4860: 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a  ournalOpen = 0;.
4870: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
4880: 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ete(pPager->zJou
4890: 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  rnal);.    sqlit
48a0: 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61  eFree( pPager->a
48b0: 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  InJournal );.   
48c0: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
48d0: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  nal = 0;.    for
48e0: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
48f0: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
4900: 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
4910: 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
4920: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
4930: 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
4940: 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
4950: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 0;.    }.  }el
4960: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
4970: 70 50 61 67 65 72 2d 3e 64 69 72 74 79 46 69 6c  pPager->dirtyFil
4980: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
4990: 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  useJournal==0 );
49a0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
49b0: 74 65 33 4f 73 52 65 61 64 4c 6f 63 6b 28 26 70  te3OsReadLock(&p
49c0: 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 69 66  Pager->fd);.  if
49d0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
49e0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
49f0: 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 52 45  tate = SQLITE_RE
4a00: 41 44 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ADLOCK;.  }else{
4a10: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6e  .    /* This can
4a20: 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
4a30: 61 20 70 72 6f 63 65 73 73 20 64 6f 65 73 20 61  a process does a
4a40: 20 42 45 47 49 4e 2c 20 74 68 65 6e 20 66 6f 72   BEGIN, then for
4a50: 6b 73 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  ks and the.    *
4a60: 2a 20 63 68 69 6c 64 20 70 72 6f 63 65 73 73 20  * child process 
4a70: 64 6f 65 73 20 74 68 65 20 43 4f 4d 4d 49 54 2e  does the COMMIT.
4a80: 20 20 42 65 63 61 75 73 65 20 6f 66 20 74 68 65    Because of the
4a90: 20 73 65 6d 61 6e 74 69 63 73 20 6f 66 20 75 6e   semantics of un
4aa0: 69 78 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6c  ix.    ** file l
4ab0: 6f 63 6b 69 6e 67 2c 20 74 68 65 20 75 6e 6c 6f  ocking, the unlo
4ac0: 63 6b 20 77 69 6c 6c 20 66 61 69 6c 2e 0a 20 20  ck will fail..  
4ad0: 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
4ae0: 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f  >state = SQLITE_
4af0: 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 72 65  UNLOCK;.  }.  re
4b00: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
4b10: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  * Compute and re
4b20: 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
4b30: 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66 20  for the page of 
4b40: 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  data..**.** This
4b50: 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63   is not a real c
4b60: 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20  hecksum.  It is 
4b70: 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20  really just the 
4b80: 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72  sum of the .** r
4b90: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61  andom initial va
4ba0: 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  lue and the page
4bb0: 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 63 6f 6e   number.  We con
4bc0: 73 69 64 65 72 65 64 20 64 6f 20 61 20 63 68 65  sidered do a che
4bd0: 63 6b 73 75 6d 0a 2a 2a 20 6f 66 20 74 68 65 20  cksum.** of the 
4be0: 64 61 74 61 62 61 73 65 2c 20 62 75 74 20 74 68  database, but th
4bf0: 61 74 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20  at was found to 
4c00: 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2f 0a  be too slow..*/.
4c10: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
4c20: 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50  _cksum(Pager *pP
4c30: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  ager, Pgno pgno,
4c40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 44 61   const char *aDa
4c50: 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d  ta){.  u32 cksum
4c60: 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
4c70: 49 6e 69 74 20 2b 20 70 67 6e 6f 3b 0a 20 20 72  Init + pgno;.  r
4c80: 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a  eturn cksum;.}..
4c90: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e  /*.** Read a sin
4ca0: 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  gle page from th
4cb0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
4cc0: 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64 65  pened on file de
4cd0: 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e  scriptor.** jfd.
4ce0: 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69 73 20    Playback this 
4cf0: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  one page..**.** 
4d00: 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
4d10: 64 69 66 66 65 72 65 6e 74 20 6a 6f 75 72 6e 61  different journa
4d20: 6c 20 66 6f 72 6d 61 74 73 2e 20 20 54 68 65 20  l formats.  The 
4d30: 66 6f 72 6d 61 74 20 70 61 72 61 6d 65 74 65 72  format parameter
4d40: 20 64 65 74 65 72 6d 69 6e 65 73 0a 2a 2a 20 77   determines.** w
4d50: 68 69 63 68 20 66 6f 72 6d 61 74 20 69 73 20 75  hich format is u
4d60: 73 65 64 20 62 79 20 74 68 65 20 6a 6f 75 72 6e  sed by the journ
4d70: 61 6c 20 74 68 61 74 20 69 73 20 70 6c 61 79 65  al that is playe
4d80: 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  d back..*/.stati
4d90: 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79  c int pager_play
4da0: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 50 61  back_one_page(Pa
4db0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 4f 73 46  ger *pPager, OsF
4dc0: 69 6c 65 20 2a 6a 66 64 2c 20 69 6e 74 20 66 6f  ile *jfd, int fo
4dd0: 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  rmat){.  int rc;
4de0: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20  .  PgHdr *pPg;  
4df0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
4e00: 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20  n existing page 
4e10: 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  in the cache */.
4e20: 20 20 50 61 67 65 52 65 63 6f 72 64 20 70 67 52    PageRecord pgR
4e30: 65 63 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b  ec;.  u32 cksum;
4e40: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
4e50: 69 74 73 28 66 6f 72 6d 61 74 2c 20 6a 66 64 2c  its(format, jfd,
4e60: 20 26 70 67 52 65 63 2e 70 67 6e 6f 29 3b 0a 20   &pgRec.pgno);. 
4e70: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
4e80: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
4e90: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
4ea0: 52 65 61 64 28 6a 66 64 2c 20 26 70 67 52 65 63  Read(jfd, &pgRec
4eb0: 2e 61 44 61 74 61 2c 20 73 69 7a 65 6f 66 28 70  .aData, sizeof(p
4ec0: 67 52 65 63 2e 61 44 61 74 61 29 29 3b 0a 20 20  gRec.aData));.  
4ed0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
4ee0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
4ef0: 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
4f00: 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
4f10: 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20  .  This is more 
4f20: 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49  important that I
4f30: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a   originally.  **
4f40: 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20   thought.  If a 
4f50: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
4f60: 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a  curs while the j
4f70: 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20  ournal is being 
4f80: 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74  written,.  ** it
4f90: 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76   could cause inv
4fa0: 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20  alid data to be 
4fb0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
4fc0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65   journal.  We ne
4fd0: 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63  ed to.  ** detec
4fe0: 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64  t this invalid d
4ff0: 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70  ata (with high p
5000: 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20  robability) and 
5010: 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a  ignore it..  */.
5020: 20 20 69 66 28 20 70 67 52 65 63 2e 70 67 6e 6f    if( pgRec.pgno
5030: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
5040: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
5050: 20 7d 0a 20 20 69 66 28 20 70 67 52 65 63 2e 70   }.  if( pgRec.p
5060: 67 6e 6f 3e 28 75 6e 73 69 67 6e 65 64 29 70 50  gno>(unsigned)pP
5070: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
5080: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5090: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
50a0: 66 6f 72 6d 61 74 3e 3d 4a 4f 55 52 4e 41 4c 5f  format>=JOURNAL_
50b0: 46 4f 52 4d 41 54 5f 33 20 29 7b 0a 20 20 20 20  FORMAT_3 ){.    
50c0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
50d0: 66 6f 72 6d 61 74 2c 20 6a 66 64 2c 20 26 63 6b  format, jfd, &ck
50e0: 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sum);.    if( rc
50f0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
5100: 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75    if( pager_cksu
5110: 6d 28 70 50 61 67 65 72 2c 20 70 67 52 65 63 2e  m(pPager, pgRec.
5120: 70 67 6e 6f 2c 20 70 67 52 65 63 2e 61 44 61 74  pgno, pgRec.aDat
5130: 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20  a)!=cksum ){.   
5140: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5150: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
5160: 0a 0a 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20  ..  /* Playback 
5170: 74 68 65 20 70 61 67 65 2e 20 20 55 70 64 61 74  the page.  Updat
5180: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
5190: 63 6f 70 79 20 6f 66 20 74 68 65 20 70 61 67 65  copy of the page
51a0: 0a 20 20 2a 2a 20 61 74 20 74 68 65 20 73 61 6d  .  ** at the sam
51b0: 65 20 74 69 6d 65 2c 20 69 66 20 74 68 65 72 65  e time, if there
51c0: 20 69 73 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20   is one..  */.  
51d0: 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
51e0: 75 70 28 70 50 61 67 65 72 2c 20 70 67 52 65 63  up(pPager, pgRec
51f0: 2e 70 67 6e 6f 29 3b 0a 20 20 54 52 41 43 45 32  .pgno);.  TRACE2
5200: 28 22 50 4c 41 59 42 41 43 4b 20 25 64 5c 6e 22  ("PLAYBACK %d\n"
5210: 2c 20 70 67 52 65 63 2e 70 67 6e 6f 29 3b 0a 20  , pgRec.pgno);. 
5220: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
5230: 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 52  pPager->fd, (pgR
5240: 65 63 2e 70 67 6e 6f 2d 31 29 2a 28 6f 66 66 5f  ec.pgno-1)*(off_
5250: 74 29 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  t)SQLITE_PAGE_SI
5260: 5a 45 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ZE);.  rc = sqli
5270: 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67  te3OsWrite(&pPag
5280: 65 72 2d 3e 66 64 2c 20 70 67 52 65 63 2e 61 44  er->fd, pgRec.aD
5290: 61 74 61 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  ata, SQLITE_PAGE
52a0: 5f 53 49 5a 45 29 3b 0a 20 20 69 66 28 20 70 50  _SIZE);.  if( pP
52b0: 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70  g ){.    /* No p
52c0: 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20  age should ever 
52d0: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  be rolled back t
52e0: 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65  hat is in use, e
52f0: 78 63 65 70 74 20 66 6f 72 20 70 61 67 65 0a 20  xcept for page. 
5300: 20 20 20 2a 2a 20 31 20 77 68 69 63 68 20 69 73     ** 1 which is
5310: 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20   held in use in 
5320: 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68  order to keep th
5330: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
5340: 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 61 63  tabase.    ** ac
5350: 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tive..    */.   
5360: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
5370: 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67  ef==0 || pPg->pg
5380: 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 6d 65 6d  no==1 );.    mem
5390: 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  cpy(PGHDR_TO_DAT
53a0: 41 28 70 50 67 29 2c 20 70 67 52 65 63 2e 61 44  A(pPg), pgRec.aD
53b0: 61 74 61 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  ata, SQLITE_PAGE
53c0: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 69 66 28 20  _SIZE);.    if( 
53d0: 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
53e0: 74 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61  tor ){.      pPa
53f0: 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
5400: 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
5410: 50 67 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Pg));.    }.    
5420: 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
5430: 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
5440: 63 20 3d 20 30 3b 0a 20 20 20 20 43 4f 44 45 43  c = 0;.    CODEC
5450: 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54  (pPager, PGHDR_T
5460: 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 67  O_DATA(pPg), pPg
5470: 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a  ->pgno, 3);.  }.
5480: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
5490: 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74  /*.** Playback t
54a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  he journal and t
54b0: 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20  hus restore the 
54c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
54d0: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74  .** the state it
54e0: 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77   was in before w
54f0: 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67  e started making
5500: 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a   changes.  .**.*
5510: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
5520: 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20  le format is as 
5530: 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20  follows: .**.** 
5540: 20 20 20 2a 20 20 38 20 62 79 74 65 20 70 72 65     *  8 byte pre
5550: 66 69 78 2e 20 20 4f 6e 65 20 6f 66 20 74 68 65  fix.  One of the
5560: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 31 32   aJournalMagic12
5570: 33 20 76 65 63 74 6f 72 73 20 64 65 66 69 6e 65  3 vectors define
5580: 64 0a 2a 2a 20 20 20 20 20 20 20 61 62 6f 76 65  d.**       above
5590: 2e 20 20 54 68 65 20 66 6f 72 6d 61 74 20 6f 66  .  The format of
55a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
55b0: 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
55c0: 62 79 20 77 68 69 63 68 0a 2a 2a 20 20 20 20 20  by which.**     
55d0: 20 20 6f 66 20 74 68 65 20 74 68 72 65 65 20 70    of the three p
55e0: 72 65 66 69 78 20 76 65 63 74 6f 72 73 20 69 73  refix vectors is
55f0: 20 73 65 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20 20   seen..**    *  
5600: 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
5610: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
5620: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
5630: 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
5640: 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20  rds.**       in 
5650: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66  the journal.  If
5660: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30   this value is 0
5670: 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
5680: 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20  compute the.**  
5690: 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70       number of p
56a0: 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  age records from
56b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a   the journal siz
56c0: 65 2e 20 20 54 68 69 73 20 66 69 65 6c 64 20 61  e.  This field a
56d0: 70 70 65 61 72 73 0a 2a 2a 20 20 20 20 20 20 20  ppears.**       
56e0: 69 6e 20 66 6f 72 6d 61 74 20 33 20 6f 6e 6c 79  in format 3 only
56f0: 2e 0a 2a 2a 20 20 20 20 2a 20 20 34 20 62 79 74  ..**    *  4 byt
5700: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
5710: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
5720: 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
5730: 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20  for the .**     
5740: 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75    sanity checksu
5750: 6d 2e 20 20 54 68 69 73 20 66 69 65 6c 64 20 61  m.  This field a
5760: 70 70 65 61 72 73 20 69 6e 20 66 6f 72 6d 61 74  ppears in format
5770: 20 33 20 6f 6e 6c 79 2e 0a 2a 2a 20 20 20 20 2a   3 only..**    *
5780: 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
5790: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
57a0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f  mber of pages to
57b0: 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a   truncate the.**
57c0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
57d0: 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  to during a roll
57e0: 62 61 63 6b 2e 0a 2a 2a 20 20 20 20 2a 20 20 5a  back..**    *  Z
57f0: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  ero or more page
5800: 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63  s instances, eac
5810: 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  h as follows:.**
5820: 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
5830: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  e page number..*
5840: 2a 20 20 20 20 20 20 20 20 2b 20 20 53 51 4c 49  *        +  SQLI
5850: 54 45 5f 50 41 47 45 5f 53 49 5a 45 20 62 79 74  TE_PAGE_SIZE byt
5860: 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20  es of data..**  
5870: 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
5880: 63 68 65 63 6b 73 75 6d 20 28 66 6f 72 6d 61 74  checksum (format
5890: 20 33 20 6f 6e 6c 79 29 0a 2a 2a 0a 2a 2a 20 57   3 only).**.** W
58a0: 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20  hen we speak of 
58b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
58c0: 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20  er, we mean the 
58d0: 66 69 72 73 74 20 34 20 62 75 6c 6c 65 74 73 20  first 4 bullets 
58e0: 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65  above..** Each e
58f0: 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  ntry in the jour
5900: 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  nal is an instan
5910: 63 65 20 6f 66 20 74 68 65 20 35 74 68 20 62 75  ce of the 5th bu
5920: 6c 6c 65 74 2e 20 20 4e 6f 74 65 20 74 68 61 74  llet.  Note that
5930: 0a 2a 2a 20 62 75 6c 6c 65 74 73 20 32 20 61 6e  .** bullets 2 an
5940: 64 20 33 20 6f 6e 6c 79 20 61 70 70 65 61 72 20  d 3 only appear 
5950: 69 6e 20 66 6f 72 6d 61 74 2d 33 20 6a 6f 75 72  in format-3 jour
5960: 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  nals..**.** Call
5970: 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20   the value from 
5980: 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65  the second bulle
5990: 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20  t "nRec".  nRec 
59a0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
59b0: 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65  .** valid page e
59c0: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f  ntries in the jo
59d0: 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20  urnal.  In most 
59e0: 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63  cases, you can c
59f0: 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61  ompute the.** va
5a00: 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d  lue of nRec from
5a10: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
5a20: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
5a30: 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a  But if a power.*
5a40: 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  * failure occurr
5a50: 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ed while the jou
5a60: 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77  rnal was being w
5a70: 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64  ritten, it could
5a80: 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20   be the.** case 
5a90: 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66  that the size of
5aa0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5ab0: 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65  e had already be
5ac0: 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74  en increased but
5ad0: 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e  .** the extra en
5ae0: 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65  tries had not ye
5af0: 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79  t made it safely
5b00: 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75   to disk.  In su
5b10: 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68  ch a case,.** th
5b20: 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
5b30: 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68  computed from th
5b40: 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c  e file size woul
5b50: 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20  d be too large. 
5b60: 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61   For.** that rea
5b70: 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75  son, we always u
5b80: 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  se the nRec valu
5b90: 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  e in the header.
5ba0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52  .**.** If the nR
5bb0: 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  ec value is 0xff
5bc0: 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20  ffffff it means 
5bd0: 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64  that nRec should
5be0: 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20   be computed.** 
5bf0: 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
5c00: 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  ze.  This value 
5c10: 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  is used when the
5c20: 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68   user selects th
5c30: 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74  e.** no-sync opt
5c40: 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  ion for the jour
5c50: 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61  nal.  A power fa
5c60: 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64  ilure could lead
5c70: 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a   to corruption.*
5c80: 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  * in this case. 
5c90: 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20   But for things 
5ca0: 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74  like temporary t
5cb0: 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c  able (which will
5cc0: 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77   be.** deleted w
5cd0: 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73  hen the power is
5ce0: 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f   restored) we do
5cf0: 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a  n't care.  .**.*
5d00: 2a 20 4a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  * Journal format
5d10: 73 20 31 20 61 6e 64 20 32 20 64 6f 20 6e 6f 74  s 1 and 2 do not
5d20: 20 68 61 76 65 20 61 6e 20 6e 52 65 63 20 76 61   have an nRec va
5d30: 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65  lue in the heade
5d40: 72 20 73 6f 20 77 65 0a 2a 2a 20 68 61 76 65 20  r so we.** have 
5d50: 74 6f 20 63 6f 6d 70 75 74 65 20 6e 52 65 63 20  to compute nRec 
5d60: 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
5d70: 7a 65 2e 20 20 54 68 69 73 20 68 61 73 20 72 69  ze.  This has ri
5d80: 73 6b 73 20 28 61 73 20 64 65 73 63 72 69 62 65  sks (as describe
5d90: 64 0a 2a 2a 20 61 62 6f 76 65 29 20 77 68 69 63  d.** above) whic
5da0: 68 20 69 73 20 77 68 79 20 61 6c 6c 20 70 65 72  h is why all per
5db0: 73 69 73 74 65 6e 74 20 74 61 62 6c 65 73 20 68  sistent tables h
5dc0: 61 76 65 20 62 65 65 6e 20 63 68 61 6e 67 65 64  ave been changed
5dd0: 20 74 6f 20 75 73 65 0a 2a 2a 20 66 6f 72 6d 61   to use.** forma
5de0: 74 20 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  t 3..**.** If th
5df0: 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73  e file opened as
5e00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5e10: 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d  e is not a well-
5e20: 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61  formed.** journa
5e30: 6c 20 66 69 6c 65 20 74 68 65 6e 20 74 68 65 20  l file then the 
5e40: 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 6c 69  database will li
5e50: 6b 65 6c 79 20 61 6c 72 65 61 64 79 20 62 65 0a  kely already be.
5e60: 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20 73 6f  ** corrupted, so
5e70: 20 74 68 65 20 50 41 47 45 52 5f 45 52 52 5f 43   the PAGER_ERR_C
5e80: 4f 52 52 55 50 54 20 62 69 74 20 69 73 20 73 65  ORRUPT bit is se
5e90: 74 20 69 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  t in pPager->err
5ea0: 4d 61 73 6b 0a 2a 2a 20 61 6e 64 20 53 51 4c 49  Mask.** and SQLI
5eb0: 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65  TE_CORRUPT is re
5ec0: 74 75 72 6e 65 64 2e 20 20 49 66 20 69 74 20 61  turned.  If it a
5ed0: 6c 6c 20 77 6f 72 6b 73 2c 20 74 68 65 6e 20 74  ll works, then t
5ee0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
5ef0: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
5f00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5f10: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50  pager_playback(P
5f20: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
5f30: 74 20 75 73 65 4a 6f 75 72 6e 61 6c 53 69 7a 65  t useJournalSize
5f40: 29 7b 0a 20 20 6f 66 66 5f 74 20 73 7a 4a 3b 20  ){.  off_t szJ; 
5f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5f60: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   Size of the jou
5f70: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
5f80: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63  es */.  int nRec
5f90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5fa0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65   /* Number of Re
5fb0: 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75  cords in the jou
5fc0: 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  rnal */.  int i;
5fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fe0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
5ff0: 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  er */.  Pgno mxP
6000: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
6010: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
6020: 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e  original file in
6030: 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
6040: 66 6f 72 6d 61 74 3b 20 20 20 20 20 20 20 20 20  format;         
6050: 20 20 20 20 20 2f 2a 20 46 6f 72 6d 61 74 20 6f       /* Format o
6060: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
6070: 6c 65 2e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  le. */.  unsigne
6080: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 73 69  d char aMagic[si
6090: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
60a0: 69 63 31 29 5d 3b 0a 20 20 69 6e 74 20 72 63 3b  ic1)];.  int rc;
60b0: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
60c0: 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
60d0: 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f  ds are in the jo
60e0: 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61  urnal.  Abort ea
60f0: 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  rly if.  ** the 
6100: 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79  journal is empty
6110: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
6120: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
6130: 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65  Open );.  sqlite
6140: 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
6150: 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 72 63 20 3d  >jfd, 0);.  rc =
6160: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
6170: 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ze(&pPager->jfd,
6180: 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
6190: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
61a0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
61b0: 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  back;.  }..  /* 
61c0: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
61d0: 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c  ile is too small
61e0: 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f   to contain a co
61f0: 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 0a 20  mplete header,. 
6200: 20 2a 2a 20 69 74 20 6d 75 73 74 20 6d 65 61 6e   ** it must mean
6210: 20 74 68 61 74 20 74 68 65 20 70 72 6f 63 65 73   that the proces
6220: 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74  s that created t
6230: 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a  he journal was j
6240: 75 73 74 0a 20 20 2a 2a 20 62 65 67 69 6e 6e 69  ust.  ** beginni
6250: 6e 67 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ng to write the 
6260: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65  journal file whe
6270: 6e 20 69 74 20 64 69 65 64 2e 20 20 49 6e 20 74  n it died.  In t
6280: 68 61 74 20 63 61 73 65 2c 0a 20 20 2a 2a 20 74  hat case,.  ** t
6290: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
62a0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 73 74 69   should have sti
62b0: 6c 6c 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65  ll been complete
62c0: 6c 79 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20  ly unchanged..  
62d0: 2a 2a 20 4e 6f 74 68 69 6e 67 20 6e 65 65 64 73  ** Nothing needs
62e0: 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
62f0: 63 6b 2e 20 20 57 65 20 63 61 6e 20 73 61 66 65  ck.  We can safe
6300: 6c 79 20 69 67 6e 6f 72 65 20 74 68 69 73 20 6a  ly ignore this j
6310: 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69  ournal..  */.  i
6320: 66 28 20 73 7a 4a 20 3c 20 73 69 7a 65 6f 66 28  f( szJ < sizeof(
6330: 61 4d 61 67 69 63 29 2b 73 69 7a 65 6f 66 28 50  aMagic)+sizeof(P
6340: 67 6e 6f 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  gno) ){.    goto
6350: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
6360: 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
6370: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
6380: 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  he journal and t
6390: 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a  runcate the.  **
63a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
63b0: 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
63c0: 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20  nal size..  */. 
63d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
63e0: 65 61 64 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ead(&pPager->jfd
63f0: 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  , aMagic, sizeof
6400: 28 61 4d 61 67 69 63 29 29 3b 0a 20 20 69 66 28  (aMagic));.  if(
6410: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
6420: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
6430: 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 20 20  E_PROTOCOL;.    
6440: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
6450: 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 65 6d  k;.  }.  if( mem
6460: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
6470: 72 6e 61 6c 4d 61 67 69 63 33 2c 20 73 69 7a 65  rnalMagic3, size
6480: 6f 66 28 61 4d 61 67 69 63 29 29 3d 3d 30 20 29  of(aMagic))==0 )
6490: 7b 0a 20 20 20 20 66 6f 72 6d 61 74 20 3d 20 4a  {.    format = J
64a0: 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 33 3b  OURNAL_FORMAT_3;
64b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d  .  }else if( mem
64c0: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
64d0: 72 6e 61 6c 4d 61 67 69 63 32 2c 20 73 69 7a 65  rnalMagic2, size
64e0: 6f 66 28 61 4d 61 67 69 63 29 29 3d 3d 30 20 29  of(aMagic))==0 )
64f0: 7b 0a 20 20 20 20 66 6f 72 6d 61 74 20 3d 20 4a  {.    format = J
6500: 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 32 3b  OURNAL_FORMAT_2;
6510: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d  .  }else if( mem
6520: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
6530: 72 6e 61 6c 4d 61 67 69 63 31 2c 20 73 69 7a 65  rnalMagic1, size
6540: 6f 66 28 61 4d 61 67 69 63 29 29 3d 3d 30 20 29  of(aMagic))==0 )
6550: 7b 0a 20 20 20 20 66 6f 72 6d 61 74 20 3d 20 4a  {.    format = J
6560: 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 31 3b  OURNAL_FORMAT_1;
6570: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
6580: 20 3d 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43   = SQLITE_PROTOC
6590: 4f 4c 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  OL;.    goto end
65a0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
65b0: 20 69 66 28 20 66 6f 72 6d 61 74 3e 3d 4a 4f 55   if( format>=JOU
65c0: 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 33 20 29 7b  RNAL_FORMAT_3 ){
65d0: 0a 20 20 20 20 69 66 28 20 73 7a 4a 20 3c 20 73  .    if( szJ < s
65e0: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 20 2b 20  izeof(aMagic) + 
65f0: 33 2a 73 69 7a 65 6f 66 28 75 33 32 29 20 29 7b  3*sizeof(u32) ){
6600: 0a 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65  .      /* Ignore
6610: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20   the journal if 
6620: 69 74 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20  it is too small 
6630: 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f 6d  to contain a com
6640: 70 6c 65 74 65 0a 20 20 20 20 20 20 2a 2a 20 68  plete.      ** h
6650: 65 61 64 65 72 2e 20 20 57 65 20 61 6c 72 65 61  eader.  We alrea
6660: 64 79 20 64 69 64 20 74 68 69 73 20 74 65 73 74  dy did this test
6670: 20 6f 6e 63 65 20 61 62 6f 76 65 2c 20 62 75 74   once above, but
6680: 20 61 74 20 74 68 65 20 70 72 69 6f 72 0a 20 20   at the prior.  
6690: 20 20 20 20 2a 2a 20 74 65 73 74 2c 20 77 65 20      ** test, we 
66a0: 64 69 64 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 65  did not know the
66b0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
66c0: 61 6e 64 20 73 6f 20 77 65 20 68 61 64 20 74 6f  and so we had to
66d0: 20 61 73 73 75 6d 65 0a 20 20 20 20 20 20 2a 2a   assume.      **
66e0: 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 70 6f   the smallest po
66f0: 73 73 69 62 6c 65 20 68 65 61 64 65 72 2e 20 20  ssible header.  
6700: 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68 65 20  Now we know the 
6710: 68 65 61 64 65 72 20 69 73 20 62 69 67 67 65 72  header is bigger
6720: 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 74  .      ** than t
6730: 68 65 20 6d 69 6e 69 6d 75 6d 20 73 6f 20 77 65  he minimum so we
6740: 20 74 65 73 74 20 61 67 61 69 6e 2e 0a 20 20 20   test again..   
6750: 20 20 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f     */.      goto
6760: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
6770: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 72 65     }.    rc = re
6780: 61 64 33 32 62 69 74 73 28 66 6f 72 6d 61 74 2c  ad32bits(format,
6790: 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28   &pPager->jfd, (
67a0: 75 33 32 2a 29 26 6e 52 65 63 29 3b 0a 20 20 20  u32*)&nRec);.   
67b0: 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
67c0: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
67d0: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
67e0: 28 66 6f 72 6d 61 74 2c 20 26 70 50 61 67 65 72  (format, &pPager
67f0: 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e  ->jfd, &pPager->
6800: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 20 20  cksumInit);.    
6810: 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
6820: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
6830: 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66  if( nRec==0xffff
6840: 66 66 66 66 20 7c 7c 20 75 73 65 4a 6f 75 72 6e  ffff || useJourn
6850: 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  alSize ){.      
6860: 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f  nRec = (szJ - JO
6870: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 33 29 29  URNAL_HDR_SZ(3))
6880: 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 33  /JOURNAL_PG_SZ(3
6890: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
68a0: 7b 0a 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a  {.    nRec = (sz
68b0: 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  J - JOURNAL_HDR_
68c0: 53 5a 28 32 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50  SZ(2))/JOURNAL_P
68d0: 47 5f 53 5a 28 32 29 3b 0a 20 20 20 20 61 73 73  G_SZ(2);.    ass
68e0: 65 72 74 28 20 6e 52 65 63 2a 4a 4f 55 52 4e 41  ert( nRec*JOURNA
68f0: 4c 5f 50 47 5f 53 5a 28 32 29 2b 4a 4f 55 52 4e  L_PG_SZ(2)+JOURN
6900: 41 4c 5f 48 44 52 5f 53 5a 28 32 29 3d 3d 73 7a  AL_HDR_SZ(2)==sz
6910: 4a 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  J );.  }.  rc = 
6920: 72 65 61 64 33 32 62 69 74 73 28 66 6f 72 6d 61  read32bits(forma
6930: 74 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  t, &pPager->jfd,
6940: 20 26 6d 78 50 67 29 3b 0a 20 20 69 66 28 20 72   &mxPg);.  if( r
6950: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
6960: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
6970: 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 61 73 73  yback;.  }.  ass
6980: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69  ert( pPager->ori
6990: 67 44 62 53 69 7a 65 3d 3d 30 20 7c 7c 20 70 50  gDbSize==0 || pP
69a0: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
69b0: 3d 3d 6d 78 50 67 20 29 3b 0a 20 20 72 63 20 3d  ==mxPg );.  rc =
69c0: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
69d0: 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  te(&pPager->fd, 
69e0: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
69f0: 2a 28 6f 66 66 5f 74 29 6d 78 50 67 29 3b 0a 20  *(off_t)mxPg);. 
6a00: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6a10: 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  OK ){.    goto e
6a20: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
6a30: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
6a40: 65 20 3d 20 6d 78 50 67 3b 0a 20 20 0a 20 20 2f  e = mxPg;.  .  /
6a50: 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20  * Copy original 
6a60: 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65  pages out of the
6a70: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63   journal and bac
6a80: 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
6a90: 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ase file..  */. 
6aa0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63   for(i=0; i<nRec
6ab0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d  ; i++){.    rc =
6ac0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
6ad0: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
6ae0: 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66   &pPager->jfd, f
6af0: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 69 66 28 20  ormat);.    if( 
6b00: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
6b10: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
6b20: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
6b30: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
6b40: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
6b50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6b60: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 61 67 65 73  .  }..  /* Pages
6b70: 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20   that have been 
6b80: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
6b90: 6f 75 72 6e 61 6c 20 62 75 74 20 6e 65 76 65 72  ournal but never
6ba0: 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 77 68 65   synced.  ** whe
6bb0: 72 65 20 6e 6f 74 20 72 65 73 74 6f 72 65 64 20  re not restored 
6bc0: 62 79 20 74 68 65 20 6c 6f 6f 70 20 61 62 6f 76  by the loop abov
6bd0: 65 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 72  e.  We have to r
6be0: 65 73 74 6f 72 65 20 74 68 6f 73 65 0a 20 20 2a  estore those.  *
6bf0: 2a 20 70 61 67 65 73 20 62 79 20 72 65 61 64 69  * pages by readi
6c00: 6e 67 20 74 68 65 6d 20 62 61 63 6b 20 66 72 6f  ng them back fro
6c10: 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  m the original d
6c20: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
6c30: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6c40: 4b 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  K ){.    PgHdr *
6c50: 70 50 67 3b 0a 20 20 20 20 66 6f 72 28 70 50 67  pPg;.    for(pPg
6c60: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
6c70: 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
6c80: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 63 68  xtAll){.      ch
6c90: 61 72 20 7a 42 75 66 5b 53 51 4c 49 54 45 5f 50  ar zBuf[SQLITE_P
6ca0: 41 47 45 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 20  AGE_SIZE];.     
6cb0: 20 69 66 28 20 21 70 50 67 2d 3e 64 69 72 74 79   if( !pPg->dirty
6cc0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
6cd0: 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d     if( (int)pPg-
6ce0: 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
6cf0: 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
6d00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
6d10: 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Seek(&pPager->fd
6d20: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
6d30: 5a 45 2a 28 6f 66 66 5f 74 29 28 70 50 67 2d 3e  ZE*(off_t)(pPg->
6d40: 70 67 6e 6f 2d 31 29 29 3b 0a 20 20 20 20 20 20  pgno-1));.      
6d50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6d60: 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e 66 64  Read(&pPager->fd
6d70: 2c 20 7a 42 75 66 2c 20 53 51 4c 49 54 45 5f 50  , zBuf, SQLITE_P
6d80: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  AGE_SIZE);.     
6d90: 20 20 20 54 52 41 43 45 32 28 22 52 45 46 45 54     TRACE2("REFET
6da0: 43 48 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70  CH %d\n", pPg->p
6db0: 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 43 4f  gno);.        CO
6dc0: 44 45 43 28 70 50 61 67 65 72 2c 20 7a 42 75 66  DEC(pPager, zBuf
6dd0: 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 32 29 3b  , pPg->pgno, 2);
6de0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
6df0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
6e00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65  else{.        me
6e10: 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 53 51  mset(zBuf, 0, SQ
6e20: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
6e30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6e40: 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
6e50: 7c 7c 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20  || memcmp(zBuf, 
6e60: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
6e70: 67 29 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  g), SQLITE_PAGE_
6e80: 53 49 5a 45 29 20 29 7b 0a 20 20 20 20 20 20 20  SIZE) ){.       
6e90: 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f   memcpy(PGHDR_TO
6ea0: 5f 44 41 54 41 28 70 50 67 29 2c 20 7a 42 75 66  _DATA(pPg), zBuf
6eb0: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
6ec0: 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ZE);.        mem
6ed0: 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54  set(PGHDR_TO_EXT
6ee0: 52 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67  RA(pPg), 0, pPag
6ef0: 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20  er->nExtra);.   
6f00: 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e     }.      pPg->
6f10: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
6f20: 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
6f30: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 65   0;.    }.  }..e
6f40: 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69  nd_playback:.  i
6f50: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
6f60: 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e   ){.    pager_un
6f70: 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
6f80: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  );.    pPager->e
6f90: 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f  rrMask |= PAGER_
6fa0: 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  ERR_CORRUPT;.   
6fb0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
6fc0: 52 55 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RUPT;.  }else{. 
6fd0: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e     rc = pager_un
6fe0: 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
6ff0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
7000: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61  rc;.}../*.** Pla
7010: 79 62 61 63 6b 20 74 68 65 20 63 68 65 63 6b 70  yback the checkp
7020: 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  oint journal..**
7030: 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69  .** This is simi
7040: 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62  lar to playing b
7050: 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  ack the transact
7060: 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20  ion journal but 
7070: 77 69 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78  with.** a few ex
7080: 74 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a  tra twists..**.*
7090: 2a 20 20 20 20 28 31 29 20 20 54 68 65 20 6e 75  *    (1)  The nu
70a0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
70b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
70c0: 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  le at the start 
70d0: 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68  of.**         th
70e0: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20  e checkpoint is 
70f0: 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72  stored in pPager
7100: 2d 3e 63 6b 70 74 53 69 7a 65 2c 20 6e 6f 74 20  ->ckptSize, not 
7110: 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  in the.**       
7120: 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    journal file i
7130: 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  tself..**.**    
7140: 28 32 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e  (2)  In addition
7150: 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   to playing back
7160: 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
7170: 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a  journal, also.**
7180: 20 20 20 20 20 20 20 20 20 70 6c 61 79 62 61 63           playbac
7190: 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f 66 20 74  k all pages of t
71a0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
71b0: 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67  ournal beginning
71c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 74 20 6f  .**         at o
71d0: 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e 63 6b  ffset pPager->ck
71e0: 70 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  ptJSize..*/.stat
71f0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 73 74 6d  ic int pager_stm
7200: 74 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  t_playback(Pager
7210: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 6f 66 66   *pPager){.  off
7220: 5f 74 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  _t szJ;         
7230: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
7240: 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61   the full journa
7250: 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b  l */.  int nRec;
7260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7270: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63  /* Number of Rec
7280: 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  ords */.  int i;
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72a0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
72b0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  er */.  int rc;.
72c0: 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74  .  /* Truncate t
72d0: 68 65 20 64 61 74 61 62 61 73 65 20 62 61 63 6b  he database back
72e0: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
72f0: 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63   size..  */.  rc
7300: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
7310: 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64  cate(&pPager->fd
7320: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
7330: 5a 45 2a 28 6f 66 66 5f 74 29 70 50 61 67 65 72  ZE*(off_t)pPager
7340: 2d 3e 63 6b 70 74 53 69 7a 65 29 3b 0a 20 20 70  ->ckptSize);.  p
7350: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
7360: 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65  pPager->ckptSize
7370: 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
7380: 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f  ut how many reco
7390: 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 63  rds are in the c
73a0: 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  heckpoint journa
73b0: 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  l..  */.  assert
73c0: 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e  ( pPager->ckptIn
73d0: 55 73 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  Use && pPager->j
73e0: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
73f0: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
7400: 50 61 67 65 72 2d 3e 63 70 66 64 2c 20 30 29 3b  Pager->cpfd, 0);
7410: 0a 20 20 6e 52 65 63 20 3d 20 70 50 61 67 65 72  .  nRec = pPager
7420: 2d 3e 63 6b 70 74 4e 52 65 63 3b 0a 20 20 0a 20  ->ckptNRec;.  . 
7430: 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
7440: 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
7450: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f  he checkpoint jo
7460: 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
7470: 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74  nto the.  ** dat
7480: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74  abase file.  Not
7490: 65 20 74 68 61 74 20 74 68 65 20 63 68 65 63 6b  e that the check
74a0: 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6c  point journal al
74b0: 77 61 79 73 20 75 73 65 73 20 66 6f 72 6d 61 74  ways uses format
74c0: 0a 20 20 2a 2a 20 32 20 69 6e 73 74 65 61 64 20  .  ** 2 instead 
74d0: 6f 66 20 66 6f 72 6d 61 74 20 33 20 73 69 6e 63  of format 3 sinc
74e0: 65 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  e it does not ne
74f0: 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e  ed to be concern
7500: 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 70 6f 77  ed with.  ** pow
7510: 65 72 20 66 61 69 6c 75 72 65 73 20 63 6f 72 72  er failures corr
7520: 75 70 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  upting the journ
7530: 61 6c 20 61 6e 64 20 63 61 6e 20 74 68 75 73 20  al and can thus 
7540: 6f 6d 69 74 20 74 68 65 20 63 68 65 63 6b 73 75  omit the checksu
7550: 6d 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ms..  */.  for(i
7560: 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69  =nRec-1; i>=0; i
7570: 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  --){.    rc = pa
7580: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
7590: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70  _page(pPager, &p
75a0: 50 61 67 65 72 2d 3e 63 70 66 64 2c 20 32 29 3b  Pager->cpfd, 2);
75b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
75c0: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
75d0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
75e0: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
75f0: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
7600: 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65    }..  /* Figure
7610: 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 70 61   out how many pa
7620: 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63  ges need to be c
7630: 6f 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65  opied out of the
7640: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a   transaction.  *
7650: 2a 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  * journal..  */.
7660: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
7670: 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66  Seek(&pPager->jf
7680: 64 2c 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a  d, pPager->ckptJ
7690: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Size);.  if( rc!
76a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
76b0: 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f    goto end_stmt_
76c0: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20  playback;.  }.  
76d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
76e0: 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e  leSize(&pPager->
76f0: 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66  jfd, &szJ);.  if
7700: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7710: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
7720: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
7730: 20 7d 0a 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a   }.  nRec = (szJ
7740: 20 2d 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a   - pPager->ckptJ
7750: 53 69 7a 65 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47  Size)/JOURNAL_PG
7760: 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d  _SZ(journal_form
7770: 61 74 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 52 65  at);.  for(i=nRe
7780: 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  c-1; i>=0; i--){
7790: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
77a0: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
77b0: 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
77c0: 72 2d 3e 6a 66 64 2c 20 6a 6f 75 72 6e 61 6c 5f  r->jfd, journal_
77d0: 66 6f 72 6d 61 74 29 3b 0a 20 20 20 20 69 66 28  format);.    if(
77e0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
77f0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
7800: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
7810: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  );.      goto en
7820: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
7830: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 65 6e  .    }.  }.  .en
7840: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a  d_stmt_playback:
7850: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
7860: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
7870: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50  er->errMask |= P
7880: 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54  AGER_ERR_CORRUPT
7890: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
78a0: 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20  E_CORRUPT;.  }. 
78b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
78c0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
78d0: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
78e0: 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
78f0: 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77  s that are allow
7900: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  ed..**.** The ma
7910: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 69 73 20  ximum number is 
7920: 74 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c  the absolute val
7930: 75 65 20 6f 66 20 74 68 65 20 6d 78 50 61 67 65  ue of the mxPage
7940: 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 49   parameter..** I
7950: 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61  f mxPage is nega
7960: 74 69 76 65 2c 20 74 68 65 20 6e 6f 53 79 6e 63  tive, the noSync
7970: 20 66 6c 61 67 20 69 73 20 61 6c 73 6f 20 73 65   flag is also se
7980: 74 2e 20 20 6e 6f 53 79 6e 63 20 62 79 70 61 73  t.  noSync bypas
7990: 73 65 73 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  ses.** calls to 
79a0: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 2e  sqlite3OsSync().
79b0: 20 20 54 68 65 20 70 61 67 65 72 20 72 75 6e 73    The pager runs
79c0: 20 6d 75 63 68 20 66 61 73 74 65 72 20 77 69 74   much faster wit
79d0: 68 20 6e 6f 53 79 6e 63 20 6f 6e 2c 0a 2a 2a 20  h noSync on,.** 
79e0: 62 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61  but if the opera
79f0: 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73  ting system cras
7a00: 68 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 20  hes or there is 
7a10: 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20  an abrupt power 
7a20: 0a 2a 2a 20 66 61 69 6c 75 72 65 2c 20 74 68 65  .** failure, the
7a30: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d   database file m
7a40: 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20  ight be left in 
7a50: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
7a60: 61 6e 64 0a 2a 2a 20 75 6e 72 65 70 61 69 72 61  and.** unrepaira
7a70: 62 6c 65 20 73 74 61 74 65 2e 20 20 0a 2a 2f 0a  ble state.  .*/.
7a80: 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
7a90: 72 5f 73 65 74 5f 63 61 63 68 65 73 69 7a 65 28  r_set_cachesize(
7aa0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
7ab0: 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66  nt mxPage){.  if
7ac0: 28 20 6d 78 50 61 67 65 3e 3d 30 20 29 7b 0a 20  ( mxPage>=0 ){. 
7ad0: 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e     pPager->noSyn
7ae0: 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  c = pPager->temp
7af0: 46 69 6c 65 3b 0a 20 20 20 20 69 66 28 20 70 50  File;.    if( pP
7b00: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20  ager->noSync==0 
7b10: 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ) pPager->needSy
7b20: 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  nc = 0;.  }else{
7b30: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  .    pPager->noS
7b40: 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 6d 78 50  ync = 1;.    mxP
7b50: 61 67 65 20 3d 20 2d 6d 78 50 61 67 65 3b 0a 20  age = -mxPage;. 
7b60: 20 7d 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e   }.  if( mxPage>
7b70: 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  10 ){.    pPager
7b80: 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67  ->mxPage = mxPag
7b90: 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e;.  }.}../*.** 
7ba0: 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73  Adjust the robus
7bb0: 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74  tness of the dat
7bc0: 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20  abase to damage 
7bd0: 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65  due to OS crashe
7be0: 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61  s.** or power fa
7bf0: 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69  ilures by changi
7c00: 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ng the number of
7c10: 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77   syncs()s when w
7c20: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f  riting.** the ro
7c30: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
7c40: 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65   There are three
7c50: 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20   levels:.**.**  
7c60: 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69    OFF       sqli
7c70: 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e  te3OsSync() is n
7c80: 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68  ever called.  Th
7c90: 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  is is the defaul
7ca0: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
7cb0: 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20    for temporary 
7cc0: 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69  and transient fi
7cd0: 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f  les..**.**    NO
7ce0: 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72  RMAL    The jour
7cf0: 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e  nal is synced on
7d00: 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
7d10: 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
7d30: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73  tabase.  This is
7d40: 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61   normally adequa
7d50: 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62  te protection, b
7d60: 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
7d70: 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74     it is theoret
7d80: 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c  ically possible,
7d90: 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c   though very unl
7da0: 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20  ikely,.**       
7db0: 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69         that an i
7dc0: 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20  nopertune power 
7dd0: 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
7de0: 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  ave the journal.
7df0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
7e00: 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68  in a state which
7e10: 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d   would cause dam
7e20: 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
7e30: 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ase.**          
7e40: 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72      when it is r
7e50: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
7e60: 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54  *    FULL      T
7e70: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
7e80: 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72  nced twice befor
7e90: 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
7ea0: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
7eb0: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
7ec0: 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69  with some additi
7ed0: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
7ee0: 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c   - the nRec fiel
7ef0: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
7f00: 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c    of the journal
7f10: 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20   header - being 
7f20: 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65  written in betwe
7f30: 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20  en the two.**   
7f40: 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73             syncs
7f50: 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65  ).  If we assume
7f60: 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a   that writing a.
7f70: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
7f80: 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
7f90: 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68  or is atomic, th
7fa0: 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f  en this mode pro
7fb0: 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  vides.**        
7fc0: 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20        assurance 
7fd0: 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
7fe0: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72   will not be cor
7ff0: 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a  rupted to the.**
8000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
8010: 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64  int of causing d
8020: 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
8030: 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c  abase during rol
8040: 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d  lback..**.** Num
8050: 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f  eric values asso
8060: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73  ciated with thes
8070: 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46  e states are OFF
8080: 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a  ==1, NORMAL=2,.*
8090: 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f  * and FULL=3..*/
80a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
80b0: 65 72 5f 73 65 74 5f 73 61 66 65 74 79 5f 6c 65  er_set_safety_le
80c0: 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  vel(Pager *pPage
80d0: 72 2c 20 69 6e 74 20 6c 65 76 65 6c 29 7b 0a 20  r, int level){. 
80e0: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
80f0: 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70  =  level==1 || p
8100: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
8110: 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
8120: 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26  ync = level==3 &
8130: 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
8140: 69 6c 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ile;.  if( pPage
8150: 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 29 20 70  r->noSync==0 ) p
8160: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
8170: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  = 0;.}../*.** Op
8180: 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
8190: 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  ile.  Write the 
81a0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  name of the file
81b0: 20 69 6e 74 6f 20 7a 4e 61 6d 65 0a 2a 2a 20 28   into zName.** (
81c0: 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61 74  zName must be at
81d0: 20 6c 65 61 73 74 20 53 51 4c 49 54 45 5f 54 45   least SQLITE_TE
81e0: 4d 50 4e 41 4d 45 5f 53 49 5a 45 20 62 79 74 65  MPNAME_SIZE byte
81f0: 73 20 6c 6f 6e 67 2e 29 20 20 57 72 69 74 65 0a  s long.)  Write.
8200: 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ** the file desc
8210: 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e  riptor into *fd.
8220: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
8230: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
8240: 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65   some.** other e
8250: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
8260: 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fail..**.** The 
8270: 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
8280: 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65  cally delete the
8290: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
82a0: 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63 6c  when it is.** cl
82b0: 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  osed..*/.static 
82c0: 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
82d0: 5f 6f 70 65 6e 74 65 6d 70 28 63 68 61 72 20 2a  _opentemp(char *
82e0: 7a 46 69 6c 65 2c 20 4f 73 46 69 6c 65 20 2a 66  zFile, OsFile *f
82f0: 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  d){.  int cnt = 
8300: 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64  8;.  int rc;.  d
8310: 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20  o{.    cnt--;.  
8320: 20 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46    sqlite3OsTempF
8330: 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29 3b 0a  ileName(zFile);.
8340: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8350: 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
8360: 7a 46 69 6c 65 2c 20 66 64 2c 20 31 29 3b 0a 20  zFile, fd, 1);. 
8370: 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30 20 26   }while( cnt>0 &
8380: 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc!=SQLITE_OK 
8390: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
83a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
83b0: 61 20 6e 65 77 20 70 61 67 65 20 63 61 63 68 65  a new page cache
83c0: 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74   and put a point
83d0: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 63  er to the page c
83e0: 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65 72  ache in *ppPager
83f0: 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74 6f  ..** The file to
8400: 20 62 65 20 63 61 63 68 65 64 20 6e 65 65 64 20   be cached need 
8410: 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65 20  not exist.  The 
8420: 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b  file is not lock
8430: 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20  ed until.** the 
8440: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71  first call to sq
8450: 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29  lite3pager_get()
8460: 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c   and is only hel
8470: 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65  d open until the
8480: 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73  .** last page is
8490: 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20   released using 
84a0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
84b0: 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ef()..**.** If z
84c0: 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
84d0: 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79   then a randomly
84e0: 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79  -named temporary
84f0: 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
8500: 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20  .** and used as 
8510: 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  the file to be c
8520: 61 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65  ached.  The file
8530: 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64   will be deleted
8540: 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
8550: 79 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  y when it is clo
8560: 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sed..*/.int sqli
8570: 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 28 0a 20  te3pager_open(. 
8580: 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72   Pager **ppPager
8590: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  ,         /* Ret
85a0: 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74  urn the Pager st
85b0: 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
85c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
85d0: 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61  ilename,   /* Na
85e0: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
85f0: 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  se file to open 
8600: 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 2c  */.  int mxPage,
8610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8620: 20 4d 61 78 20 6e 75 6d 62 65 72 20 6f 66 20 69   Max number of i
8630: 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70  n-memory cache p
8640: 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  ages */.  int nE
8650: 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20  xtra,           
8660: 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65     /* Extra byte
8670: 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68  s append to each
8680: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
8690: 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72  */.  int useJour
86a0: 6e 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  nal           /*
86b0: 20 54 52 55 45 20 74 6f 20 75 73 65 20 61 20 72   TRUE to use a r
86c0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
86d0: 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  on this file */.
86e0: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
86f0: 65 72 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c  er;.  char *zFul
8700: 6c 50 61 74 68 6e 61 6d 65 3b 0a 20 20 69 6e 74  lPathname;.  int
8710: 20 6e 61 6d 65 4c 65 6e 3b 0a 20 20 4f 73 46 69   nameLen;.  OsFi
8720: 6c 65 20 66 64 3b 0a 20 20 69 6e 74 20 72 63 2c  le fd;.  int rc,
8730: 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46 69   i;.  int tempFi
8740: 6c 65 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e  le;.  int readOn
8750: 6c 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a  ly = 0;.  char z
8760: 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50  Temp[SQLITE_TEMP
8770: 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 20 20 2a  NAME_SIZE];..  *
8780: 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 69  ppPager = 0;.  i
8790: 66 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  f( sqlite3_mallo
87a0: 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  c_failed ){.    
87b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
87c0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  MEM;.  }.  if( z
87d0: 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
87e0: 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20  ename[0] ){.    
87f0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
8800: 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
8810: 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29  hname(zFilename)
8820: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
8830: 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74  e3OsOpenReadWrit
8840: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  e(zFullPathname,
8850: 20 26 66 64 2c 20 26 72 65 61 64 4f 6e 6c 79 29   &fd, &readOnly)
8860: 3b 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d  ;.    tempFile =
8870: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
8880: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
8890: 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d  er_opentemp(zTem
88a0: 70 2c 20 26 66 64 29 3b 0a 20 20 20 20 7a 46 69  p, &fd);.    zFi
88b0: 6c 65 6e 61 6d 65 20 3d 20 7a 54 65 6d 70 3b 0a  lename = zTemp;.
88c0: 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d      zFullPathnam
88d0: 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c  e = sqlite3OsFul
88e0: 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e  lPathname(zFilen
88f0: 61 6d 65 29 3b 0a 20 20 20 20 74 65 6d 70 46 69  ame);.    tempFi
8900: 6c 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66  le = 1;.  }.  if
8910: 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  ( sqlite3_malloc
8920: 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  _failed ){.    r
8930: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
8940: 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  EM;.  }.  if( rc
8950: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
8960: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46     sqliteFree(zF
8970: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
8980: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8990: 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20  CANTOPEN;.  }.  
89a0: 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c 65 6e  nameLen = strlen
89b0: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
89c0: 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69  .  pPager = sqli
89d0: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
89e0: 28 2a 70 50 61 67 65 72 29 20 2b 20 6e 61 6d 65  (*pPager) + name
89f0: 4c 65 6e 2a 33 20 2b 20 33 30 20 29 3b 0a 20 20  Len*3 + 30 );.  
8a00: 69 66 28 20 70 50 61 67 65 72 3d 3d 30 20 29 7b  if( pPager==0 ){
8a10: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
8a20: 6f 73 65 28 26 66 64 29 3b 0a 20 20 20 20 73 71  ose(&fd);.    sq
8a30: 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61  liteFree(zFullPa
8a40: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  thname);.    ret
8a50: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
8a60: 3b 0a 20 20 7d 0a 20 20 53 45 54 5f 50 41 47 45  ;.  }.  SET_PAGE
8a70: 52 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  R(pPager);.  pPa
8a80: 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  ger->zFilename =
8a90: 20 28 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b   (char*)&pPager[
8aa0: 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44  1];.  pPager->zD
8ab0: 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67  irectory = &pPag
8ac0: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61  er->zFilename[na
8ad0: 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50 61 67  meLen+1];.  pPag
8ae0: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26  er->zJournal = &
8af0: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
8b00: 72 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20  ry[nameLen+1];. 
8b10: 20 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e   strcpy(pPager->
8b20: 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c  zFilename, zFull
8b30: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72  Pathname);.  str
8b40: 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72  cpy(pPager->zDir
8b50: 65 63 74 6f 72 79 2c 20 7a 46 75 6c 6c 50 61 74  ectory, zFullPat
8b60: 68 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d  hname);.  for(i=
8b70: 6e 61 6d 65 4c 65 6e 3b 20 69 3e 30 20 26 26 20  nameLen; i>0 && 
8b80: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
8b90: 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d  ry[i-1]!='/'; i-
8ba0: 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20 29  -){}.  if( i>0 )
8bb0: 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
8bc0: 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20 20  ory[i-1] = 0;.  
8bd0: 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  strcpy(pPager->z
8be0: 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61  Journal, zFullPa
8bf0: 74 68 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  thname);.  sqlit
8c00: 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  eFree(zFullPathn
8c10: 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28 26  ame);.  strcpy(&
8c20: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
8c30: 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75  [nameLen], "-jou
8c40: 72 6e 61 6c 22 29 3b 0a 20 20 70 50 61 67 65 72  rnal");.  pPager
8c50: 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 70 50 61  ->fd = fd;.  pPa
8c60: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
8c70: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
8c80: 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65  useJournal = use
8c90: 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65  Journal;.  pPage
8ca0: 72 2d 3e 63 6b 70 74 4f 70 65 6e 20 3d 20 30 3b  r->ckptOpen = 0;
8cb0: 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49  .  pPager->ckptI
8cc0: 6e 55 73 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  nUse = 0;.  pPag
8cd0: 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20  er->nRef = 0;.  
8ce0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
8cf0: 20 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63   -1;.  pPager->c
8d00: 6b 70 74 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  kptSize = 0;.  p
8d10: 50 61 67 65 72 2d 3e 63 6b 70 74 4a 53 69 7a 65  Pager->ckptJSize
8d20: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
8d30: 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 50 61  nPage = 0;.  pPa
8d40: 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78  ger->mxPage = mx
8d50: 50 61 67 65 3e 35 20 3f 20 6d 78 50 61 67 65 20  Page>5 ? mxPage 
8d60: 3a 20 31 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e  : 10;.  pPager->
8d70: 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 55  state = SQLITE_U
8d80: 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d  NLOCK;.  pPager-
8d90: 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  >errMask = 0;.  
8da0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
8db0: 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70   = tempFile;.  p
8dc0: 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
8dd0: 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 70 50  = readOnly;.  pP
8de0: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
8df0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f   0;.  pPager->no
8e00: 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74  Sync = pPager->t
8e10: 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a  empFile || !useJ
8e20: 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72  ournal;.  pPager
8e30: 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20  ->pFirst = 0;.  
8e40: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
8e50: 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67  nced = 0;.  pPag
8e60: 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20  er->pLast = 0;. 
8e70: 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20   pPager->nExtra 
8e80: 3d 20 6e 45 78 74 72 61 3b 0a 20 20 6d 65 6d 73  = nExtra;.  mems
8e90: 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  et(pPager->aHash
8ea0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  , 0, sizeof(pPag
8eb0: 65 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 2a  er->aHash));.  *
8ec0: 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  ppPager = pPager
8ed0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
8ee0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
8ef0: 65 74 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  et the destructo
8f00: 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  r for this pager
8f10: 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  .  If not NULL, 
8f20: 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  the destructor i
8f30: 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e  s called.** when
8f40: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
8f50: 6f 75 6e 74 20 6f 6e 20 65 61 63 68 20 70 61 67  ount on each pag
8f60: 65 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20  e reaches zero. 
8f70: 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   The destructor 
8f80: 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 74  can.** be used t
8f90: 6f 20 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72  o clean up infor
8fa0: 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 65 78  mation in the ex
8fb0: 74 72 61 20 73 65 67 6d 65 6e 74 20 61 70 70 65  tra segment appe
8fc0: 6e 64 65 64 20 74 6f 20 65 61 63 68 20 70 61 67  nded to each pag
8fd0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73  e..**.** The des
8fe0: 74 72 75 63 74 6f 72 20 69 73 20 6e 6f 74 20 63  tructor is not c
8ff0: 61 6c 6c 65 64 20 61 73 20 61 20 72 65 73 75 6c  alled as a resul
9000: 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63  t sqlite3pager_c
9010: 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73  lose().  .** Des
9020: 74 72 75 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c  tructors are onl
9030: 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69  y called by sqli
9040: 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29  te3pager_unref()
9050: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9060: 33 70 61 67 65 72 5f 73 65 74 5f 64 65 73 74 72  3pager_set_destr
9070: 75 63 74 6f 72 28 50 61 67 65 72 20 2a 70 50 61  uctor(Pager *pPa
9080: 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 44 65 73  ger, void (*xDes
9090: 63 29 28 76 6f 69 64 2a 29 29 7b 0a 20 20 70 50  c)(void*)){.  pP
90a0: 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
90b0: 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a  r = xDesc;.}../*
90c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
90d0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
90e0: 61 67 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b  ages in the disk
90f0: 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64   file associated
9100: 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e   with.** pPager.
9110: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
9120: 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 50  ager_pagecount(P
9130: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
9140: 20 6f 66 66 5f 74 20 6e 3b 0a 20 20 61 73 73 65   off_t n;.  asse
9150: 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
9160: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
9170: 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20  bSize>=0 ){.    
9180: 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 64  return pPager->d
9190: 62 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28  bSize;.  }.  if(
91a0: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
91b0: 7a 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ze(&pPager->fd, 
91c0: 26 6e 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  &n)!=SQLITE_OK )
91d0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
91e0: 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
91f0: 52 52 5f 44 49 53 4b 3b 0a 20 20 20 20 72 65 74  RR_DISK;.    ret
9200: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 20 2f  urn 0;.  }.  n /
9210: 3d 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  = SQLITE_PAGE_SI
9220: 5a 45 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  ZE;.  if( pPager
9230: 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f  ->state!=SQLITE_
9240: 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 50  UNLOCK ){.    pP
9250: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
9260: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
9270: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61  ;.}../*.** Forwa
9280: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  rd declaration.*
9290: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
92a0: 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29  cJournal(Pager*)
92b0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  ;../*.** Truncat
92c0: 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74 68  e the file to th
92d0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
92e0: 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a  s specified..*/.
92f0: 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
9300: 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  _truncate(Pager 
9310: 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
9320: 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  age){.  int rc;.
9330: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
9340: 53 69 7a 65 3c 30 20 29 7b 0a 20 20 20 20 73 71  Size<0 ){.    sq
9350: 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63  lite3pager_pagec
9360: 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
9370: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
9380: 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20  errMask!=0 ){.  
9390: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
93a0: 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20  code(pPager);.  
93b0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
93c0: 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 3d 28 75  .  if( nPage>=(u
93d0: 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e  nsigned)pPager->
93e0: 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  dbSize ){.    re
93f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
9400: 20 20 7d 0a 20 20 73 79 6e 63 4a 6f 75 72 6e 61    }.  syncJourna
9410: 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20  l(pPager);.  rc 
9420: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
9430: 61 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ate(&pPager->fd,
9440: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
9450: 45 2a 28 6f 66 66 5f 74 29 6e 50 61 67 65 29 3b  E*(off_t)nPage);
9460: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
9470: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
9480: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61  er->dbSize = nPa
9490: 67 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ge;.  }.  return
94a0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68   rc;.}../*.** Sh
94b0: 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20  utdown the page 
94c0: 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c  cache.  Free all
94d0: 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73   memory and clos
94e0: 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  e all files..**.
94f0: 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
9500: 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72  ion was in progr
9510: 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ess when this ro
9520: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
9530: 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63   that.** transac
9540: 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
9550: 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61  ack.  All outsta
9560: 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
9570: 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61  invalidated.** a
9580: 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  nd their memory 
9590: 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61  is freed.  Any a
95a0: 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
95b0: 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a  page associated.
95c0: 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ** with this pag
95d0: 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  e cache after th
95e0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
95f0: 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  rns will likely.
9600: 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ** result in a c
9610: 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 69 6e 74 20  oredump..*/.int 
9620: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f  sqlite3pager_clo
9630: 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  se(Pager *pPager
9640: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c  ){.  PgHdr *pPg,
9650: 20 2a 70 4e 65 78 74 3b 0a 20 20 73 77 69 74 63   *pNext;.  switc
9660: 68 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  h( pPager->state
9670: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
9680: 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 3a 20 7b  ITE_WRITELOCK: {
9690: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61  .      sqlite3pa
96a0: 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
96b0: 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ger);.      sqli
96c0: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61  te3OsUnlock(&pPa
96d0: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
96e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
96f0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
9700: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9710: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
9720: 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3a 20 7b  LITE_READLOCK: {
9730: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
9740: 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  Unlock(&pPager->
9750: 66 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  fd);.      break
9760: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
9770: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ult: {.      /* 
9780: 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20  Do nothing */.  
9790: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
97a0: 0a 20 20 7d 0a 20 20 66 6f 72 28 70 50 67 3d 70  .  }.  for(pPg=p
97b0: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
97c0: 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20  ; pPg=pNext){.  
97d0: 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70    pNext = pPg->p
97e0: 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c  NextAll;.    sql
97f0: 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20  iteFree(pPg);.  
9800: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f  }.  sqlite3OsClo
9810: 73 65 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b  se(&pPager->fd);
9820: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9830: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
9840: 30 20 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66  0 );.  /* Temp f
9850: 69 6c 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74  iles are automat
9860: 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 62  ically deleted b
9870: 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66  y the OS.  ** if
9880: 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
9890: 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c  le ){.  **   sql
98a0: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
98b0: 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  ger->zFilename);
98c0: 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 20 20 43  .  ** }.  */.  C
98d0: 4c 52 5f 50 41 47 45 52 28 70 50 61 67 65 72 29  LR_PAGER(pPager)
98e0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
98f0: 7a 46 69 6c 65 6e 61 6d 65 21 3d 28 63 68 61 72  zFilename!=(char
9900: 2a 29 26 70 50 61 67 65 72 5b 31 5d 20 29 7b 0a  *)&pPager[1] ){.
9910: 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b      assert( 0 );
9920: 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 70 70    /* Cannot happ
9930: 65 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  en */.    sqlite
9940: 46 72 65 65 28 70 50 61 67 65 72 2d 3e 7a 46 69  Free(pPager->zFi
9950: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  lename);.    sql
9960: 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
9970: 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73  zJournal);.    s
9980: 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
9990: 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b 0a 20  ->zDirectory);. 
99a0: 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
99b0: 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
99c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
99d0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
99e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
99f0: 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
9a00: 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71  data..*/.Pgno sq
9a10: 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 6e  lite3pager_pagen
9a20: 75 6d 62 65 72 28 76 6f 69 64 20 2a 70 44 61 74  umber(void *pDat
9a30: 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d  a){.  PgHdr *p =
9a40: 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
9a50: 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20  Data);.  return 
9a60: 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  p->pgno;.}../*.*
9a70: 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66 28 29  * The page_ref()
9a80: 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d   function increm
9a90: 65 6e 74 73 20 74 68 65 20 72 65 66 65 72 65 6e  ents the referen
9aa0: 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70  ce count for a p
9ab0: 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70  age..** If the p
9ac0: 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
9ad0: 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
9ae0: 20 28 74 68 65 20 72 65 66 65 72 65 6e 63 65 20   (the reference 
9af0: 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74  count is zero) t
9b00: 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74  hen.** remove it
9b10: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
9b20: 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f  st..**.** For no
9b30: 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20  n-test systems, 
9b40: 70 61 67 65 5f 72 65 66 28 29 20 69 73 20 61 20  page_ref() is a 
9b50: 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73  macro that calls
9b60: 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20   _page_ref().** 
9b70: 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65  online of the re
9b80: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
9b90: 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74   zero.  For test
9ba0: 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72   systems, page_r
9bb0: 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61  ef().** is a rea
9bc0: 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68  l function so th
9bd0: 61 74 20 77 65 20 63 61 6e 20 73 65 74 20 62 72  at we can set br
9be0: 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72  eakpoints and tr
9bf0: 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69  ace it..*/.stati
9c00: 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66  c void _page_ref
9c10: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
9c20: 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
9c30: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
9c40: 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
9c50: 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
9c60: 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f  .  Remove it. */
9c70: 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50  .    if( pPg==pP
9c80: 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g->pPager->pFirs
9c90: 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 20  tSynced ){.     
9ca0: 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d   PgHdr *p = pPg-
9cb0: 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
9cc0: 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
9cd0: 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d  >needSync ){ p =
9ce0: 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d   p->pNextFree; }
9cf0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
9d00: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
9d10: 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = p;.    }.    
9d20: 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72  if( pPg->pPrevFr
9d30: 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ee ){.      pPg-
9d40: 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78  >pPrevFree->pNex
9d50: 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65  tFree = pPg->pNe
9d60: 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73  xtFree;.    }els
9d70: 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  e{.      pPg->pP
9d80: 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70  ager->pFirst = p
9d90: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
9da0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67     }.    if( pPg
9db0: 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20  ->pNextFree ){. 
9dc0: 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46       pPg->pNextF
9dd0: 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  ree->pPrevFree =
9de0: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
9df0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9e00: 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
9e10: 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65  Last = pPg->pPre
9e20: 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20  vFree;.    }.   
9e30: 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52   pPg->pPager->nR
9e40: 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d  ef++;.  }.  pPg-
9e50: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e  >nRef++;.  REFIN
9e60: 46 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64 65  FO(pPg);.}.#ifde
9e70: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
9e80: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
9e90: 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29  _ref(PgHdr *pPg)
9ea0: 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e  {.    if( pPg->n
9eb0: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
9ec0: 5f 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a  _page_ref(pPg);.
9ed0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9ee0: 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pPg->nRef++;.  
9ef0: 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29      REFINFO(pPg)
9f00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
9f10: 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 5f  e.# define page_
9f20: 72 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e 6e  ref(P)   ((P)->n
9f30: 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66  Ref==0?_page_ref
9f40: 28 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e  (P):(void)(P)->n
9f50: 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f  Ref++).#endif../
9f60: 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74  *.** Increment t
9f70: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
9f80: 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20  nt for a page.  
9f90: 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65  The input pointe
9fa0: 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65  r is.** a refere
9fb0: 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 20  nce to the page 
9fc0: 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  data..*/.int sql
9fd0: 69 74 65 33 70 61 67 65 72 5f 72 65 66 28 76 6f  ite3pager_ref(vo
9fe0: 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67  id *pData){.  Pg
9ff0: 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f  Hdr *pPg = DATA_
a000: 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
a010: 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29  .  page_ref(pPg)
a020: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
a030: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
a040: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ync the journal.
a050: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
a060: 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  , make sure all 
a070: 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68  the pages that h
a080: 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74  ave.** been writ
a090: 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
a0a0: 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79  al have actually
a0b0: 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72   reached the sur
a0c0: 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  face of the.** d
a0d0: 69 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20  isk.  It is not 
a0e0: 73 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74  safe to modify t
a0f0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
a100: 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20  base file until 
a110: 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75  after.** the jou
a120: 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79  rnal has been sy
a130: 6e 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72  nced.  If the or
a140: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
a150: 69 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f  is modified befo
a160: 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  re.** the journa
a170: 6c 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20  l is synced and 
a180: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
a190: 6f 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79  occurs, the unsy
a1a0: 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  nced journal.** 
a1b0: 64 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f  data would be lo
a1c0: 73 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20  st and we would 
a1d0: 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d  be unable to com
a1e0: 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b  pletely rollback
a1f0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
a200: 20 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62   changes.  Datab
a210: 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  ase corruption w
a220: 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a  ould occur..** .
a230: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a240: 61 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68 65  also updates the
a250: 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74   nRec field in t
a260: 68 65 20 68 65 61 64 65 72 20 6f 66 20 74 68 65  he header of the
a270: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65   journal..** (Se
a280: 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68  e comments on th
a290: 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
a2a0: 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61  () routine for a
a2b0: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
a2c0: 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68  ation.).** If th
a2d0: 65 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46  e sync mode is F
a2e0: 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77  ULL, two syncs w
a2f0: 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73  ill occur.  Firs
a300: 74 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72  t the whole jour
a310: 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64  nal.** is synced
a320: 2c 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20  , then the nRec 
a330: 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
a340: 2c 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20  , then a second 
a350: 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  sync occurs..**.
a360: 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  ** For temporary
a370: 20 64 61 74 61 62 61 73 65 73 2c 20 77 65 20 64   databases, we d
a380: 6f 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65  o not care if we
a390: 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c   are able to rol
a3a0: 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61  lback.** after a
a3b0: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
a3c0: 73 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a  so sync occurs..
a3d0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
a3e0: 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65  ne clears the ne
a3f0: 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20  edSync field of 
a400: 65 76 65 72 79 20 70 61 67 65 20 63 75 72 72 65  every page curre
a410: 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65  nt held in.** me
a420: 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
a430: 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
a440: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
a450: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
a460: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
a470: 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74  OK;..  /* Sync t
a480: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  he journal befor
a490: 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  e modifying the 
a4a0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20 20  main database.  
a4b0: 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65  ** (assuming the
a4c0: 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20  re is a journal 
a4d0: 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f 20  and it needs to 
a4e0: 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f  be synced.).  */
a4f0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
a500: 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 69  eedSync ){.    i
a510: 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
a520: 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 61 73  File ){.      as
a530: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
a540: 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20  urnalOpen );.   
a550: 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70     /* assert( !p
a560: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b  Pager->noSync );
a570: 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74   // noSync might
a580: 20 62 65 20 73 65 74 20 69 66 20 73 79 6e 63 68   be set if synch
a590: 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20  ronous.      ** 
a5a0: 77 61 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61  was turned off a
a5b0: 66 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63  fter the transac
a5c0: 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64  tion was started
a5d0: 2e 20 20 54 69 63 6b 65 74 20 23 36 31 35 20 2a  .  Ticket #615 *
a5e0: 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
a5f0: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
a600: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
a610: 65 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 63  e pPager->nRec c
a620: 6f 75 6e 74 65 72 20 77 65 20 61 72 65 20 6b 65  ounter we are ke
a630: 65 70 69 6e 67 20 61 67 72 65 65 73 0a 20 20 20  eping agrees.   
a640: 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65       ** with the
a650: 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
a660: 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20  rom the size of 
a670: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
a680: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
a690: 20 20 20 20 20 6f 66 66 5f 74 20 68 64 72 53 7a       off_t hdrSz
a6a0: 2c 20 70 67 53 7a 2c 20 6a 53 7a 3b 0a 20 20 20  , pgSz, jSz;.   
a6b0: 20 20 20 20 20 68 64 72 53 7a 20 3d 20 4a 4f 55       hdrSz = JOU
a6c0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 6a 6f 75 72  RNAL_HDR_SZ(jour
a6d0: 6e 61 6c 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 20  nal_format);.   
a6e0: 20 20 20 20 20 70 67 53 7a 20 3d 20 4a 4f 55 52       pgSz = JOUR
a6f0: 4e 41 4c 5f 50 47 5f 53 5a 28 6a 6f 75 72 6e 61  NAL_PG_SZ(journa
a700: 6c 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 20 20 20  l_format);.     
a710: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
a720: 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65  sFileSize(&pPage
a730: 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a 20  r->jfd, &jSz);. 
a740: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
a750: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
a760: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a770: 61 67 65 72 2d 3e 6e 52 65 63 2a 70 67 53 7a 2b  ager->nRec*pgSz+
a780: 68 64 72 53 7a 3d 3d 6a 53 7a 20 29 3b 0a 20 20  hdrSz==jSz );.  
a790: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
a7a0: 20 20 20 69 66 28 20 6a 6f 75 72 6e 61 6c 5f 66     if( journal_f
a7b0: 6f 72 6d 61 74 3e 3d 33 20 29 7b 0a 20 20 20 20  ormat>=3 ){.    
a7c0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
a7d0: 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f   nRec value into
a7e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
a7f0: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20  e header */.    
a800: 20 20 20 20 6f 66 66 5f 74 20 73 7a 4a 3b 0a 20      off_t szJ;. 
a810: 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
a820: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
a830: 20 20 20 20 20 20 20 20 20 54 52 41 43 45 31 28           TRACE1(
a840: 22 53 59 4e 43 5c 6e 22 29 3b 0a 20 20 20 20 20  "SYNC\n");.     
a850: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
a860: 33 4f 73 53 79 6e 63 28 26 70 50 61 67 65 72 2d  3OsSync(&pPager-
a870: 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  >jfd);.         
a880: 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74   if( rc!=0 ) ret
a890: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
a8a0: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
a8b0: 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
a8c0: 3e 6a 66 64 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  >jfd, sizeof(aJo
a8d0: 75 72 6e 61 6c 4d 61 67 69 63 31 29 29 3b 0a 20  urnalMagic1));. 
a8e0: 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
a8f0: 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d  e32bits(&pPager-
a900: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e 52  >jfd, pPager->nR
a910: 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ec);.        if(
a920: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
a930: 0a 20 20 20 20 20 20 20 20 73 7a 4a 20 3d 20 4a  .        szJ = J
a940: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 6a 6f  OURNAL_HDR_SZ(jo
a950: 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 29 20 2b 0a  urnal_format) +.
a960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a970: 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2a 4a 4f   pPager->nRec*JO
a980: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 6a 6f 75 72  URNAL_PG_SZ(jour
a990: 6e 61 6c 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 20  nal_format);.   
a9a0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65       sqlite3OsSe
a9b0: 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ek(&pPager->jfd,
a9c0: 20 73 7a 4a 29 3b 0a 20 20 20 20 20 20 7d 0a 20   szJ);.      }. 
a9d0: 20 20 20 20 20 54 52 41 43 45 31 28 22 53 59 4e       TRACE1("SYN
a9e0: 43 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  C\n");.      rc 
a9f0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
aa00: 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  &pPager->jfd);. 
aa10: 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
aa20: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
aa30: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
aa40: 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20  lStarted = 1;.  
aa50: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
aa60: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20  needSync = 0;.. 
aa70: 20 20 20 2f 2a 20 45 72 61 73 65 20 74 68 65 20     /* Erase the 
aa80: 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 66 72  needSync flag fr
aa90: 6f 6d 20 65 76 65 72 79 20 70 61 67 65 2e 0a 20  om every page.. 
aaa0: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50     */.    for(pP
aab0: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
aac0: 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
aad0: 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70  extAll){.      p
aae0: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
aaf0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
ab00: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
ab10: 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73   = pPager->pFirs
ab20: 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  t;.  }..#ifndef 
ab30: 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74  NDEBUG.  /* If t
ab40: 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e  he Pager.needSyn
ab50: 63 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20  c flag is clear 
ab60: 74 68 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e  then the PgHdr.n
ab70: 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61  eedSync.  ** fla
ab80: 67 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63  g must also be c
ab90: 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67  lear for all pag
aba0: 65 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74  es.  Verify that
abb0: 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72   this.  ** invar
abc0: 69 61 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20  iant is true..  
abd0: 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 66  */.  else{.    f
abe0: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
abf0: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
ac00: 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
ac10: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
ac20: 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a  >needSync==0 );.
ac30: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
ac40: 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ( pPager->pFirst
ac50: 53 79 6e 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e  Synced==pPager->
ac60: 70 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65  pFirst );.  }.#e
ac70: 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
ac80: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  c;.}../*.** Give
ac90: 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65  n a list of page
aca0: 73 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  s (connected by 
acb0: 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79  the PgHdr.pDirty
acc0: 20 70 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a   pointer) write.
acd0: 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20  ** every one of 
ace0: 74 68 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20  those pages out 
acf0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
ad00: 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74 68  file and mark th
ad10: 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65  em all.** as cle
ad20: 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
ad30: 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  t pager_write_pa
ad40: 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c  gelist(PgHdr *pL
ad50: 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  ist){.  Pager *p
ad60: 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  Pager;.  int rc;
ad70: 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ..  if( pList==0
ad80: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
ad90: 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20  _OK;.  pPager = 
ada0: 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 20  pList->pPager;. 
adb0: 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29 7b   while( pList ){
adc0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
add0: 73 74 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20  st->dirty );.   
ade0: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
adf0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 4c 69  pPager->fd, (pLi
ae00: 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28 6f 66 66  st->pgno-1)*(off
ae10: 5f 74 29 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  _t)SQLITE_PAGE_S
ae20: 49 5a 45 29 3b 0a 20 20 20 20 43 4f 44 45 43 28  IZE);.    CODEC(
ae30: 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f  pPager, PGHDR_TO
ae40: 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c  _DATA(pList), pL
ae50: 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20  ist->pgno, 6);. 
ae60: 20 20 20 54 52 41 43 45 32 28 22 53 54 4f 52 45     TRACE2("STORE
ae70: 20 25 64 5c 6e 22 2c 20 70 4c 69 73 74 2d 3e 70   %d\n", pList->p
ae80: 67 6e 6f 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  gno);.    rc = s
ae90: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70  qlite3OsWrite(&p
aea0: 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52  Pager->fd, PGHDR
aeb0: 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c  _TO_DATA(pList),
aec0: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
aed0: 45 29 3b 0a 20 20 20 20 43 4f 44 45 43 28 70 50  E);.    CODEC(pP
aee0: 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ager, PGHDR_TO_D
aef0: 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69 73  ATA(pList), pLis
af00: 74 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20  t->pgno, 0);.   
af10: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
af20: 20 72 63 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e   rc;.    pList->
af30: 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70  dirty = 0;.    p
af40: 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44  List = pList->pD
af50: 69 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75  irty;.  }.  retu
af60: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
af70: 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65  ./*.** Collect e
af80: 76 65 72 79 20 64 69 72 74 79 20 70 61 67 65 20  very dirty page 
af90: 69 6e 74 6f 20 61 20 64 69 72 74 79 20 6c 69 73  into a dirty lis
afa0: 74 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20  t and.** return 
afb0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
afc0: 20 68 65 61 64 20 6f 66 20 74 68 61 74 20 6c 69   head of that li
afd0: 73 74 2e 20 20 41 6c 6c 20 70 61 67 65 73 20 61  st.  All pages a
afe0: 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20  re.** collected 
aff0: 65 76 65 6e 20 69 66 20 74 68 65 79 20 61 72 65  even if they are
b000: 20 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a   still in use..*
b010: 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  /.static PgHdr *
b020: 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69  pager_get_all_di
b030: 72 74 79 5f 70 61 67 65 73 28 50 61 67 65 72 20  rty_pages(Pager 
b040: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
b050: 72 20 2a 70 2c 20 2a 70 4c 69 73 74 3b 0a 20 20  r *p, *pList;.  
b060: 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 66 6f 72  pList = 0;.  for
b070: 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  (p=pPager->pAll;
b080: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c   p; p=p->pNextAl
b090: 6c 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64  l){.    if( p->d
b0a0: 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70 2d  irty ){.      p-
b0b0: 3e 70 44 69 72 74 79 20 3d 20 70 4c 69 73 74 3b  >pDirty = pList;
b0c0: 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70  .      pList = p
b0d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
b0e0: 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
b0f0: 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70  *.** Acquire a p
b100: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61  age..**.** A rea
b110: 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69  d lock on the di
b120: 73 6b 20 66 69 6c 65 20 69 73 20 6f 62 74 61 69  sk file is obtai
b130: 6e 65 64 20 77 68 65 6e 20 74 68 65 20 66 69 72  ned when the fir
b140: 73 74 20 70 61 67 65 20 69 73 20 61 63 71 75 69  st page is acqui
b150: 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65  red. .** This re
b160: 61 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70  ad lock is dropp
b170: 65 64 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  ed when the last
b180: 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65   page is release
b190: 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f 67 65 74 20  d..**.** A _get 
b1a0: 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70 61  works for any pa
b1b0: 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65  ge number greate
b1c0: 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74 68  r than 0.  If th
b1d0: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
b1e0: 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  le is smaller th
b1f0: 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  an the requested
b200: 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61   page, then no a
b210: 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65  ctual disk.** re
b220: 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  ad occurs and th
b230: 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f  e memory image o
b240: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 69 6e  f the page is in
b250: 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20  itialized to.** 
b260: 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65 20  all zeros.  The 
b270: 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e  extra data appen
b280: 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73  ded to a page is
b290: 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69   always initiali
b2a0: 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20  zed.** to zeros 
b2b0: 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  the first time a
b2c0: 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20   page is loaded 
b2d0: 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a  into memory..**.
b2e0: 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69  ** The acquisiti
b2f0: 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f  on might fail fo
b300: 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e  r several reason
b310: 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73  s.  In all cases
b320: 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69  ,.** an appropri
b330: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
b340: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
b350: 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
b360: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65   NULL..**.** See
b370: 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 70 61 67   also sqlite3pag
b380: 65 72 5f 6c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f  er_lookup().  Bo
b390: 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  th this routine 
b3a0: 61 6e 64 20 5f 6c 6f 6f 6b 75 70 28 29 20 61 74  and _lookup() at
b3b0: 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64  tempt.** to find
b3c0: 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69   a page in the i
b3d0: 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66  n-memory cache f
b3e0: 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61  irst.  If the pa
b3f0: 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
b400: 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  y.** in memory, 
b410: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65  this routine goe
b420: 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61  s to disk to rea
b430: 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20  d it in whereas 
b440: 5f 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73  _lookup().** jus
b450: 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68  t returns 0.  Th
b460: 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69  is routine acqui
b470: 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  res a read-lock 
b480: 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
b490: 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74  t.** has to go t
b4a0: 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c  o disk, and coul
b4b0: 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20  d also playback 
b4c0: 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69  an old journal i
b4d0: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
b4e0: 53 69 6e 63 65 20 5f 6c 6f 6f 6b 75 70 28 29 20  Since _lookup() 
b4f0: 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69  never goes to di
b500: 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73  sk, it never has
b510: 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f   to deal with lo
b520: 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61  cks.** or journa
b530: 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20  l files..*/.int 
b540: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
b550: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
b560: 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20  Pgno pgno, void 
b570: 2a 2a 70 70 50 61 67 65 29 7b 0a 20 20 50 67 48  **ppPage){.  PgH
b580: 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72  dr *pPg;.  int r
b590: 63 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  c;..  /* Make su
b5a0: 72 65 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68  re we have not h
b5b0: 69 74 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20  it any critical 
b5c0: 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20  errors..  */ .  
b5d0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
b5e0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
b5f0: 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50  gno!=0 );.  *ppP
b600: 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  age = 0;.  if( p
b610: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26  Pager->errMask &
b620: 20 7e 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c   ~(PAGER_ERR_FUL
b630: 4c 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  L) ){.    return
b640: 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70   pager_errcode(p
b650: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Pager);.  }..  /
b660: 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
b670: 20 66 69 72 73 74 20 70 61 67 65 20 61 63 63 65   first page acce
b680: 73 73 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61  ssed, then get a
b690: 20 72 65 61 64 20 6c 6f 63 6b 0a 20 20 2a 2a 20   read lock.  ** 
b6a0: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
b6b0: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
b6c0: 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30   pPager->nRef==0
b6d0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
b6e0: 69 74 65 33 4f 73 52 65 61 64 4c 6f 63 6b 28 26  ite3OsReadLock(&
b6f0: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
b700: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
b710: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
b720: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
b730: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
b740: 20 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b   SQLITE_READLOCK
b750: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a  ;..    /* If a j
b760: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
b770: 74 73 2c 20 74 72 79 20 74 6f 20 70 6c 61 79 20  ts, try to play 
b780: 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a  it back..    */.
b790: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
b7a0: 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 73 71  useJournal && sq
b7b0: 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74  lite3OsFileExist
b7c0: 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  s(pPager->zJourn
b7d0: 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 69 6e  al) ){.       in
b7e0: 74 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 2f 2a  t rc;..       /*
b7f0: 20 47 65 74 20 61 20 77 72 69 74 65 20 6c 6f 63   Get a write loc
b800: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
b810: 65 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e.       */.    
b820: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
b830: 73 57 72 69 74 65 4c 6f 63 6b 28 26 70 50 61 67  sWriteLock(&pPag
b840: 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20  er->fd);.       
b850: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
b860: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 69 66  K ){.         if
b870: 28 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  ( sqlite3OsUnloc
b880: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 21 3d  k(&pPager->fd)!=
b890: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b8a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
b8b0: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
b8c0: 70 65 6e 21 20 2a 2f 0a 20 20 20 20 20 20 20 20  pen! */.        
b8d0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
b8e0: 4e 54 45 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  NTERNAL;.       
b8f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 72 65 74    }.         ret
b900: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 7d  urn rc;.       }
b910: 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
b920: 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 57  state = SQLITE_W
b930: 52 49 54 45 4c 4f 43 4b 3b 0a 0a 20 20 20 20 20  RITELOCK;..     
b940: 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
b950: 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e  urnal for readin
b960: 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20  g only.  Return 
b970: 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20  SQLITE_BUSY if. 
b980: 20 20 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20        ** we are 
b990: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74  unable to open t
b9a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
b9b0: 20 0a 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20   .       **.    
b9c0: 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61     ** The journa
b9d0: 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  l file does not 
b9e0: 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65  need to be locke
b9f0: 64 20 69 74 73 65 6c 66 2e 20 20 54 68 65 0a 20  d itself.  The. 
ba00: 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
ba10: 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f   file is never o
ba20: 70 65 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 6d  pen unless the m
ba30: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
ba40: 65 20 68 6f 6c 64 73 0a 20 20 20 20 20 20 20 2a  e holds.       *
ba50: 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20  * a write lock, 
ba60: 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76 65  so there is neve
ba70: 72 20 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20  r any chance of 
ba80: 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20  two or more.    
ba90: 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 73 20     ** processes 
baa0: 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72  opening the jour
bab0: 6e 61 6c 20 61 74 20 74 68 65 20 73 61 6d 65 20  nal at the same 
bac0: 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a  time..       */.
bad0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
bae0: 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
baf0: 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
bb00: 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  al, &pPager->jfd
bb10: 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63  );.       if( rc
bb20: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
bb30: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
bb40: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50  ite3OsUnlock(&pP
bb50: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
bb60: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
bb70: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
bb80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
bb90: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
bba0: 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67 65 72   }.       pPager
bbb0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
bbc0: 31 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  1;.       pPager
bbd0: 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
bbe0: 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 2f 2a   = 0;..       /*
bbf0: 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65   Playback and de
bc00: 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
bc10: 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61  .  Drop the data
bc20: 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20  base write.     
bc30: 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65    ** lock and re
bc40: 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64  acquire the read
bc50: 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2f   lock..       */
bc60: 0a 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  .       rc = pag
bc70: 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
bc80: 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 69  er, 0);.       i
bc90: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
bca0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 72 65 74   ){.         ret
bcb0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 7d  urn rc;.       }
bcc0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d  .    }.    pPg =
bcd0: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
bce0: 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 70   /* Search for p
bcf0: 61 67 65 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a  age in cache */.
bd00: 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
bd10: 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
bd20: 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  gno);.  }.  if( 
bd30: 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pPg==0 ){.    /*
bd40: 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70   The requested p
bd50: 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68  age is not in th
bd60: 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
bd70: 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20  .    int h;.    
bd80: 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 2b 2b 3b  pPager->nMiss++;
bd90: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
bda0: 3e 6e 50 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d  >nPage<pPager->m
bdb0: 78 50 61 67 65 20 7c 7c 20 70 50 61 67 65 72 2d  xPage || pPager-
bdc0: 3e 70 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20  >pFirst==0 ){.  
bdd0: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
bde0: 6e 65 77 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  new page */.    
bdf0: 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 4d 61    pPg = sqliteMa
be00: 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28  llocRaw( sizeof(
be10: 2a 70 50 67 29 20 2b 20 53 51 4c 49 54 45 5f 50  *pPg) + SQLITE_P
be20: 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20 20 20  AGE_SIZE .      
be30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be40: 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66          + sizeof
be50: 28 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e  (u32) + pPager->
be60: 6e 45 78 74 72 61 20 29 3b 0a 20 20 20 20 20 20  nExtra );.      
be70: 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
be80: 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 77 72        pager_unwr
be90: 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
bea0: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
beb0: 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45  >errMask |= PAGE
bec0: 52 5f 45 52 52 5f 4d 45 4d 3b 0a 20 20 20 20 20  R_ERR_MEM;.     
bed0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bee0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
bef0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67        memset(pPg
bf00: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50 67  , 0, sizeof(*pPg
bf10: 29 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  ));.      pPg->p
bf20: 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
bf30: 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
bf40: 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41  All = pPager->pA
bf50: 6c 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ll;.      if( pP
bf60: 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20  ager->pAll ){.  
bf70: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41        pPager->pA
bf80: 6c 6c 2d 3e 70 50 72 65 76 41 6c 6c 20 3d 20 70  ll->pPrevAll = p
bf90: 50 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Pg;.      }.    
bfa0: 20 20 70 50 67 2d 3e 70 50 72 65 76 41 6c 6c 20    pPg->pPrevAll 
bfb0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
bfc0: 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20  r->pAll = pPg;. 
bfd0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61       pPager->nPa
bfe0: 67 65 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ge++;.    }else{
bff0: 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 61  .      /* Find a
c000: 20 70 61 67 65 20 74 6f 20 72 65 63 79 63 6c 65   page to recycle
c010: 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63 61 74 65  .  Try to locate
c020: 20 61 20 70 61 67 65 20 74 68 61 74 20 64 6f 65   a page that doe
c030: 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 72  s not.      ** r
c040: 65 71 75 69 72 65 20 75 73 20 74 6f 20 64 6f 20  equire us to do 
c050: 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20 74 68  an fsync() on th
c060: 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20  e journal..     
c070: 20 2a 2f 0a 20 20 20 20 20 20 70 50 67 20 3d 20   */.      pPg = 
c080: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
c090: 6e 63 65 64 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  nced;..      /* 
c0a0: 49 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20  If we could not 
c0b0: 66 69 6e 64 20 61 20 70 61 67 65 20 74 68 61 74  find a page that
c0c0: 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
c0d0: 65 20 61 6e 20 66 73 79 6e 63 28 29 0a 20 20 20  e an fsync().   
c0e0: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75     ** on the jou
c0f0: 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 66  rnal file then f
c100: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
c110: 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20   file.  This is 
c120: 61 0a 20 20 20 20 20 20 2a 2a 20 76 65 72 79 20  a.      ** very 
c130: 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20  slow operation, 
c140: 73 6f 20 77 65 20 77 6f 72 6b 20 68 61 72 64 20  so we work hard 
c150: 74 6f 20 61 76 6f 69 64 20 69 74 2e 20 20 42 75  to avoid it.  Bu
c160: 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20 20 20  t sometimes.    
c170: 20 20 2a 2a 20 69 74 20 63 61 6e 27 74 20 62 65    ** it can't be
c180: 20 68 65 6c 70 65 64 2e 0a 20 20 20 20 20 20 2a   helped..      *
c190: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 3d  /.      if( pPg=
c1a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =0 ){.        in
c1b0: 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e  t rc = syncJourn
c1c0: 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
c1d0: 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
c1e0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
c1f0: 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
c200: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
c210: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c220: 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20  E_IOERR;.       
c230: 20 7d 0a 20 20 20 20 20 20 20 20 70 50 67 20 3d   }.        pPg =
c240: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b   pPager->pFirst;
c250: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
c260: 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
c270: 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ==0 );..      /*
c280: 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20   Write the page 
c290: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
c2a0: 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 64 69  file if it is di
c2b0: 72 74 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  rty..      */.  
c2c0: 20 20 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72      if( pPg->dir
c2d0: 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ty ){.        as
c2e0: 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53  sert( pPg->needS
c2f0: 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ync==0 );.      
c300: 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
c310: 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
c320: 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
c330: 6c 69 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20  list( pPg );.   
c340: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
c350: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
c360: 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
c370: 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
c380: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
c390: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
c3a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c3b0: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
c3c0: 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20  ( pPg->dirty==0 
c3d0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
c3e0: 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
c3f0: 72 65 63 79 63 6c 69 6e 67 20 69 73 20 6d 61 72  recycling is mar
c400: 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c  ked as alwaysRol
c410: 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20 20 20  lback, then.    
c420: 20 20 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f    ** set the glo
c430: 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  bal alwaysRollba
c440: 63 6b 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69  ck flag, thus di
c450: 73 61 62 6c 69 6e 67 20 74 68 65 0a 20 20 20 20  sabling the.    
c460: 20 20 2a 2a 20 73 71 6c 69 74 65 5f 64 6f 6e 74    ** sqlite_dont
c470: 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69  _rollback() opti
c480: 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  mization for the
c490: 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 74 72   rest of this tr
c4a0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
c4b0: 20 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73   ** It is necess
c4c0: 61 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62  ary to do this b
c4d0: 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
c4e0: 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c  marked alwaysRol
c4f0: 6c 62 61 63 6b 0a 20 20 20 20 20 20 2a 2a 20 6d  lback.      ** m
c500: 69 67 68 74 20 62 65 20 72 65 6c 6f 61 64 65 64  ight be reloaded
c510: 20 61 74 20 61 20 6c 61 74 65 72 20 74 69 6d 65   at a later time
c520: 20 62 75 74 20 61 74 20 74 68 61 74 20 70 6f 69   but at that poi
c530: 6e 74 20 77 65 20 77 6f 6e 27 74 20 72 65 6d 65  nt we won't reme
c540: 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 68  mber.      ** th
c550: 61 74 20 69 73 20 77 61 73 20 6d 61 72 6b 65 64  at is was marked
c560: 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e   alwaysRollback.
c570: 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61    This means tha
c580: 74 20 61 6c 6c 20 70 61 67 65 73 20 6d 75 73 74  t all pages must
c590: 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 6d 61 72  .      ** be mar
c5a0: 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c  ked as alwaysRol
c5b0: 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65 72 65 20  lback from here 
c5c0: 6f 6e 20 6f 75 74 2e 0a 20 20 20 20 20 20 2a 2f  on out..      */
c5d0: 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e  .      if( pPg->
c5e0: 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29  alwaysRollback )
c5f0: 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
c600: 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
c610: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 1;.      }.. 
c620: 20 20 20 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74       /* Unlink t
c630: 68 65 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d  he old page from
c640: 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 61   the free list a
c650: 6e 64 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  nd the hash tabl
c660: 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  e.      */.     
c670: 20 69 66 28 20 70 50 67 3d 3d 70 50 61 67 65 72   if( pPg==pPager
c680: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29  ->pFirstSynced )
c690: 7b 0a 20 20 20 20 20 20 20 20 50 67 48 64 72 20  {.        PgHdr 
c6a0: 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  *p = pPg->pNextF
c6b0: 72 65 65 3b 0a 20 20 20 20 20 20 20 20 77 68 69  ree;.        whi
c6c0: 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64  le( p && p->need
c6d0: 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70  Sync ){ p = p->p
c6e0: 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20  NextFree; }.    
c6f0: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
c700: 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20  stSynced = p;.  
c710: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
c720: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29  pPg->pPrevFree )
c730: 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70  {.        pPg->p
c740: 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46  PrevFree->pNextF
c750: 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ree = pPg->pNext
c760: 46 72 65 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Free;.      }els
c770: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
c780: 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  t( pPager->pFirs
c790: 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 20 20  t==pPg );.      
c7a0: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
c7b0: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
c7c0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
c7d0: 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46   if( pPg->pNextF
c7e0: 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ree ){.        p
c7f0: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70  Pg->pNextFree->p
c800: 50 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e  PrevFree = pPg->
c810: 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 20  pPrevFree;.     
c820: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c830: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
c840: 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20  pLast==pPg );.  
c850: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c        pPager->pL
c860: 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ast = pPg->pPrev
c870: 46 72 65 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Free;.      }.  
c880: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72      pPg->pNextFr
c890: 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  ee = pPg->pPrevF
c8a0: 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ree = 0;.      i
c8b0: 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  f( pPg->pNextHas
c8c0: 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67  h ){.        pPg
c8d0: 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
c8e0: 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50  evHash = pPg->pP
c8f0: 72 65 76 48 61 73 68 3b 0a 20 20 20 20 20 20 7d  revHash;.      }
c900: 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e  .      if( pPg->
c910: 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20  pPrevHash ){.   
c920: 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48       pPg->pPrevH
c930: 61 73 68 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  ash->pNextHash =
c940: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b   pPg->pNextHash;
c950: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
c960: 20 20 20 20 20 20 68 20 3d 20 70 61 67 65 72 5f        h = pager_
c970: 68 61 73 68 28 70 50 67 2d 3e 70 67 6e 6f 29 3b  hash(pPg->pgno);
c980: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c990: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
c9a0: 5d 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 20 20  ]==pPg );.      
c9b0: 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b    pPager->aHash[
c9c0: 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48  h] = pPg->pNextH
c9d0: 61 73 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ash;.      }.   
c9e0: 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
c9f0: 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61  h = pPg->pPrevHa
ca00: 73 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  sh = 0;.      pP
ca10: 61 67 65 72 2d 3e 6e 4f 76 66 6c 2b 2b 3b 0a 20  ager->nOvfl++;. 
ca20: 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 67     }.    pPg->pg
ca30: 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 69  no = pgno;.    i
ca40: 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  f( pPager->aInJo
ca50: 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67  urnal && (int)pg
ca60: 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67  no<=pPager->orig
ca70: 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  DbSize ){.      
ca80: 73 71 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f  sqlite3CheckMemo
ca90: 72 79 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ry(pPager->aInJo
caa0: 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a  urnal, pgno/8);.
cab0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
cac0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
cad0: 6e 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  n );.      pPg->
cae0: 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61  inJournal = (pPa
caf0: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
cb00: 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70  pgno/8] & (1<<(p
cb10: 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20  gno&7)))!=0;.   
cb20: 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
cb30: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
cb40: 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
cb50: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
cb60: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
cb70: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
cb80: 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70  ( pPager->aInCkp
cb90: 74 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d  t && (int)pgno<=
cba0: 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65  pPager->ckptSize
cbb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
cbc0: 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70   (pPager->aInCkp
cbd0: 74 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c  t[pgno/8] & (1<<
cbe0: 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 20 29 7b  (pgno&7)))!=0 ){
cbf0: 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f  .      page_add_
cc00: 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
cc10: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
cc20: 20 20 20 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f      page_remove_
cc30: 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70  from_stmt_list(p
cc40: 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  Pg);.    }.    p
cc50: 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
cc60: 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31     pPg->nRef = 1
cc70: 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50  ;.    REFINFO(pP
cc80: 67 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  g);.    pPager->
cc90: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 68 20 3d 20  nRef++;.    h = 
cca0: 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29  pager_hash(pgno)
ccb0: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
ccc0: 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61  Hash = pPager->a
ccd0: 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61  Hash[h];.    pPa
cce0: 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20  ger->aHash[h] = 
ccf0: 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67  pPg;.    if( pPg
cd00: 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20  ->pNextHash ){. 
cd10: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
cd20: 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
cd30: 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
cd40: 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
cd50: 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  h->pPrevHash = p
cd60: 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  Pg;.    }.    if
cd70: 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  ( pPager->nExtra
cd80: 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  >0 ){.      mems
cd90: 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52  et(PGHDR_TO_EXTR
cda0: 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65  A(pPg), 0, pPage
cdb0: 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  r->nExtra);.    
cdc0: 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
cdd0: 2d 3e 64 62 53 69 7a 65 3c 30 20 29 20 73 71 6c  ->dbSize<0 ) sql
cde0: 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
cdf0: 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  unt(pPager);.   
ce00: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
ce10: 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20  Mask!=0 ){.     
ce20: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
ce30: 72 65 66 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  ref(PGHDR_TO_DAT
ce40: 41 28 70 50 67 29 29 3b 0a 20 20 20 20 20 20 72  A(pPg));.      r
ce50: 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64  c = pager_errcod
ce60: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
ce70: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
ce80: 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
ce90: 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 67  ->dbSize<(int)pg
cea0: 6e 6f 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  no ){.      mems
ceb0: 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  et(PGHDR_TO_DATA
cec0: 28 70 50 67 29 2c 20 30 2c 20 53 51 4c 49 54 45  (pPg), 0, SQLITE
ced0: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
cee0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
cef0: 74 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  t rc;.      sqli
cf00: 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65  te3OsSeek(&pPage
cf10: 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a  r->fd, (pgno-1)*
cf20: 28 6f 66 66 5f 74 29 53 51 4c 49 54 45 5f 50 41  (off_t)SQLITE_PA
cf30: 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  GE_SIZE);.      
cf40: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
cf50: 61 64 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ad(&pPager->fd, 
cf60: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
cf70: 67 29 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  g), SQLITE_PAGE_
cf80: 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 54 52 41  SIZE);.      TRA
cf90: 43 45 32 28 22 46 45 54 43 48 20 25 64 5c 6e 22  CE2("FETCH %d\n"
cfa0: 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
cfb0: 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72      CODEC(pPager
cfc0: 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
cfd0: 70 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  pPg), pPg->pgno,
cfe0: 20 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   3);.      if( r
cff0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
d000: 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20 66 69          off_t fi
d010: 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  leSize;.        
d020: 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  if( sqlite3OsFil
d030: 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 66  eSize(&pPager->f
d040: 64 2c 26 66 69 6c 65 53 69 7a 65 29 21 3d 53 51  d,&fileSize)!=SQ
d050: 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20  LITE_OK.        
d060: 20 20 20 20 20 20 20 7c 7c 20 66 69 6c 65 53 69         || fileSi
d070: 7a 65 3e 3d 70 67 6e 6f 2a 53 51 4c 49 54 45 5f  ze>=pgno*SQLITE_
d080: 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20  PAGE_SIZE ){.   
d090: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61         sqlite3pa
d0a0: 67 65 72 5f 75 6e 72 65 66 28 50 47 48 44 52 5f  ger_unref(PGHDR_
d0b0: 54 4f 5f 44 41 54 41 28 70 50 67 29 29 3b 0a 20  TO_DATA(pPg));. 
d0c0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
d0d0: 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  rc;.        }els
d0e0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  e{.          mem
d0f0: 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  set(PGHDR_TO_DAT
d100: 41 28 70 50 67 29 2c 20 30 2c 20 53 51 4c 49 54  A(pPg), 0, SQLIT
d110: 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  E_PAGE_SIZE);.  
d120: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
d130: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
d140: 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
d150: 74 65 64 20 70 61 67 65 20 69 73 20 69 6e 20 74  ted page is in t
d160: 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a  he page cache. *
d170: 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 48  /.    pPager->nH
d180: 69 74 2b 2b 3b 0a 20 20 20 20 70 61 67 65 5f 72  it++;.    page_r
d190: 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a  ef(pPg);.  }.  *
d1a0: 70 70 50 61 67 65 20 3d 20 50 47 48 44 52 5f 54  ppPage = PGHDR_T
d1b0: 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 72  O_DATA(pPg);.  r
d1c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d1d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
d1e0: 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69  e a page if it i
d1f0: 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
d200: 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
d210: 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61  .  Do.** not rea
d220: 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  d the page from 
d230: 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20  disk.  Return a 
d240: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
d250: 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20  age,.** or 0 if 
d260: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
d270: 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  in cache..**.** 
d280: 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
d290: 70 61 67 65 72 5f 67 65 74 28 29 2e 20 20 54 68  pager_get().  Th
d2a0: 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
d2b0: 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
d2c0: 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33  e.** and sqlite3
d2d0: 70 61 67 65 72 5f 67 65 74 28 29 20 69 73 20 74  pager_get() is t
d2e0: 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20  hat _get() will 
d2f0: 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61  go to the disk a
d300: 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68  nd read.** in th
d310: 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61  e page if the pa
d320: 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
d330: 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69  y in cache.  Thi
d340: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
d350: 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  urns NULL if the
d360: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
d370: 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69  cache or if a di
d380: 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a  sk I/O error .**
d390: 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e   has ever happen
d3a0: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ed..*/.void *sql
d3b0: 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  ite3pager_lookup
d3c0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
d3d0: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
d3e0: 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73  Hdr *pPg;..  ass
d3f0: 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
d400: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
d410: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  !=0 );.  if( pPa
d420: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e  ger->errMask & ~
d430: 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29  (PAGER_ERR_FULL)
d440: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
d450: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 69 66 28 20 70  ;.  }.  /* if( p
d460: 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29  Pager->nRef==0 )
d470: 7b 0a 20 20 2a 2a 20 20 72 65 74 75 72 6e 20 30  {.  **  return 0
d480: 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 20 20  ;.  ** }.  */.  
d490: 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
d4a0: 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
d4b0: 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29  ;.  if( pPg==0 )
d4c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 61 67   return 0;.  pag
d4d0: 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65  e_ref(pPg);.  re
d4e0: 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41  turn PGHDR_TO_DA
d4f0: 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  TA(pPg);.}../*.*
d500: 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65  * Release a page
d510: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
d520: 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
d530: 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
d540: 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68  drop to zero, th
d550: 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69  en the.** page i
d560: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c  s added to the L
d570: 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61  RU list.  When a
d580: 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ll references to
d590: 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72   all pages.** ar
d5a0: 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f  e released, a ro
d5b0: 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e  llback occurs an
d5c0: 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
d5d0: 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a  e database is.**
d5e0: 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74   removed..*/.int
d5f0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
d600: 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ref(void *pData)
d610: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
d620: 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20  .  /* Decrement 
d630: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
d640: 75 6e 74 20 66 6f 72 20 74 68 69 73 20 70 61 67  unt for this pag
d650: 65 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 44  e.  */.  pPg = D
d660: 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
d670: 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ta);.  assert( p
d680: 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Pg->nRef>0 );.  
d690: 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52  pPg->nRef--;.  R
d6a0: 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20  EFINFO(pPg);..  
d6b0: 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62  /* When the numb
d6c0: 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
d6d0: 20 74 6f 20 61 20 70 61 67 65 20 72 65 61 63 68   to a page reach
d6e0: 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a   0, call the.  *
d6f0: 2a 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e 64  * destructor and
d700: 20 61 64 64 20 74 68 65 20 70 61 67 65 20 74 6f   add the page to
d710: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20   the freelist.. 
d720: 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e   */.  if( pPg->n
d730: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61  Ref==0 ){.    Pa
d740: 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20  ger *pPager;.   
d750: 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70   pPager = pPg->p
d760: 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e  Pager;.    pPg->
d770: 70 4e 65 78 74 46 72 65 65 20 3d 20 30 3b 0a 20  pNextFree = 0;. 
d780: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
d790: 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 4c 61 73  e = pPager->pLas
d7a0: 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  t;.    pPager->p
d7b0: 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20  Last = pPg;.    
d7c0: 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72  if( pPg->pPrevFr
d7d0: 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ee ){.      pPg-
d7e0: 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78  >pPrevFree->pNex
d7f0: 74 46 72 65 65 20 3d 20 70 50 67 3b 0a 20 20 20  tFree = pPg;.   
d800: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
d810: 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70  ager->pFirst = p
d820: 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  Pg;.    }.    if
d830: 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d  ( pPg->needSync=
d840: 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46  =0 && pPager->pF
d850: 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 29 7b  irstSynced==0 ){
d860: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
d870: 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50  FirstSynced = pP
d880: 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  g;.    }.    if(
d890: 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
d8a0: 63 74 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 50  ctor ){.      pP
d8b0: 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
d8c0: 72 28 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  r(pData);.    }.
d8d0: 20 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61    .    /* When a
d8e0: 6c 6c 20 70 61 67 65 73 20 72 65 61 63 68 20 74  ll pages reach t
d8f0: 68 65 20 66 72 65 65 6c 69 73 74 2c 20 64 72 6f  he freelist, dro
d900: 70 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20  p the read lock 
d910: 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
d920: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
d930: 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
d940: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73  ->nRef--;.    as
d950: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52  sert( pPager->nR
d960: 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ef>=0 );.    if(
d970: 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30   pPager->nRef==0
d980: 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
d990: 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
d9a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
d9b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d9c0: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a  /*.** Create a j
d9d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
d9e0: 70 50 61 67 65 72 2e 20 20 54 68 65 72 65 20 73  pPager.  There s
d9f0: 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65  hould already be
da00: 20 61 20 77 72 69 74 65 0a 2a 2a 20 6c 6f 63 6b   a write.** lock
da10: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
da20: 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
da30: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
da40: 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
da50: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
da60: 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e  rything.  Return
da70: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61   an error code a
da80: 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a  nd release the.*
da90: 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20  * write lock if 
daa0: 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
dab0: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
dac0: 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f  nt pager_open_jo
dad0: 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
dae0: 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
daf0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
db00: 2d 3e 73 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f  ->state==SQLITE_
db10: 57 52 49 54 45 4c 4f 43 4b 20 29 3b 0a 20 20 61  WRITELOCK );.  a
db20: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
db30: 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b  ournalOpen==0 );
db40: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
db50: 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
db60: 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  .  sqlite3pager_
db70: 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  pagecount(pPager
db80: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  );.  pPager->aIn
db90: 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  Journal = sqlite
dba0: 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e  Malloc( pPager->
dbb0: 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a  dbSize/8 + 1 );.
dbc0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
dbd0: 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20  nJournal==0 ){. 
dbe0: 20 20 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64     sqlite3OsRead
dbf0: 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Lock(&pPager->fd
dc00: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
dc10: 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 52 45  tate = SQLITE_RE
dc20: 41 44 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75  ADLOCK;.    retu
dc30: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
dc40: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
dc50: 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69  te3OsOpenExclusi
dc60: 76 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  ve(pPager->zJour
dc70: 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66  nal, &pPager->jf
dc80: 64 2c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  d,pPager->tempFi
dc90: 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  le);.  if( rc!=S
dca0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
dcb0: 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
dcc0: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->aInJournal);.
dcd0: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
dce0: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
dcf0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 4c 6f 63  sqlite3OsReadLoc
dd00: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  k(&pPager->fd);.
dd10: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
dd20: 65 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4c  e = SQLITE_READL
dd30: 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  OCK;.    return 
dd40: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
dd50: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
dd60: 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70 50  OpenDirectory(pP
dd70: 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
dd80: 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  , &pPager->jfd);
dd90: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
dda0: 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50  alOpen = 1;.  pP
ddb0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
ddc0: 72 74 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67  rted = 0;.  pPag
ddd0: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
dde0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61  ;.  pPager->alwa
ddf0: 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  ysRollback = 0;.
de00: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
de10: 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   0;.  if( pPager
de20: 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a  ->errMask!=0 ){.
de30: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
de40: 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a  rrcode(pPager);.
de50: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
de60: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69   }.  pPager->ori
de70: 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  gDbSize = pPager
de80: 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 69 66 28 20  ->dbSize;.  if( 
de90: 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 3d 3d  journal_format==
dea0: 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 33  JOURNAL_FORMAT_3
deb0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
dec0: 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61  ite3OsWrite(&pPa
ded0: 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e  ger->jfd, aJourn
dee0: 61 6c 4d 61 67 69 63 33 2c 20 73 69 7a 65 6f 66  alMagic3, sizeof
def0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 33 29  (aJournalMagic3)
df00: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
df10: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
df20: 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
df30: 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
df40: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
df50: 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a 20 30  ? 0xffffffff : 0
df60: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
df70: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
df80: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
df90: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
dfa0: 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  (pPager->cksumIn
dfb0: 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  it), &pPager->ck
dfc0: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 20 20 20 20  sumInit);.      
dfd0: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
dfe0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  (&pPager->jfd, p
dff0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
e000: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
e010: 20 69 66 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72   if( journal_for
e020: 6d 61 74 3d 3d 4a 4f 55 52 4e 41 4c 5f 46 4f 52  mat==JOURNAL_FOR
e030: 4d 41 54 5f 32 20 29 7b 0a 20 20 20 20 72 63 20  MAT_2 ){.    rc 
e040: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
e050: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  (&pPager->jfd, a
e060: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 32 2c 20 73  JournalMagic2, s
e070: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
e080: 67 69 63 32 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  gic2));.  }else{
e090: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 6f 75  .    assert( jou
e0a0: 72 6e 61 6c 5f 66 6f 72 6d 61 74 3d 3d 4a 4f 55  rnal_format==JOU
e0b0: 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 31 20 29 3b  RNAL_FORMAT_1 );
e0c0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
e0d0: 33 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72  3OsWrite(&pPager
e0e0: 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d  ->jfd, aJournalM
e0f0: 61 67 69 63 31 2c 20 73 69 7a 65 6f 66 28 61 4a  agic1, sizeof(aJ
e100: 6f 75 72 6e 61 6c 4d 61 67 69 63 31 29 29 3b 0a  ournalMagic1));.
e110: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
e120: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
e130: 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
e140: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
e150: 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
e160: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
e170: 3e 63 6b 70 74 41 75 74 6f 6f 70 65 6e 20 26 26  >ckptAutoopen &&
e180: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
e190: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
e1a0: 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67  e3pager_stmt_beg
e1b0: 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  in(pPager);.  }.
e1c0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e1d0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
e1e0: 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
e1f0: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  k(pPager);.    i
e200: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
e210: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
e220: 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
e230: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
e240: 63 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  c;  .}../*.** Ac
e250: 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f  quire a write-lo
e260: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
e270: 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73  se.  The lock is
e280: 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a   removed when.**
e290: 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20   the any of the 
e2a0: 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e  following happen
e2b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  :.**.**   *  sql
e2c0: 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74  ite3pager_commit
e2d0: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
e2e0: 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67     *  sqlite3pag
e2f0: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 69 73  er_rollback() is
e300: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
e310: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c   sqlite3pager_cl
e320: 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ose() is called.
e330: 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33  .**   *  sqlite3
e340: 70 61 67 65 72 5f 75 6e 72 65 66 28 29 20 69 73  pager_unref() is
e350: 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76   called to on ev
e360: 65 72 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  ery outstanding 
e370: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
e380: 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69  parameter to thi
e390: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70  s routine is a p
e3a0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70  ointer to any op
e3b0: 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a  en page of the.*
e3c0: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
e3d0: 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65    Nothing change
e3e0: 73 20 61 62 6f 75 74 20 74 68 65 20 70 61 67 65  s about the page
e3f0: 20 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d 65   - it is used me
e400: 72 65 6c 79 0a 2a 2a 20 74 6f 20 61 63 71 75 69  rely.** to acqui
e410: 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  re a pointer to 
e420: 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
e430: 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66  ure and as proof
e440: 20 74 68 61 74 20 74 68 65 72 65 0a 2a 2a 20 69   that there.** i
e450: 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64  s already a read
e460: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74  -lock on the dat
e470: 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a  abase..**.** A j
e480: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
e490: 70 65 6e 65 64 20 69 66 20 74 68 69 73 20 69 73  pened if this is
e4a0: 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79   not a temporary
e4b0: 20 66 69 6c 65 2e 20 20 46 6f 72 0a 2a 2a 20 74   file.  For.** t
e4c0: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20  emporary files, 
e4d0: 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74  the opening of t
e4e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
e4f0: 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
e500: 6c 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 6e  l.** there is an
e510: 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20   actual need to 
e520: 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
e530: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rnal..**.** If t
e540: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
e550: 6c 72 65 61 64 79 20 77 72 69 74 65 2d 6c 6f 63  lready write-loc
e560: 6b 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ked, this routin
e570: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
e580: 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
e590: 72 5f 62 65 67 69 6e 28 76 6f 69 64 20 2a 70 44  r_begin(void *pD
e5a0: 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
e5b0: 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
e5c0: 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67  DR(pData);.  Pag
e5d0: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
e5e0: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
e5f0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
e600: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
e610: 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  Ref>0 );.  asser
e620: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
e630: 21 3d 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20  !=SQLITE_UNLOCK 
e640: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
e650: 3e 73 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 52  >state==SQLITE_R
e660: 45 41 44 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61  EADLOCK ){.    a
e670: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
e680: 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
e690: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e6a0: 4f 73 57 72 69 74 65 4c 6f 63 6b 28 26 70 50 61  OsWriteLock(&pPa
e6b0: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 69 66  ger->fd);.    if
e6c0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e6d0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
e6e0: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  rc;.    }.    pP
e6f0: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51  ager->state = SQ
e700: 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 3b 0a  LITE_WRITELOCK;.
e710: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
e720: 79 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 54  yFile = 0;.    T
e730: 52 41 43 45 31 28 22 54 52 41 4e 53 41 43 54 49  RACE1("TRANSACTI
e740: 4f 4e 5c 6e 22 29 3b 0a 20 20 20 20 69 66 28 20  ON\n");.    if( 
e750: 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
e760: 61 6c 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  al && !pPager->t
e770: 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
e780: 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
e790: 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
e7a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
e7b0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
e7c0: 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61  * Mark a data pa
e7d0: 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e  ge as writeable.
e7e0: 20 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72    The page is wr
e7f0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
e800: 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74  ournal .** if it
e810: 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c   is not there al
e820: 72 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f 75  ready.  This rou
e830: 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c  tine must be cal
e840: 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e  led before makin
e850: 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20  g.** changes to 
e860: 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  a page..**.** Th
e870: 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69  e first time thi
e880: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
e890: 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 63  led, the pager c
e8a0: 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20  reates a new.** 
e8b0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71 75  journal and acqu
e8c0: 69 72 65 73 20 61 20 77 72 69 74 65 20 6c 6f 63  ires a write loc
e8d0: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
e8e0: 65 2e 20 20 49 66 20 74 68 65 20 77 72 69 74 65  e.  If the write
e8f0: 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e  .** lock could n
e900: 6f 74 20 62 65 20 61 63 71 75 69 72 65 64 2c 20  ot be acquired, 
e910: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
e920: 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59  urns SQLITE_BUSY
e930: 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  .  The.** callin
e940: 67 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63  g routine must c
e950: 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65  heck for that re
e960: 74 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62  turn value and b
e970: 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f  e careful not to
e980: 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70  .** change any p
e990: 61 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74  age data until t
e9a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
e9b0: 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  rns SQLITE_OK..*
e9c0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
e9d0: 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e  nal file could n
e9e0: 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 65  ot be written be
e9f0: 63 61 75 73 65 20 74 68 65 20 64 69 73 6b 20 69  cause the disk i
ea00: 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20  s full,.** then 
ea10: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
ea20: 75 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c  urns SQLITE_FULL
ea30: 20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d   and does an imm
ea40: 65 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e  ediate rollback.
ea50: 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65  .** All subseque
ea60: 6e 74 20 77 72 69 74 65 20 61 74 74 65 6d 70 74  nt write attempt
ea70: 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51  s also return SQ
ea80: 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20  LITE_FULL until 
ea90: 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61  there.** is a ca
eaa0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67  ll to sqlite3pag
eab0: 65 72 5f 63 6f 6d 6d 69 74 28 29 20 6f 72 20 73  er_commit() or s
eac0: 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
ead0: 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73  back() to.** res
eae0: 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  et..*/.int sqlit
eaf0: 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 76 6f  e3pager_write(vo
eb00: 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67  id *pData){.  Pg
eb10: 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f  Hdr *pPg = DATA_
eb20: 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
eb30: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
eb40: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
eb50: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
eb60: 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  E_OK;..  /* Chec
eb70: 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a  k for errors.  *
eb80: 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
eb90: 65 72 72 4d 61 73 6b 20 29 7b 20 0a 20 20 20 20  errMask ){ .    
eba0: 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
ebb0: 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20  code(pPager);.  
ebc0: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
ebd0: 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
ebe0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
ebf0: 52 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  RM;.  }..  /* Ma
ec00: 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64  rk the page as d
ec10: 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61  irty.  If the pa
ec20: 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ge has already b
ec30: 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a  een written.  **
ec40: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
ec50: 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75  then we can retu
ec60: 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  rn right away.. 
ec70: 20 2a 2f 0a 20 20 70 50 67 2d 3e 64 69 72 74 79   */.  pPg->dirty
ec80: 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d   = 1;.  if( pPg-
ec90: 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70  >inJournal && (p
eca0: 50 67 2d 3e 69 6e 43 6b 70 74 20 7c 7c 20 70 50  Pg->inCkpt || pP
ecb0: 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 3d  ager->ckptInUse=
ecc0: 3d 30 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65  =0) ){.    pPage
ecd0: 72 2d 3e 64 69 72 74 79 46 69 6c 65 20 3d 20 31  r->dirtyFile = 1
ece0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
ecf0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
ed00: 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
ed10: 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74   far, it means t
ed20: 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65  hat the page nee
ed30: 64 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 77 72  ds to be.  ** wr
ed40: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61  itten to the tra
ed50: 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
ed60: 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69   or the ckeckpoi
ed70: 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  nt journal.  ** 
ed80: 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20  or both..  **.  
ed90: 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20 74  ** First check t
eda0: 6f 20 73 65 65 20 74 68 61 74 20 74 68 65 20 74  o see that the t
edb0: 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
edc0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20  al exists and.  
edd0: 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69 66 20  ** create it if 
ede0: 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 2a  it does not..  *
edf0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
ee00: 65 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54  er->state!=SQLIT
ee10: 45 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 72 63  E_UNLOCK );.  rc
ee20: 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
ee30: 62 65 67 69 6e 28 70 44 61 74 61 29 3b 0a 20 20  begin(pData);.  
ee40: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
ee50: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
ee60: 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
ee70: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
ee80: 3d 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43  =SQLITE_WRITELOC
ee90: 4b 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  K );.  if( !pPag
eea0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
eeb0: 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  && pPager->useJo
eec0: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20  urnal ){.    rc 
eed0: 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
eee0: 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
eef0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
ef00: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
ef10: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
ef20: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
ef30: 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75  en || !pPager->u
ef40: 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 70  seJournal );.  p
ef50: 50 61 67 65 72 2d 3e 64 69 72 74 79 46 69 6c 65  Pager->dirtyFile
ef60: 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 54 68 65 20   = 1;..  /* The 
ef70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
ef80: 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61  nal now exists a
ef90: 6e 64 20 77 65 20 68 61 76 65 20 61 20 77 72 69  nd we have a wri
efa0: 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  te lock on the. 
efb0: 20 2a 2a 20 6d 61 69 6e 20 64 61 74 61 62 61 73   ** main databas
efc0: 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74  e file.  Write t
efd0: 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
efe0: 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  to the transacti
eff0: 6f 6e 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  on .  ** journal
f000: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
f010: 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 2a  ere already..  *
f020: 2f 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e  /.  if( !pPg->in
f030: 4a 6f 75 72 6e 61 6c 20 26 26 20 70 50 61 67 65  Journal && pPage
f040: 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b  r->useJournal ){
f050: 0a 20 20 20 20 69 66 28 20 28 69 6e 74 29 70 50  .    if( (int)pP
f060: 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65  g->pgno <= pPage
f070: 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
f080: 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 50 67 3b  .      int szPg;
f090: 0a 20 20 20 20 20 20 75 33 32 20 73 61 76 65 64  .      u32 saved
f0a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 6f 75 72  ;.      if( jour
f0b0: 6e 61 6c 5f 66 6f 72 6d 61 74 3e 3d 4a 4f 55 52  nal_format>=JOUR
f0c0: 4e 41 4c 5f 46 4f 52 4d 41 54 5f 33 20 29 7b 0a  NAL_FORMAT_3 ){.
f0d0: 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75          u32 cksu
f0e0: 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  m = pager_cksum(
f0f0: 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
f100: 6f 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20  o, pData);.     
f110: 20 20 20 73 61 76 65 64 20 3d 20 2a 28 75 33 32     saved = *(u32
f120: 2a 29 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  *)PGHDR_TO_EXTRA
f130: 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 73  (pPg);.        s
f140: 74 6f 72 65 33 32 62 69 74 73 28 63 6b 73 75 6d  tore32bits(cksum
f150: 2c 20 70 50 67 2c 20 53 51 4c 49 54 45 5f 50 41  , pPg, SQLITE_PA
f160: 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  GE_SIZE);.      
f170: 20 20 73 7a 50 67 20 3d 20 53 51 4c 49 54 45 5f    szPg = SQLITE_
f180: 50 41 47 45 5f 53 49 5a 45 2b 38 3b 0a 20 20 20  PAGE_SIZE+8;.   
f190: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f1a0: 20 20 73 7a 50 67 20 3d 20 53 51 4c 49 54 45 5f    szPg = SQLITE_
f1b0: 50 41 47 45 5f 53 49 5a 45 2b 34 3b 0a 20 20 20  PAGE_SIZE+4;.   
f1c0: 20 20 20 7d 0a 20 20 20 20 20 20 73 74 6f 72 65     }.      store
f1d0: 33 32 62 69 74 73 28 70 50 67 2d 3e 70 67 6e 6f  32bits(pPg->pgno
f1e0: 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20 20 20  , pPg, -4);.    
f1f0: 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20    CODEC(pPager, 
f200: 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
f210: 2c 20 37 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  , 7);.      rc =
f220: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
f230: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 28  &pPager->jfd, &(
f240: 28 63 68 61 72 2a 29 70 44 61 74 61 29 5b 2d 34  (char*)pData)[-4
f250: 5d 2c 20 73 7a 50 67 29 3b 0a 20 20 20 20 20 20  ], szPg);.      
f260: 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20  TRACE3("JOURNAL 
f270: 25 64 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70  %d %d\n", pPg->p
f280: 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
f290: 6e 63 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43  nc);.      CODEC
f2a0: 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
f2b0: 70 50 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20  pPg->pgno, 0);. 
f2c0: 20 20 20 20 20 69 66 28 20 6a 6f 75 72 6e 61 6c       if( journal
f2d0: 5f 66 6f 72 6d 61 74 3e 3d 4a 4f 55 52 4e 41 4c  _format>=JOURNAL
f2e0: 5f 46 4f 52 4d 41 54 5f 33 20 29 7b 0a 20 20 20  _FORMAT_3 ){.   
f2f0: 20 20 20 20 20 2a 28 75 33 32 2a 29 50 47 48 44       *(u32*)PGHD
f300: 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 29 20  R_TO_EXTRA(pPg) 
f310: 3d 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20 7d  = saved;.      }
f320: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
f330: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f340: 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
f350: 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
f360: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
f370: 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41  r->errMask |= PA
f380: 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20 20  GER_ERR_FULL;.  
f390: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
f3a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
f3b0: 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20  Pager->nRec++;. 
f3c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
f3d0: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21  ger->aInJournal!
f3e0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67  =0 );.      pPag
f3f0: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70  er->aInJournal[p
f400: 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
f410: 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
f420: 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
f430: 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e  Sync = !pPager->
f440: 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 70 50  noSync;.      pP
f450: 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
f460: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
f470: 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 29 7b  er->ckptInUse ){
f480: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
f490: 3e 61 49 6e 43 6b 70 74 5b 70 50 67 2d 3e 70 67  >aInCkpt[pPg->pg
f4a0: 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
f4b0: 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
f4c0: 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73     page_add_to_s
f4d0: 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  tmt_list(pPg);. 
f4e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
f4f0: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  {.      pPg->nee
f500: 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d  dSync = !pPager-
f510: 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
f520: 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
f530: 6e 63 3b 0a 20 20 20 20 20 20 54 52 41 43 45 33  nc;.      TRACE3
f540: 28 22 41 50 50 45 4e 44 20 25 64 20 25 64 5c 6e  ("APPEND %d %d\n
f550: 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ", pPg->pgno, pP
f560: 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20  g->needSync);.  
f570: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
f580: 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
f590: 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
f5a0: 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ync = 1;.    }. 
f5b0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
f5c0: 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  checkpoint journ
f5d0: 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74  al is open and t
f5e0: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
f5f0: 6e 20 69 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  n it,.  ** then 
f600: 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
f610: 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 63 68  t page to the ch
f620: 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  eckpoint journal
f630: 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 2a  .  Note that.  *
f640: 2a 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  * the checkpoint
f650: 20 6a 6f 75 72 6e 61 6c 20 61 6c 77 61 79 73 20   journal always 
f660: 75 73 65 73 20 74 68 65 20 73 69 6d 70 6c 69 65  uses the simplie
f670: 72 20 66 6f 72 6d 61 74 20 32 20 74 68 61 74 20  r format 2 that 
f680: 6c 61 63 6b 73 0a 20 20 2a 2a 20 63 68 65 63 6b  lacks.  ** check
f690: 73 75 6d 73 2e 20 20 54 68 65 20 68 65 61 64 65  sums.  The heade
f6a0: 72 20 69 73 20 61 6c 73 6f 20 6f 6d 69 74 74 65  r is also omitte
f6b0: 64 20 66 72 6f 6d 20 74 68 65 20 63 68 65 63 6b  d from the check
f6c0: 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20  point journal.. 
f6d0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
f6e0: 2d 3e 63 6b 70 74 49 6e 55 73 65 20 26 26 20 21  ->ckptInUse && !
f6f0: 70 50 67 2d 3e 69 6e 43 6b 70 74 20 26 26 20 28  pPg->inCkpt && (
f700: 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70  int)pPg->pgno<=p
f710: 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65 20  Pager->ckptSize 
f720: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
f730: 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c  Pg->inJournal ||
f740: 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e   (int)pPg->pgno>
f750: 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
f760: 7a 65 20 29 3b 0a 20 20 20 20 73 74 6f 72 65 33  ze );.    store3
f770: 32 62 69 74 73 28 70 50 67 2d 3e 70 67 6e 6f 2c  2bits(pPg->pgno,
f780: 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20 20 20 43   pPg, -4);.    C
f790: 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61  ODEC(pPager, pDa
f7a0: 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
f7b0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
f7c0: 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67  te3OsWrite(&pPag
f7d0: 65 72 2d 3e 63 70 66 64 2c 20 26 28 28 63 68 61  er->cpfd, &((cha
f7e0: 72 2a 29 70 44 61 74 61 29 5b 2d 34 5d 2c 20 53  r*)pData)[-4], S
f7f0: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2b  QLITE_PAGE_SIZE+
f800: 34 29 3b 0a 20 20 20 20 54 52 41 43 45 32 28 22  4);.    TRACE2("
f810: 43 4b 50 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 5c  CKPT-JOURNAL %d\
f820: 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  n", pPg->pgno);.
f830: 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72      CODEC(pPager
f840: 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
f850: 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  no, 0);.    if( 
f860: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
f870: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61  .      sqlite3pa
f880: 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
f890: 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ger);.      pPag
f8a0: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50  er->errMask |= P
f8b0: 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20  AGER_ERR_FULL;. 
f8c0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
f8d0: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
f8e0: 2d 3e 63 6b 70 74 4e 52 65 63 2b 2b 3b 0a 20 20  ->ckptNRec++;.  
f8f0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
f900: 2d 3e 61 49 6e 43 6b 70 74 21 3d 30 20 29 3b 0a  ->aInCkpt!=0 );.
f910: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 43      pPager->aInC
f920: 6b 70 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  kpt[pPg->pgno/8]
f930: 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
f940: 6f 26 37 29 3b 0a 20 20 20 20 70 61 67 65 5f 61  o&7);.    page_a
f950: 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
f960: 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  pPg);.  }..  /* 
f970: 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62  Update the datab
f980: 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74  ase size and ret
f990: 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  urn..  */.  if( 
f9a0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28  pPager->dbSize<(
f9b0: 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b  int)pPg->pgno ){
f9c0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
f9d0: 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  ize = pPg->pgno;
f9e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
f9f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
fa00: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70 61  n TRUE if the pa
fa10: 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  ge given in the 
fa20: 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65  argument was pre
fa30: 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a  viously passed.*
fa40: 2a 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65  * to sqlite3page
fa50: 72 5f 77 72 69 74 65 28 29 2e 20 20 49 6e 20 6f  r_write().  In o
fa60: 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75  ther words, retu
fa70: 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
fa80: 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65   ok.** to change
fa90: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
faa0: 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74  the page..*/.int
fab0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73   sqlite3pager_is
fac0: 77 72 69 74 65 61 62 6c 65 28 76 6f 69 64 20 2a  writeable(void *
fad0: 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
fae0: 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50  *pPg = DATA_TO_P
faf0: 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 72  GHDR(pData);.  r
fb00: 65 74 75 72 6e 20 70 50 67 2d 3e 64 69 72 74 79  eturn pPg->dirty
fb10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61  ;.}../*.** Repla
fb20: 63 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ce the content o
fb30: 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  f a single page 
fb40: 77 69 74 68 20 74 68 65 20 69 6e 66 6f 72 6d 61  with the informa
fb50: 74 69 6f 6e 20 69 6e 20 74 68 65 20 74 68 69 72  tion in the thir
fb60: 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  d.** argument..*
fb70: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
fb80: 65 72 5f 6f 76 65 72 77 72 69 74 65 28 50 61 67  er_overwrite(Pag
fb90: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
fba0: 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 70 44 61   pgno, void *pDa
fbb0: 74 61 29 7b 0a 20 20 76 6f 69 64 20 2a 70 50 61  ta){.  void *pPa
fbc0: 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ge;.  int rc;.. 
fbd0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
fbe0: 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20 70  er_get(pPager, p
fbf0: 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0a 20 20  gno, &pPage);.  
fc00: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
fc10: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
fc20: 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
fc30: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  (pPage);.    if(
fc40: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
fc50: 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
fc60: 50 61 67 65 2c 20 70 44 61 74 61 2c 20 53 51 4c  Page, pData, SQL
fc70: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
fc80: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
fc90: 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61  3pager_unref(pPa
fca0: 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
fcb0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
fcc0: 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f   call to this ro
fcd0: 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20  utine tells the 
fce0: 70 61 67 65 72 20 74 68 61 74 20 69 74 20 69 73  pager that it is
fcf0: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
fd00: 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69  o.** write the i
fd10: 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61  nformation on pa
fd20: 67 65 20 22 70 67 6e 6f 22 20 62 61 63 6b 20 74  ge "pgno" back t
fd30: 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e  o the disk, even
fd40: 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20   though.** that 
fd50: 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61  page might be ma
fd60: 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a 2a  rked as dirty..*
fd70: 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69  *.** The overlyi
fd80: 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65  ng software laye
fd90: 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
fda0: 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66  tine when all of
fdb0: 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20   the data.** on 
fdc0: 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69  the given page i
fdd0: 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20 70  s unused.  The p
fde0: 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70  ager marks the p
fdf0: 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a  age as clean so.
fe00: 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  ** that it does 
fe10: 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20  not get written 
fe20: 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54  to disk..**.** T
fe30: 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74  ests show that t
fe40: 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
fe50: 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20  , together with 
fe60: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61  the.** sqlite3pa
fe70: 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  ger_dont_rollbac
fe80: 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20  k() below, more 
fe90: 74 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65 20  than double the 
fea0: 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67  speed.** of larg
feb0: 65 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69  e INSERT operati
fec0: 6f 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70 6c  ons and quadrupl
fed0: 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c  e the speed of l
fee0: 61 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a  arge DELETEs..**
fef0: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f  .** When this ro
ff00: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
ff10: 20 73 65 74 20 74 68 65 20 61 6c 77 61 79 73 52   set the alwaysR
ff20: 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f 20  ollback flag to 
ff30: 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75  true..** Subsequ
ff40: 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ent calls to sql
ff50: 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72  ite3pager_dont_r
ff60: 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68  ollback() for th
ff70: 65 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77  e same page.** w
ff80: 69 6c 6c 20 74 68 65 72 65 61 66 74 65 72 20 62  ill thereafter b
ff90: 65 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73  e ignored.  This
ffa0: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
ffb0: 20 61 76 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d   avoid a problem
ffc0: 0a 2a 2a 20 77 68 65 72 65 20 61 20 70 61 67 65  .** where a page
ffd0: 20 77 69 74 68 20 64 61 74 61 20 69 73 20 61 64   with data is ad
ffe0: 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
fff0: 69 73 74 20 64 75 72 69 6e 67 20 6f 6e 65 20 70  ist during one p
10000 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e  art of.** a tran
10010 73 61 63 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d  saction then rem
10020 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72  oved from the fr
10030 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 61 20  eelist during a 
10040 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66  later part.** of
10050 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61   the same transa
10060 63 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64  ction and reused
10070 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20   for some other 
10080 70 75 72 70 6f 73 65 2e 20 20 57 68 65 6e 20 69  purpose.  When i
10090 74 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 61 64  t.** is first ad
100a0 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
100b0 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ist, this routin
100c0 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 57 68  e is called.  Wh
100d0 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68  en reused,.** th
100e0 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  e dont_rollback(
100f0 29 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  ) routine is cal
10100 6c 65 64 2e 20 20 42 75 74 20 62 65 63 61 75 73  led.  But becaus
10110 65 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61  e the page conta
10120 69 6e 73 0a 2a 2a 20 63 72 69 74 69 63 61 6c 20  ins.** critical 
10130 64 61 74 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e  data, we still n
10140 65 65 64 20 74 6f 20 62 65 20 73 75 72 65 20 69  eed to be sure i
10150 74 20 67 65 74 73 20 72 6f 6c 6c 65 64 20 62 61  t gets rolled ba
10160 63 6b 20 69 6e 20 73 70 69 74 65 0a 2a 2a 20 6f  ck in spite.** o
10170 66 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62  f the dont_rollb
10180 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76  ack() call..*/.v
10190 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
101a0 5f 64 6f 6e 74 5f 77 72 69 74 65 28 50 61 67 65  _dont_write(Page
101b0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
101c0 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
101d0 70 50 67 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61  pPg;..  pPg = pa
101e0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
101f0 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 70 50 67 2d  r, pgno);.  pPg-
10200 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
10210 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 20 26  = 1;.  if( pPg &
10220 26 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a  & pPg->dirty ){.
10230 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
10240 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70 50 67  dbSize==(int)pPg
10250 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61 67 65 72  ->pgno && pPager
10260 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70 50 61  ->origDbSize<pPa
10270 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
10280 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
10290 70 61 67 65 73 20 69 73 20 74 68 65 20 6c 61 73  pages is the las
102a0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69  t page in the fi
102b0 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  le and the file 
102c0 68 61 73 20 67 72 6f 77 6e 0a 20 20 20 20 20 20  has grown.      
102d0 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20 63 75  ** during the cu
102e0 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
102f0 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d  n, then do NOT m
10300 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
10310 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20  clean..      ** 
10320 57 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  When the databas
10330 65 20 66 69 6c 65 20 67 72 6f 77 73 2c 20 77 65  e file grows, we
10340 20 6d 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20   must make sure 
10350 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61  that the last pa
10360 67 65 0a 20 20 20 20 20 20 2a 2a 20 67 65 74 73  ge.      ** gets
10370 20 77 72 69 74 74 65 6e 20 61 74 20 6c 65 61 73   written at leas
10380 74 20 6f 6e 63 65 20 73 6f 20 74 68 61 74 20 74  t once so that t
10390 68 65 20 64 69 73 6b 20 66 69 6c 65 20 77 69 6c  he disk file wil
103a0 6c 20 62 65 20 74 68 65 20 63 6f 72 72 65 63 74  l be the correct
103b0 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20  .      ** size. 
103c0 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72  If you do not wr
103d0 69 74 65 20 74 68 69 73 20 70 61 67 65 20 61 6e  ite this page an
103e0 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
103f0 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  e file.      ** 
10400 6f 6e 20 74 68 65 20 64 69 73 6b 20 65 6e 64 73  on the disk ends
10410 20 75 70 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d   up being too sm
10420 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20 6c 65  all, that can le
10430 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 0a 20  ad to database. 
10440 20 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 69       ** corrupti
10450 6f 6e 20 64 75 72 69 6e 67 20 74 68 65 20 6e 65  on during the ne
10460 78 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  xt transaction..
10470 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c        */.    }el
10480 73 65 7b 0a 20 20 20 20 20 20 54 52 41 43 45 32  se{.      TRACE2
10490 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 25 64 5c  ("DONT_WRITE %d\
104a0 6e 22 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  n", pgno);.     
104b0 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
104c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
104d0 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
104e0 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
104f0 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
10500 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  if a rollback oc
10510 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e  curs,.** it is n
10520 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ot necessary to 
10530 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
10540 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
10550 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61  ge.  This.** mea
10560 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
10570 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  r does not have 
10580 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67 69  to record the gi
10590 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a  ven page in the.
105a0 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  ** rollback jour
105b0 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nal..*/.void sql
105c0 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72  ite3pager_dont_r
105d0 6f 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 44  ollback(void *pD
105e0 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
105f0 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
10600 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67  DR(pData);.  Pag
10610 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
10620 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 69 66 28  ->pPager;..  if(
10630 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
10640 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b  SQLITE_WRITELOCK
10650 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
10660 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74  nalOpen==0 ) ret
10670 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  urn;.  if( pPg->
10680 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c  alwaysRollback |
10690 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73  | pPager->always
106a0 52 6f 6c 6c 62 61 63 6b 20 29 20 72 65 74 75 72  Rollback ) retur
106b0 6e 3b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69  n;.  if( !pPg->i
106c0 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74  nJournal && (int
106d0 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50  )pPg->pgno <= pP
106e0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
106f0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
10700 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
10710 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  al!=0 );.    pPa
10720 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
10730 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
10740 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
10750 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75  ;.    pPg->inJou
10760 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 69 66  rnal = 1;.    if
10770 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e  ( pPager->ckptIn
10780 55 73 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  Use ){.      pPa
10790 67 65 72 2d 3e 61 49 6e 43 6b 70 74 5b 70 50 67  ger->aInCkpt[pPg
107a0 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
107b0 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
107c0 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f       page_add_to
107d0 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b  _stmt_list(pPg);
107e0 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45  .    }.    TRACE
107f0 32 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b  2("DONT_ROLLBACK
10800 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e   %d\n", pPg->pgn
10810 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  o);.  }.  if( pP
10820 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20  ager->ckptInUse 
10830 26 26 20 21 70 50 67 2d 3e 69 6e 43 6b 70 74 20  && !pPg->inCkpt 
10840 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  && (int)pPg->pgn
10850 6f 3c 3d 70 50 61 67 65 72 2d 3e 63 6b 70 74 53  o<=pPager->ckptS
10860 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ize ){.    asser
10870 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  t( pPg->inJourna
10880 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70  l || (int)pPg->p
10890 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67  gno>pPager->orig
108a0 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73  DbSize );.    as
108b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
108c0 6e 43 6b 70 74 21 3d 30 20 29 3b 0a 20 20 20 20  nCkpt!=0 );.    
108d0 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 5b  pPager->aInCkpt[
108e0 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
108f0 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
10900 3b 0a 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74  ;.    page_add_t
10910 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
10920 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
10930 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65  ommit all change
10940 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
10950 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68  e and release th
10960 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a  e write lock..**
10970 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69  .** If the commi
10980 74 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20  t fails for any 
10990 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61  reason, a rollba
109a0 63 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  ck attempt is ma
109b0 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72  de.** and an err
109c0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
109d0 6e 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d  ned.  If the com
109e0 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49  mit worked, SQLI
109f0 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75  TE_OK.** is retu
10a00 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
10a10 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74  ite3pager_commit
10a20 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
10a30 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48  .  int rc;.  PgH
10a40 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20  dr *pPg;..  if( 
10a50 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 3d  pPager->errMask=
10a60 3d 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20  =PAGER_ERR_FULL 
10a70 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
10a80 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
10a90 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  k(pPager);.    i
10aa0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
10ab0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
10ac0 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
10ad0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
10ae0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
10af0 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b  r->errMask!=0 ){
10b00 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
10b10 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
10b20 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
10b30 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
10b40 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f  ->state!=SQLITE_
10b50 57 52 49 54 45 4c 4f 43 4b 20 29 7b 0a 20 20 20  WRITELOCK ){.   
10b60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
10b70 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 52 41 43  RROR;.  }.  TRAC
10b80 45 31 28 22 43 4f 4d 4d 49 54 5c 6e 22 29 3b 0a  E1("COMMIT\n");.
10b90 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 69    if( pPager->di
10ba0 72 74 79 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  rtyFile==0 ){.  
10bb0 20 20 2f 2a 20 45 78 69 74 20 65 61 72 6c 79 20    /* Exit early 
10bc0 28 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 74  (without doing t
10bd0 68 65 20 74 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e  he time-consumin
10be0 67 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  g sqlite3OsSync(
10bf0 29 20 63 61 6c 6c 73 29 0a 20 20 20 20 2a 2a 20  ) calls).    ** 
10c00 69 66 20 74 68 65 72 65 20 68 61 76 65 20 62 65  if there have be
10c10 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f  en no changes to
10c20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
10c30 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  le. */.    asser
10c40 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
10c50 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  ync==0 );.    rc
10c60 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
10c70 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
10c80 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
10c90 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72   = -1;.    retur
10ca0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
10cb0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
10cc0 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20  nalOpen );.  rc 
10cd0 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
10ce0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
10cf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10d00 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62    goto commit_ab
10d10 6f 72 74 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d  ort;.  }.  pPg =
10d20 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64   pager_get_all_d
10d30 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65  irty_pages(pPage
10d40 72 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b  r);.  if( pPg ){
10d50 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
10d60 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70  write_pagelist(p
10d70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  Pg);.    if( rc 
10d80 7c 7c 20 28 21 70 50 61 67 65 72 2d 3e 6e 6f 53  || (!pPager->noS
10d90 79 6e 63 20 26 26 20 73 71 6c 69 74 65 33 4f 73  ync && sqlite3Os
10da0 53 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 66 64  Sync(&pPager->fd
10db0 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b  )!=SQLITE_OK) ){
10dc0 0a 20 20 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d  .      goto comm
10dd0 69 74 5f 61 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  it_abort;.    }.
10de0 20 20 7d 0a 20 20 72 63 20 3d 20 70 61 67 65 72    }.  rc = pager
10df0 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
10e00 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ger);.  pPager->
10e10 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72  dbSize = -1;.  r
10e20 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
10e30 4a 75 6d 70 20 68 65 72 65 20 69 66 20 61 6e 79  Jump here if any
10e40 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
10e50 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d   during the comm
10e60 69 74 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f  it process..  */
10e70 0a 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3a 0a 20  .commit_abort:. 
10e80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
10e90 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
10ea0 65 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  er);.  if( rc==S
10eb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10ec0 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
10ed0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
10ee0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  c;.}../*.** Roll
10ef0 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73  back all changes
10f00 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20  .  The database 
10f10 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 72 65  falls back to re
10f20 61 64 2d 6f 6e 6c 79 20 6d 6f 64 65 2e 0a 2a 2a  ad-only mode..**
10f30 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   All in-memory c
10f40 61 63 68 65 20 70 61 67 65 73 20 72 65 76 65 72  ache pages rever
10f50 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69  t to their origi
10f60 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74  nal data content
10f70 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  s..** The journa
10f80 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  l is deleted..**
10f90 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
10fa0 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c   cannot fail unl
10fb0 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  ess some other p
10fc0 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f  rocess is not fo
10fd0 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63  llowing.** the c
10fe0 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70  orrect locking p
10ff0 72 6f 74 6f 63 6f 6c 20 28 53 51 4c 49 54 45 5f  rotocol (SQLITE_
11000 50 52 4f 54 4f 43 4f 4c 29 20 6f 72 20 75 6e 6c  PROTOCOL) or unl
11010 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a  ess some other.*
11020 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69  * process is wri
11030 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f 20  ting trash into 
11040 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
11050 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54   (SQLITE_CORRUPT
11060 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61  ) or.** unless a
11070 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20   prior malloc() 
11080 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e  failed (SQLITE_N
11090 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72 69  OMEM).  Appropri
110a0 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  ate error.** cod
110b0 65 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20  es are returned 
110c0 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f 63  for all these oc
110d0 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77  casions.  Otherw
110e0 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ise,.** SQLITE_O
110f0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
11100 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
11110 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65  er_rollback(Page
11120 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
11130 74 20 72 63 3b 0a 20 20 54 52 41 43 45 31 28 22  t rc;.  TRACE1("
11140 52 4f 4c 4c 42 41 43 4b 5c 6e 22 29 3b 0a 20 20  ROLLBACK\n");.  
11150 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64 69 72  if( !pPager->dir
11160 74 79 46 69 6c 65 20 7c 7c 20 21 70 50 61 67 65  tyFile || !pPage
11170 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
11180 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
11190 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
111a0 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ger);.    pPager
111b0 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20  ->dbSize = -1;. 
111c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
111d0 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  }..  if( pPager-
111e0 3e 65 72 72 4d 61 73 6b 21 3d 30 20 26 26 20 70  >errMask!=0 && p
111f0 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d  Pager->errMask!=
11200 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29  PAGER_ERR_FULL )
11210 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
11220 2d 3e 73 74 61 74 65 3e 3d 53 51 4c 49 54 45 5f  ->state>=SQLITE_
11230 57 52 49 54 45 4c 4f 43 4b 20 29 7b 0a 20 20 20  WRITELOCK ){.   
11240 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63     pager_playbac
11250 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  k(pPager, 1);.  
11260 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70    }.    return p
11270 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61  ager_errcode(pPa
11280 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
11290 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 53  pPager->state!=S
112a0 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20  QLITE_WRITELOCK 
112b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
112c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
112d0 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
112e0 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  ck(pPager, 1);. 
112f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11300 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  OK ){.    rc = S
11310 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
11320 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61     pPager->errMa
11330 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f  sk |= PAGER_ERR_
11340 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20 70  CORRUPT;.  }.  p
11350 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
11360 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  -1;.  return rc;
11370 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
11380 20 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74   TRUE if the dat
11390 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70  abase file is op
113a0 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20  ened read-only. 
113b0 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a   Return FALSE.**
113c0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
113d0 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20   is (in theory) 
113e0 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74  writable..*/.int
113f0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73   sqlite3pager_is
11400 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a  readonly(Pager *
11410 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
11420 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  n pPager->readOn
11430 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ly;.}../*.** Thi
11440 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
11450 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
11460 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
11470 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33  .*/.int *sqlite3
11480 70 61 67 65 72 5f 73 74 61 74 73 28 50 61 67 65  pager_stats(Page
11490 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74  r *pPager){.  st
114a0 61 74 69 63 20 69 6e 74 20 61 5b 39 5d 3b 0a 20  atic int a[9];. 
114b0 20 61 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[0] = pPager->
114c0 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70  nRef;.  a[1] = p
114d0 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20  Pager->nPage;.  
114e0 61 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d  a[2] = pPager->m
114f0 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20  xPage;.  a[3] = 
11500 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
11510 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d    a[4] = pPager-
11520 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d  >state;.  a[5] =
11530 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
11540 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65  ;.  a[6] = pPage
11550 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20  r->nHit;.  a[7] 
11560 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b  = pPager->nMiss;
11570 0a 20 20 61 5b 38 5d 20 3d 20 70 50 61 67 65 72  .  a[8] = pPager
11580 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 72 65 74 75 72  ->nOvfl;.  retur
11590 6e 20 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n a;.}../*.** Se
115a0 74 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  t the checkpoint
115b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
115c0 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63  tine should be c
115d0 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74  alled with the t
115e0 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
115f0 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70  al already.** op
11600 65 6e 2e 20 20 41 20 6e 65 77 20 63 68 65 63 6b  en.  A new check
11610 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73  point journal is
11620 20 63 72 65 61 74 65 64 20 74 68 61 74 20 63 61   created that ca
11630 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72 6f 6c  n be used to rol
11640 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73  lback.** changes
11650 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53 51 4c   of a single SQL
11660 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20   command within 
11670 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73 61 63  a larger transac
11680 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
11690 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 62  ite3pager_stmt_b
116a0 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  egin(Pager *pPag
116b0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
116c0 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49   char zTemp[SQLI
116d0 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45  TE_TEMPNAME_SIZE
116e0 5d 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ];.  if( !pPager
116f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
11700 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  .    pPager->ckp
11710 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20  tAutoopen = 1;. 
11720 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11730 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  _OK;.  }.  asser
11740 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
11750 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 61 73 73 65  alOpen );.  asse
11760 72 74 28 20 21 70 50 61 67 65 72 2d 3e 63 6b 70  rt( !pPager->ckp
11770 74 49 6e 55 73 65 20 29 3b 0a 20 20 70 50 61 67  tInUse );.  pPag
11780 65 72 2d 3e 61 49 6e 43 6b 70 74 20 3d 20 73 71  er->aInCkpt = sq
11790 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67  liteMalloc( pPag
117a0 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31  er->dbSize/8 + 1
117b0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
117c0 2d 3e 61 49 6e 43 6b 70 74 3d 3d 30 20 29 7b 0a  ->aInCkpt==0 ){.
117d0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 52 65 61      sqlite3OsRea
117e0 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  dLock(&pPager->f
117f0 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  d);.    return S
11800 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
11810 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
11820 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
11830 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72  FileSize(&pPager
11840 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e  ->jfd, &pPager->
11850 63 6b 70 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66  ckptJSize);.  if
11860 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6b 70 74  ( rc ) goto ckpt
11870 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20  _begin_failed;. 
11880 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11890 3e 63 6b 70 74 4a 53 69 7a 65 20 3d 3d 20 0a 20  >ckptJSize == . 
118a0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2a     pPager->nRec*
118b0 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 6a 6f  JOURNAL_PG_SZ(jo
118c0 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 29 2b 4a 4f  urnal_format)+JO
118d0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 6a 6f 75  URNAL_HDR_SZ(jou
118e0 72 6e 61 6c 5f 66 6f 72 6d 61 74 29 20 29 3b 0a  rnal_format) );.
118f0 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d  #endif.  pPager-
11900 3e 63 6b 70 74 4a 53 69 7a 65 20 3d 20 70 50 61  >ckptJSize = pPa
11910 67 65 72 2d 3e 6e 52 65 63 2a 4a 4f 55 52 4e 41  ger->nRec*JOURNA
11920 4c 5f 50 47 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f  L_PG_SZ(journal_
11930 66 6f 72 6d 61 74 29 0a 20 20 20 20 20 20 20 20  format).        
11940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11950 20 2b 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   + JOURNAL_HDR_S
11960 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74  Z(journal_format
11970 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  );.  pPager->ckp
11980 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  tSize = pPager->
11990 64 62 53 69 7a 65 3b 0a 20 20 69 66 28 20 21 70  dbSize;.  if( !p
119a0 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20  Pager->ckptOpen 
119b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
119c0 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d  te3pager_opentem
119d0 70 28 7a 54 65 6d 70 2c 20 26 70 50 61 67 65 72  p(zTemp, &pPager
119e0 2d 3e 63 70 66 64 29 3b 0a 20 20 20 20 69 66 28  ->cpfd);.    if(
119f0 20 72 63 20 29 20 67 6f 74 6f 20 63 6b 70 74 5f   rc ) goto ckpt_
11a00 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20  begin_failed;.  
11a10 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4f 70    pPager->ckptOp
11a20 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  en = 1;.    pPag
11a30 65 72 2d 3e 63 6b 70 74 4e 52 65 63 20 3d 20 30  er->ckptNRec = 0
11a40 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
11a50 63 6b 70 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20  ckptInUse = 1;. 
11a60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11a70 4b 3b 0a 20 0a 63 6b 70 74 5f 62 65 67 69 6e 5f  K;. .ckpt_begin_
11a80 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50  failed:.  if( pP
11a90 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 20 29 7b  ager->aInCkpt ){
11aa0 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
11ab0 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 29  pPager->aInCkpt)
11ac0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
11ad0 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  nCkpt = 0;.  }. 
11ae0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11af0 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 63 68  *.** Commit a ch
11b00 65 63 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74  eckpoint..*/.int
11b10 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
11b20 6d 74 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20  mt_commit(Pager 
11b30 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
11b40 70 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73  pPager->ckptInUs
11b50 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  e ){.    PgHdr *
11b60 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20  pPg, *pNext;.   
11b70 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
11b80 70 50 61 67 65 72 2d 3e 63 70 66 64 2c 20 30 29  pPager->cpfd, 0)
11b90 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  ;.    /* sqlite3
11ba0 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50 61 67  OsTruncate(&pPag
11bb0 65 72 2d 3e 63 70 66 64 2c 20 30 29 3b 20 2a 2f  er->cpfd, 0); */
11bc0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  .    pPager->ckp
11bd0 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70  tNRec = 0;.    p
11be0 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65  Pager->ckptInUse
11bf0 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
11c00 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49  Free( pPager->aI
11c10 6e 43 6b 70 74 20 29 3b 0a 20 20 20 20 70 50 61  nCkpt );.    pPa
11c20 67 65 72 2d 3e 61 49 6e 43 6b 70 74 20 3d 20 30  ger->aInCkpt = 0
11c30 3b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  ;.    for(pPg=pP
11c40 61 67 65 72 2d 3e 70 43 6b 70 74 3b 20 70 50 67  ager->pCkpt; pPg
11c50 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20  ; pPg=pNext){.  
11c60 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d      pNext = pPg-
11c70 3e 70 4e 65 78 74 43 6b 70 74 3b 0a 20 20 20 20  >pNextCkpt;.    
11c80 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69    assert( pPg->i
11c90 6e 43 6b 70 74 20 29 3b 0a 20 20 20 20 20 20 70  nCkpt );.      p
11ca0 50 67 2d 3e 69 6e 43 6b 70 74 20 3d 20 30 3b 0a  Pg->inCkpt = 0;.
11cb0 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
11cc0 43 6b 70 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Ckpt = pPg->pNex
11cd0 74 43 6b 70 74 20 3d 20 30 3b 0a 20 20 20 20 7d  tCkpt = 0;.    }
11ce0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 43 6b  .    pPager->pCk
11cf0 70 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50  pt = 0;.  }.  pP
11d00 61 67 65 72 2d 3e 63 6b 70 74 41 75 74 6f 6f 70  ager->ckptAutoop
11d10 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  en = 0;.  return
11d20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
11d30 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20  *.** Rollback a 
11d40 63 68 65 63 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 69  checkpoint..*/.i
11d50 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
11d60 73 74 6d 74 5f 72 6f 6c 6c 62 61 63 6b 28 50 61  stmt_rollback(Pa
11d70 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
11d80 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50  int rc;.  if( pP
11d90 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20  ager->ckptInUse 
11da0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
11db0 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28  r_stmt_playback(
11dc0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 73 71 6c  pPager);.    sql
11dd0 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63  ite3pager_stmt_c
11de0 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20  ommit(pPager);. 
11df0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
11e00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
11e10 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 41 75    pPager->ckptAu
11e20 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65  toopen = 0;.  re
11e30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11e40 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
11e50 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
11e60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
11e70 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
11e80 73 71 6c 69 74 65 33 70 61 67 65 72 5f 66 69 6c  sqlite3pager_fil
11e90 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  ename(Pager *pPa
11ea0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
11eb0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
11ec0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
11ed0 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69  he codec for thi
11ee0 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20  s pager.*/.void 
11ef0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
11f00 5f 63 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20  _codec(.  Pager 
11f10 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20  *pPager,.  void 
11f20 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c  (*xCodec)(void*,
11f30 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c  void*,Pgno,int),
11f40 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41  .  void *pCodecA
11f50 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  rg.){.  pPager->
11f60 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b  xCodec = xCodec;
11f70 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  .  pPager->pCode
11f80 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67  cArg = pCodecArg
11f90 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
11fa0 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 50 72  TE_TEST./*.** Pr
11fb0 69 6e 74 20 61 20 6c 69 73 74 69 6e 67 20 6f 66  int a listing of
11fc0 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 64 20   all referenced 
11fd0 70 61 67 65 73 20 61 6e 64 20 74 68 65 69 72 20  pages and their 
11fe0 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f  ref count..*/.vo
11ff0 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
12000 72 65 66 64 75 6d 70 28 50 61 67 65 72 20 2a 70  refdump(Pager *p
12010 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
12020 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70 50 67 3d  *pPg;.  for(pPg=
12030 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
12040 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
12050 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70  tAll){.    if( p
12060 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29 20 63 6f  Pg->nRef<=0 ) co
12070 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 72 69 6e  ntinue;.    prin
12080 74 66 28 22 50 41 47 45 20 25 33 64 20 61 64 64  tf("PAGE %3d add
12090 72 3d 30 78 25 30 38 78 20 6e 52 65 66 3d 25 64  r=0x%08x nRef=%d
120a0 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67  \n", .       pPg
120b0 2d 3e 70 67 6e 6f 2c 20 28 69 6e 74 29 50 47 48  ->pgno, (int)PGH
120c0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
120d0 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d   pPg->nRef);.  }
120e0 0a 7d 0a 23 65 6e 64 69 66 0a                    .}.#endif.