/ Hex Artifact Content
Login

Artifact 00fabe423729e8d8a4c5e8f9602341b69a5a21b5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 31 31  : pager.c,v 1.11
0350: 31 20 32 30 30 34 2f 30 36 2f 30 34 20 30 36 3a  1 2004/06/04 06:
0360: 32 32 3a 30 31 20 64 61 6e 69 65 6c 6b 31 39 37  22:01 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 50 67 48 64 72 20 2a 70 4e  o */.  PgHdr *pN
10f0: 65 78 74 46 72 65 65 2c 20 2a 70 50 72 65 76 46  extFree, *pPrevF
1100: 72 65 65 3b 20 20 2f 2a 20 46 72 65 65 6c 69 73  ree;  /* Freelis
1110: 74 20 6f 66 20 70 61 67 65 73 20 77 68 65 72 65  t of pages where
1120: 20 6e 52 65 66 3d 3d 30 20 2a 2f 0a 20 20 50 67   nRef==0 */.  Pg
1130: 48 64 72 20 2a 70 4e 65 78 74 41 6c 6c 3b 20 20  Hdr *pNextAll;  
1140: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1150: 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  A list of all pa
1160: 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ges */.  PgHdr *
1170: 70 4e 65 78 74 53 74 6d 74 2c 20 2a 70 50 72 65  pNextStmt, *pPre
1180: 76 53 74 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20  vStmt;  /* List 
1190: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
11a0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
11b0: 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 4a 6f 75 72  l */.  u8 inJour
11c0: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
11d0: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66        /* TRUE if
11e0: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
11f0: 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  n to journal */.
1200: 20 20 75 38 20 69 6e 53 74 6d 74 3b 20 20 20 20    u8 inStmt;    
1210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1220: 20 2f 2a 20 54 52 55 45 20 69 66 20 69 6e 20 74   /* TRUE if in t
1230: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62  he statement sub
1240: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20  journal */.  u8 
1250: 64 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20  dirty;          
1260: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1270: 52 55 45 20 69 66 20 77 65 20 6e 65 65 64 20 74  RUE if we need t
1280: 6f 20 77 72 69 74 65 20 62 61 63 6b 20 63 68 61  o write back cha
1290: 6e 67 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65  nges */.  u8 nee
12a0: 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  dSync;          
12b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63           /* Sync
12c0: 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
12d0: 77 72 69 74 69 6e 67 20 74 68 69 73 20 70 61 67  writing this pag
12e0: 65 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73  e */.  u8 always
12f0: 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20  Rollback;       
1300: 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65        /* Disable
1310: 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29   dont_rollback()
1320: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a   for this page *
1330: 2f 0a 20 20 73 68 6f 72 74 20 69 6e 74 20 6e 52  /.  short int nR
1340: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
1350: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1360: 75 73 65 72 73 20 6f 66 20 74 68 69 73 20 70 61  users of this pa
1370: 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  ge */.  PgHdr *p
1380: 44 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20  Dirty;          
1390: 20 20 20 20 20 20 20 2f 2a 20 44 69 72 74 79 20         /* Dirty 
13a0: 70 61 67 65 73 20 73 6f 72 74 65 64 20 62 79 20  pages sorted by 
13b0: 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20  PgHdr.pgno */.  
13c0: 2f 2a 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  /* SQLITE_PAGE_S
13d0: 49 5a 45 20 62 79 74 65 73 20 6f 66 20 70 61 67  IZE bytes of pag
13e0: 65 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68  e data follow th
13f0: 69 73 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 2f  is header */.  /
1400: 2a 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62  * Pager.nExtra b
1410: 79 74 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61  ytes of local da
1420: 74 61 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 61  ta follow the pa
1430: 67 65 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f  ge data */.};../
1440: 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d  *.** For an in-m
1450: 65 6d 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61 62  emory only datab
1460: 61 73 65 2c 20 73 6f 6d 65 20 65 78 74 72 61 20  ase, some extra 
1470: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72  information is r
1480: 65 63 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a  ecorded about.**
1490: 20 65 61 63 68 20 70 61 67 65 20 73 6f 20 74 68   each page so th
14a0: 61 74 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62  at changes can b
14b0: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  e rolled back.  
14c0: 28 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61  (Journal files a
14d0: 72 65 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66  re not.** used f
14e0: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  or in-memory dat
14f0: 61 62 61 73 65 73 2e 29 20 20 54 68 65 20 66 6f  abases.)  The fo
1500: 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74  llowing informat
1510: 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 0a  ion is added to.
1520: 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  ** the end of ev
1530: 65 72 79 20 45 58 54 52 41 20 62 6c 6f 63 6b 20  ery EXTRA block 
1540: 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  for in-memory da
1550: 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  tabases..**.** T
1560: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
1570: 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  could have been 
1580: 61 64 64 65 64 20 64 69 72 65 63 74 6c 79 20 74  added directly t
1590: 6f 20 74 68 65 20 50 67 48 64 72 20 73 74 72 75  o the PgHdr stru
15a0: 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68  cture..** But th
15b0: 65 6e 20 69 74 20 77 6f 75 6c 64 20 74 61 6b 65  en it would take
15c0: 20 75 70 20 61 6e 20 65 78 74 72 61 20 38 20 62   up an extra 8 b
15d0: 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20  ytes of storage 
15e0: 6f 6e 20 65 76 65 72 79 20 50 67 48 64 72 0a 2a  on every PgHdr.*
15f0: 2a 20 65 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d  * even for disk-
1600: 62 61 73 65 64 20 64 61 74 61 62 61 73 65 73 2e  based databases.
1610: 20 20 53 70 6c 69 74 74 69 6e 67 20 69 74 20 6f    Splitting it o
1620: 75 74 20 73 61 76 65 73 20 38 20 62 79 74 65 73  ut saves 8 bytes
1630: 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e  .  This.** is on
1640: 6c 79 20 61 20 73 61 76 69 6e 67 73 20 6f 66 20  ly a savings of 
1650: 30 2e 38 25 20 62 75 74 20 74 68 6f 73 65 20 70  0.8% but those p
1660: 65 72 63 65 6e 74 61 67 65 73 20 61 64 64 20 75  ercentages add u
1670: 70 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  p..*/.typedef st
1680: 72 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 50  ruct PgHistory P
1690: 67 48 69 73 74 6f 72 79 3b 0a 73 74 72 75 63 74  gHistory;.struct
16a0: 20 50 67 48 69 73 74 6f 72 79 20 7b 0a 20 20 75   PgHistory {.  u
16b0: 38 20 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a  8 *pOrig;     /*
16c0: 20 4f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 74   Original page t
16d0: 65 78 74 2e 20 20 52 65 73 74 6f 72 65 20 74 6f  ext.  Restore to
16e0: 20 74 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20   this on a full 
16f0: 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38  rollback */.  u8
1700: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20   *pStmt;     /* 
1710: 54 65 78 74 20 61 73 20 69 74 20 77 61 73 20 61  Text as it was a
1720: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
1730: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  of the current s
1740: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a  tatement */.};..
1750: 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73  /*.** A macro us
1760: 65 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20  ed for invoking 
1770: 74 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65  the codec if the
1780: 72 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66  re is one.*/.#if
1790: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
17a0: 4f 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f  ODEC.# define CO
17b0: 44 45 43 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28  DEC(P,D,N,X) if(
17c0: 20 50 2d 3e 78 43 6f 64 65 63 20 29 7b 20 50 2d   P->xCodec ){ P-
17d0: 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65  >xCodec(P->pCode
17e0: 63 41 72 67 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23  cArg,D,N,X); }.#
17f0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f  else.# define CO
1800: 44 45 43 28 50 2c 44 2c 4e 2c 58 29 0a 23 65 6e  DEC(P,D,N,X).#en
1810: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  dif../*.** Conve
1820: 72 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rt a pointer to 
1830: 61 20 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70  a PgHdr into a p
1840: 6f 69 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61  ointer to its da
1850: 74 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61  ta.** and back a
1860: 67 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  gain..*/.#define
1870: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50   PGHDR_TO_DATA(P
1880: 29 20 20 28 28 76 6f 69 64 2a 29 28 26 28 50 29  )  ((void*)(&(P)
1890: 5b 31 5d 29 29 0a 23 64 65 66 69 6e 65 20 44 41  [1])).#define DA
18a0: 54 41 5f 54 4f 5f 50 47 48 44 52 28 44 29 20 20  TA_TO_PGHDR(D)  
18b0: 28 26 28 28 50 67 48 64 72 2a 29 28 44 29 29 5b  (&((PgHdr*)(D))[
18c0: 2d 31 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48  -1]).#define PGH
18d0: 44 52 5f 54 4f 5f 45 58 54 52 41 28 50 29 20 28  DR_TO_EXTRA(P) (
18e0: 28 76 6f 69 64 2a 29 26 28 28 63 68 61 72 2a 29  (void*)&((char*)
18f0: 28 26 28 50 29 5b 31 5d 29 29 5b 53 51 4c 49 54  (&(P)[1]))[SQLIT
1900: 45 5f 50 41 47 45 5f 53 49 5a 45 5d 29 0a 23 64  E_PAGE_SIZE]).#d
1910: 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 48  efine PGHDR_TO_H
1920: 49 53 54 28 50 2c 50 47 52 29 20 20 5c 0a 20 20  IST(P,PGR)  \.  
1930: 20 20 20 20 20 20 20 20 20 20 28 28 50 67 48 69            ((PgHi
1940: 73 74 6f 72 79 2a 29 26 28 28 63 68 61 72 2a 29  story*)&((char*)
1950: 28 26 28 50 29 5b 31 5d 29 29 5b 28 50 47 52 29  (&(P)[1]))[(PGR)
1960: 2d 3e 70 61 67 65 53 69 7a 65 2b 28 50 47 52 29  ->pageSize+(PGR)
1970: 2d 3e 6e 45 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a  ->nExtra])../*.*
1980: 2a 20 48 6f 77 20 62 69 67 20 74 6f 20 6d 61 6b  * How big to mak
1990: 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  e the hash table
19a0: 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 61 74 69   used for locati
19b0: 6e 67 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ng in-memory pag
19c0: 65 73 0a 2a 2a 20 62 79 20 70 61 67 65 20 6e 75  es.** by page nu
19d0: 6d 62 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  mber..*/.#define
19e0: 20 4e 5f 50 47 5f 48 41 53 48 20 32 30 34 38 0a   N_PG_HASH 2048.
19f0: 0a 2f 2a 0a 2a 2a 20 48 61 73 68 20 61 20 70 61  ./*.** Hash a pa
1a00: 67 65 20 6e 75 6d 62 65 72 0a 2a 2f 0a 23 64 65  ge number.*/.#de
1a10: 66 69 6e 65 20 70 61 67 65 72 5f 68 61 73 68 28  fine pager_hash(
1a20: 50 4e 29 20 20 28 28 50 4e 29 26 28 4e 5f 50 47  PN)  ((PN)&(N_PG
1a30: 5f 48 41 53 48 2d 31 29 29 0a 0a 2f 2a 0a 2a 2a  _HASH-1))../*.**
1a40: 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63   A open page cac
1a50: 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  he is an instanc
1a60: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
1a70: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ng structure..*/
1a80: 0a 73 74 72 75 63 74 20 50 61 67 65 72 20 7b 0a  .struct Pager {.
1a90: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
1aa0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
1ab0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
1ac0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
1ad0: 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20  char *zJournal; 
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1af0: 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
1b00: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  al file */.  cha
1b10: 72 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b 20 20  r *zDirectory;  
1b20: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65           /* Dire
1b30: 63 74 6f 72 79 20 68 6f 6c 64 20 64 61 74 61 62  ctory hold datab
1b40: 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20  ase and journal 
1b50: 66 69 6c 65 73 20 2a 2f 0a 20 20 4f 73 46 69 6c  files */.  OsFil
1b60: 65 20 66 64 2c 20 6a 66 64 3b 20 20 20 20 20 20  e fd, jfd;      
1b70: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
1b80: 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 64  escriptors for d
1b90: 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72  atabase and jour
1ba0: 6e 61 6c 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20  nal */.  OsFile 
1bb0: 73 74 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  stfd;           
1bc0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
1bd0: 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20  criptor for the 
1be0: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
1bf0: 72 6e 61 6c 2a 2f 0a 20 20 69 6e 74 20 64 62 53  rnal*/.  int dbS
1c00: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
1c10: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1c20: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66  f pages in the f
1c30: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69  ile */.  int ori
1c40: 67 44 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20  gDbSize;        
1c50: 20 20 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62       /* dbSize b
1c60: 65 66 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  efore the curren
1c70: 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 69 6e  t change */.  in
1c80: 74 20 73 74 6d 74 53 69 7a 65 3b 20 20 20 20 20  t stmtSize;     
1c90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1ca0: 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 28 69  e of database (i
1cb0: 6e 20 70 61 67 65 73 29 20 61 74 20 73 74 6d 74  n pages) at stmt
1cc0: 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 6f 66  _begin() */.  of
1cd0: 66 5f 74 20 73 74 6d 74 4a 53 69 7a 65 3b 20 20  f_t stmtJSize;  
1ce0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1cf0: 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 74 20  e of journal at 
1d00: 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a  stmt_begin() */.
1d10: 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20    int nRec;     
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d30: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1d40: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1d50: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
1d60: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
1d70: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
1d80: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
1d90: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
1da0: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20  ecksum */.  int 
1db0: 73 74 6d 74 4e 52 65 63 3b 20 20 20 20 20 20 20  stmtNRec;       
1dc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1dd0: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20  r of records in 
1de0: 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20  stmt subjournal 
1df0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 3b  */.  int nExtra;
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e10: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
1e20: 79 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20  y bytes to each 
1e30: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
1e40: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74  /.  void (*xDest
1e50: 72 75 63 74 6f 72 29 28 76 6f 69 64 2a 2c 69 6e  ructor)(void*,in
1e60: 74 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73  t); /* Call this
1e70: 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 66 72   routine when fr
1e80: 65 65 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20  eeing pages */. 
1e90: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20   int pageSize;  
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1eb0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1ec0: 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69  in a page */.  i
1ed0: 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
1ee0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
1ef0: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  tal number of in
1f00: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f  -memory pages */
1f10: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
1f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f30: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  * Number of in-m
1f40: 65 6d 6f 72 79 20 70 61 67 65 73 20 77 69 74 68  emory pages with
1f50: 20 50 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a 2f   PgHdr.nRef>0 */
1f60: 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20 20  .  int mxPage;  
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f80: 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
1f90: 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f 6c   of pages to hol
1fa0: 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20  d in cache */.  
1fb0: 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 2c  int nHit, nMiss,
1fc0: 20 6e 4f 76 66 6c 3b 20 20 20 20 20 2f 2a 20 43   nOvfl;     /* C
1fd0: 61 63 68 65 20 68 69 74 73 2c 20 6d 69 73 73 69  ache hits, missi
1fe0: 6e 67 2c 20 61 6e 64 20 4c 52 55 20 6f 76 65 72  ng, and LRU over
1ff0: 66 6c 6f 77 73 20 2a 2f 0a 20 20 76 6f 69 64 20  flows */.  void 
2000: 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c  (*xCodec)(void*,
2010: 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b  void*,Pgno,int);
2020: 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20   /* Routine for 
2030: 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61  en/decoding data
2040: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64   */.  void *pCod
2050: 65 63 41 72 67 3b 20 20 20 20 20 20 20 20 20 20  ecArg;          
2060: 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
2070: 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 28 29 20  ent to xCodec() 
2080: 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f  */.  u8 journalO
2090: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
20a0: 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72   /* True if jour
20b0: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
20c0: 74 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f  tors is valid */
20d0: 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61  .  u8 journalSta
20e0: 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f  rted;          /
20f0: 2a 20 54 72 75 65 20 69 66 20 68 65 61 64 65 72  * True if header
2100: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73   of journal is s
2110: 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20 75 73  ynced */.  u8 us
2120: 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  eJournal;       
2130: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20         /* Use a 
2140: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
2150: 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f   on this file */
2160: 0a 20 20 75 38 20 73 74 6d 74 4f 70 65 6e 3b 20  .  u8 stmtOpen; 
2170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2180: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73 74  * True if the st
2190: 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e  atement subjourn
21a0: 61 6c 20 69 73 20 6f 70 65 6e 20 2a 2f 0a 20 20  al is open */.  
21b0: 75 38 20 73 74 6d 74 49 6e 55 73 65 3b 20 20 20  u8 stmtInUse;   
21c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
21d0: 72 75 65 20 77 65 20 61 72 65 20 69 6e 20 61 20  rue we are in a 
21e0: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  statement subtra
21f0: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38  nsaction */.  u8
2200: 20 73 74 6d 74 41 75 74 6f 6f 70 65 6e 3b 20 20   stmtAutoopen;  
2210: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
2220: 6e 20 73 74 6d 74 20 6a 6f 75 72 6e 61 6c 20 77  n stmt journal w
2230: 68 65 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  hen main journal
2240: 20 69 73 20 6f 70 65 6e 65 64 2a 2f 0a 20 20 75   is opened*/.  u
2250: 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20  8 noSync;       
2260: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
2270: 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f   not sync the jo
2280: 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f  urnal if true */
2290: 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20  .  u8 fullSync; 
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22b0: 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73  * Do extra syncs
22c0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
22d0: 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a  for robustness *
22e0: 2f 0a 20 20 75 38 20 73 74 61 74 65 3b 20 20 20  /.  u8 state;   
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2300: 2f 2a 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b  /* SQLITE_UNLOCK
2310: 2c 20 5f 52 45 41 44 4c 4f 43 4b 20 6f 72 20 5f  , _READLOCK or _
2320: 57 52 49 54 45 4c 4f 43 4b 20 2a 2f 0a 20 20 75  WRITELOCK */.  u
2330: 38 20 65 72 72 4d 61 73 6b 3b 20 20 20 20 20 20  8 errMask;      
2340: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
2350: 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69 6e  e of several kin
2360: 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a  ds of errors */.
2370: 20 20 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20    u8 tempFile;  
2380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2390: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20   zFilename is a 
23a0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a  temporary file *
23b0: 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b  /.  u8 readOnly;
23c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d0: 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65  /* True for a re
23e0: 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
23f0: 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e   */.  u8 needSyn
2400: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2410: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20    /* True if an 
2420: 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65  fsync() is neede
2430: 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
2440: 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 46 69   */.  u8 dirtyFi
2450: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
2460: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 64 61 74    /* True if dat
2470: 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 63  abase file has c
2480: 68 61 6e 67 65 64 20 69 6e 20 61 6e 79 20 77 61  hanged in any wa
2490: 79 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73  y */.  u8 always
24a0: 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20  Rollback;       
24b0: 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f     /* Disable do
24c0: 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f  nt_rollback() fo
24d0: 72 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20  r all pages */. 
24e0: 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20   u8 memDb;      
24f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2500: 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20  True to inhibit 
2510: 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a  all file I/O */.
2520: 20 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c    u8 *aInJournal
2530: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2540: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
2550: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
2560: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
2570: 20 75 38 20 2a 61 49 6e 53 74 6d 74 3b 20 20 20   u8 *aInStmt;   
2580: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2590: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
25a0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
25b0: 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 48 64 72  abase */.  PgHdr
25c0: 20 2a 70 46 69 72 73 74 2c 20 2a 70 4c 61 73 74   *pFirst, *pLast
25d0: 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ;      /* List o
25e0: 66 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f 0a  f free pages */.
25f0: 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74 53    PgHdr *pFirstS
2600: 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 2f 2a  ynced;        /*
2610: 20 46 69 72 73 74 20 66 72 65 65 20 70 61 67 65   First free page
2620: 20 77 69 74 68 20 50 67 48 64 72 2e 6e 65 65 64   with PgHdr.need
2630: 53 79 6e 63 3d 3d 30 20 2a 2f 0a 20 20 50 67 48  Sync==0 */.  PgH
2640: 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20 20  dr *pAll;       
2650: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
2660: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f   of all pages */
2670: 0a 20 20 50 67 48 64 72 20 2a 70 53 74 6d 74 3b  .  PgHdr *pStmt;
2680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2690: 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20  * List of pages 
26a0: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
26b0: 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   subjournal */. 
26c0: 20 50 67 48 64 72 20 2a 61 48 61 73 68 5b 4e 5f   PgHdr *aHash[N_
26d0: 50 47 5f 48 41 53 48 5d 3b 20 20 20 20 2f 2a 20  PG_HASH];    /* 
26e0: 48 61 73 68 20 74 61 62 6c 65 20 74 6f 20 6d 61  Hash table to ma
26f0: 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  p page number of
2700: 20 50 67 48 64 72 20 2a 2f 0a 20 20 69 6e 74 20   PgHdr */.  int 
2710: 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20  nMaster;        
2720: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2730: 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65  r of bytes to re
2740: 73 65 72 76 65 20 66 6f 72 20 6d 61 73 74 65 72  serve for master
2750: 20 6a 2e 70 20 2a 2f 0a 20 20 42 75 73 79 48 61   j.p */.  BusyHa
2760: 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64  ndler *pBusyHand
2770: 6c 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72  ler;  /* Pointer
2780: 20 74 6f 20 73 71 6c 69 74 65 2e 62 75 73 79 48   to sqlite.busyH
2790: 61 6e 64 6c 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  andler */.};../*
27a0: 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 62 69  .** These are bi
27b0: 74 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 73  ts that can be s
27c0: 65 74 20 69 6e 20 50 61 67 65 72 2e 65 72 72 4d  et in Pager.errM
27d0: 61 73 6b 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ask..*/.#define 
27e0: 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 20  PAGER_ERR_FULL  
27f0: 20 20 20 30 78 30 31 20 20 2f 2a 20 61 20 77 72     0x01  /* a wr
2800: 69 74 65 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a  ite() failed */.
2810: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52  #define PAGER_ER
2820: 52 5f 4d 45 4d 20 20 20 20 20 20 30 78 30 32 20  R_MEM      0x02 
2830: 20 2f 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   /* malloc() fai
2840: 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  led */.#define P
2850: 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 20 20  AGER_ERR_LOCK   
2860: 20 20 30 78 30 34 20 20 2f 2a 20 65 72 72 6f 72    0x04  /* error
2870: 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
2880: 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 23 64 65 66  protocol */.#def
2890: 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 43 4f  ine PAGER_ERR_CO
28a0: 52 52 55 50 54 20 20 30 78 30 38 20 20 2f 2a 20  RRUPT  0x08  /* 
28b0: 64 61 74 61 62 61 73 65 20 6f 72 20 6a 6f 75 72  database or jour
28c0: 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a  nal corruption *
28d0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
28e0: 45 52 52 5f 44 49 53 4b 20 20 20 20 20 30 78 31  ERR_DISK     0x1
28f0: 30 20 20 2f 2a 20 67 65 6e 65 72 61 6c 20 64 69  0  /* general di
2900: 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 2d 20 62  sk I/O error - b
2910: 61 64 20 68 61 72 64 20 64 72 69 76 65 3f 20 2a  ad hard drive? *
2920: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  /../*.** The jou
2930: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
2940: 6e 73 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  ns page records 
2950: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
2960: 0a 2a 2a 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  .** format..**.*
2970: 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 69 73  * Actually, this
2980: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 74 68   structure is th
2990: 65 20 63 6f 6d 70 6c 65 74 65 20 70 61 67 65 20  e complete page 
29a0: 72 65 63 6f 72 64 20 66 6f 72 20 70 61 67 65 72  record for pager
29b0: 0a 2a 2a 20 66 6f 72 6d 61 74 73 20 6c 65 73 73  .** formats less
29c0: 20 74 68 61 6e 20 33 2e 20 20 42 65 67 69 6e 6e   than 3.  Beginn
29d0: 69 6e 67 20 77 69 74 68 20 66 6f 72 6d 61 74 20  ing with format 
29e0: 33 2c 20 74 68 69 73 20 72 65 63 6f 72 64 20 69  3, this record i
29f0: 73 20 73 75 72 72 6f 75 6e 64 65 64 0a 2a 2a 20  s surrounded.** 
2a00: 62 79 20 74 77 6f 20 63 68 65 63 6b 73 75 6d 73  by two checksums
2a10: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
2a20: 75 63 74 20 50 61 67 65 52 65 63 6f 72 64 20 50  uct PageRecord P
2a30: 61 67 65 52 65 63 6f 72 64 3b 0a 73 74 72 75 63  ageRecord;.struc
2a40: 74 20 50 61 67 65 52 65 63 6f 72 64 20 7b 0a 20  t PageRecord {. 
2a50: 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
2a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a70: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d   /* The page num
2a80: 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 61 44  ber */.  char aD
2a90: 61 74 61 5b 53 51 4c 49 54 45 5f 50 41 47 45 5f  ata[SQLITE_PAGE_
2aa0: 53 49 5a 45 5d 3b 20 20 20 2f 2a 20 4f 72 69 67  SIZE];   /* Orig
2ab0: 69 6e 61 6c 20 64 61 74 61 20 66 6f 72 20 70 61  inal data for pa
2ac0: 67 65 20 70 67 6e 6f 20 2a 2f 0a 7d 3b 0a 0a 2f  ge pgno */.};../
2ad0: 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c  *.** Journal fil
2ae0: 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68  es begin with th
2af0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69  e following magi
2b00: 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64  c string.  The d
2b10: 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69  ata.** was obtai
2b20: 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61  ned from /dev/ra
2b30: 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65  ndom.  It is use
2b40: 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69  d only as a sani
2b50: 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ty check..**.** 
2b60: 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
2b70: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 73 20  journal formats 
2b80: 28 73 6f 20 66 61 72 29 2e 20 54 68 65 20 31 73  (so far). The 1s
2b90: 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  t journal format
2ba0: 20 77 72 69 74 65 73 0a 2a 2a 20 33 32 2d 62 69   writes.** 32-bi
2bb0: 74 20 69 6e 74 65 67 65 72 73 20 69 6e 20 74 68  t integers in th
2bc0: 65 20 62 79 74 65 2d 6f 72 64 65 72 20 6f 66 20  e byte-order of 
2bd0: 74 68 65 20 68 6f 73 74 20 6d 61 63 68 69 6e 65  the host machine
2be0: 2e 20 20 4e 65 77 0a 2a 2a 20 66 6f 72 6d 61 74  .  New.** format
2bf0: 73 20 77 72 69 74 65 73 20 69 6e 74 65 67 65 72  s writes integer
2c00: 73 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e  s as big-endian.
2c10: 20 20 41 6c 6c 20 6e 65 77 20 6a 6f 75 72 6e 61    All new journa
2c20: 6c 73 20 75 73 65 20 74 68 65 0a 2a 2a 20 6e 65  ls use the.** ne
2c30: 77 20 66 6f 72 6d 61 74 2c 20 62 75 74 20 77 65  w format, but we
2c40: 20 68 61 76 65 20 74 6f 20 62 65 20 61 62 6c 65   have to be able
2c50: 20 74 6f 20 72 65 61 64 20 61 6e 20 6f 6c 64 65   to read an olde
2c60: 72 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6f 72 64  r journal in ord
2c70: 65 72 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 62 61 63  er.** to rollbac
2c80: 6b 20 6a 6f 75 72 6e 61 6c 73 20 63 72 65 61 74  k journals creat
2c90: 65 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73  ed by older vers
2ca0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 69 62 72  ions of the libr
2cb0: 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 33  ary..**.** The 3
2cc0: 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  rd journal forma
2cd0: 74 20 28 61 64 64 65 64 20 66 6f 72 20 32 2e 38  t (added for 2.8
2ce0: 2e 30 29 20 61 64 64 73 20 61 64 64 69 74 69 6f  .0) adds additio
2cf0: 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68  nal sanity.** ch
2d00: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
2d10: 6f 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  on to the journa
2d20: 6c 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72  l.  If the power
2d30: 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65   fails while the
2d40: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  .** journal is b
2d50: 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 73 65  eing written, se
2d60: 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67  mi-random garbag
2d70: 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70  e data might app
2d80: 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6a 6f  ear in.** the jo
2d90: 75 72 6e 61 6c 20 66 69 6c 65 20 61 66 74 65 72  urnal file after
2da0: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
2db0: 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d  ed.  If an attem
2dc0: 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a  pt is then made.
2dd0: 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a  ** to roll the j
2de0: 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65  ournal back, the
2df0: 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20   database could 
2e00: 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54  be corrupted.  T
2e10: 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a  he additional.**
2e20: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
2e30: 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65   data is an atte
2e40: 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20  mpt to discover 
2e50: 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74  the garbage in t
2e60: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  he.** journal an
2e70: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a  d ignore it..**.
2e80: 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68  ** The sanity ch
2e90: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
2ea0: 6f 6e 20 66 6f 72 20 74 68 65 20 33 72 64 20 6a  on for the 3rd j
2eb0: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
2ec0: 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33  nsists.** of a 3
2ed0: 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f  2-bit checksum o
2ee0: 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64  n each page of d
2ef0: 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73  ata.  The checks
2f00: 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a  um covers both.*
2f10: 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * the page numbe
2f20: 72 20 61 6e 64 20 74 68 65 20 53 51 4c 49 54 45  r and the SQLITE
2f30: 5f 50 41 47 45 5f 53 49 5a 45 20 62 79 74 65 73  _PAGE_SIZE bytes
2f40: 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65   of data for the
2f50: 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63   page..** This c
2f60: 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  ksum is initiali
2f70: 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20  zed to a 32-bit 
2f80: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61  random value tha
2f90: 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  t appears in the
2fa0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
2fb0: 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65   right after the
2fc0: 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61   header.  The ra
2fd0: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72  ndom initializer
2fe0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a   is important,.*
2ff0: 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67  * because garbag
3000: 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65  e data that appe
3010: 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ars at the end o
3020: 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  f a journal is l
3030: 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68  ikely.** data th
3040: 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f  at was once in o
3050: 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20  ther files that 
3060: 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65  have now been de
3070: 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a  leted.  If the.*
3080: 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63  * garbage data c
3090: 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f  ame from an obso
30a0: 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  lete journal fil
30b0: 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  e, the checksums
30c0: 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72   might.** be cor
30d0: 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e  rect.  But by in
30e0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63  itializing the c
30f0: 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f  hecksum to rando
3100: 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a  m value which.**
3110: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f   is different fo
3120: 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c  r every journal,
3130: 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61   we minimize tha
3140: 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  t risk..*/.stati
3150: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
3160: 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61   char aJournalMa
3170: 67 69 63 31 5b 5d 20 3d 20 7b 0a 20 20 30 78 64  gic1[] = {.  0xd
3180: 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30  9, 0xd5, 0x05, 0
3190: 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c  xf9, 0x20, 0xa1,
31a0: 20 30 78 36 33 2c 20 30 78 64 34 2c 0a 7d 3b 0a   0x63, 0xd4,.};.
31b0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
31c0: 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72  igned char aJour
31d0: 6e 61 6c 4d 61 67 69 63 32 5b 5d 20 3d 20 7b 0a  nalMagic2[] = {.
31e0: 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78    0xd9, 0xd5, 0x
31f0: 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20  05, 0xf9, 0x20, 
3200: 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 35  0xa1, 0x63, 0xd5
3210: 2c 0a 7d 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73  ,.};.static cons
3220: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
3230: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 33 5b 5d  aJournalMagic3[]
3240: 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64   = {.  0xd9, 0xd
3250: 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30  5, 0x05, 0xf9, 0
3260: 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c  x20, 0xa1, 0x63,
3270: 20 30 78 64 36 2c 0a 7d 3b 0a 23 64 65 66 69 6e   0xd6,.};.#defin
3280: 65 20 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54  e JOURNAL_FORMAT
3290: 5f 31 20 31 0a 23 64 65 66 69 6e 65 20 4a 4f 55  _1 1.#define JOU
32a0: 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 32 20 32 0a  RNAL_FORMAT_2 2.
32b0: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
32c0: 46 4f 52 4d 41 54 5f 33 20 33 0a 0a 2f 2a 0a 2a  FORMAT_3 3../*.*
32d0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
32e0: 69 6e 74 65 67 65 72 20 64 65 74 65 72 6d 69 6e  integer determin
32f0: 65 73 20 77 68 61 74 20 66 6f 72 6d 61 74 20 74  es what format t
3300: 6f 20 75 73 65 20 77 68 65 6e 20 63 72 65 61 74  o use when creat
3310: 69 6e 67 0a 2a 2a 20 6e 65 77 20 70 72 69 6d 61  ing.** new prima
3320: 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ry journal files
3330: 2e 20 20 42 79 20 64 65 66 61 75 6c 74 20 77 65  .  By default we
3340: 20 61 6c 77 61 79 73 20 75 73 65 20 66 6f 72 6d   always use form
3350: 61 74 20 33 2e 0a 2a 2a 20 57 68 65 6e 20 74 65  at 3..** When te
3360: 73 74 69 6e 67 2c 20 77 65 20 63 61 6e 20 73 65  sting, we can se
3370: 74 20 74 68 69 73 20 76 61 6c 75 65 20 74 6f 20  t this value to 
3380: 6f 6c 64 65 72 20 6a 6f 75 72 6e 61 6c 20 66 6f  older journal fo
3390: 72 6d 61 74 73 20 69 6e 20 6f 72 64 65 72 20 74  rmats in order t
33a0: 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75 72 65 20 74  o.** make sure t
33b0: 68 61 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f  hat newer versio
33c0: 6e 73 20 6f 66 20 74 68 65 20 6c 69 62 72 61 72  ns of the librar
33d0: 79 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f  y are able to ro
33e0: 6c 6c 62 61 63 6b 20 6f 6c 64 65 72 0a 2a 2a 20  llback older.** 
33f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
3400: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 73  *.** Note that s
3410: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
3420: 73 20 61 6c 77 61 79 73 20 75 73 65 20 66 6f 72  s always use for
3430: 6d 61 74 20 32 20 61 6e 64 20 6f 6d 69 74 20 74  mat 2 and omit t
3440: 68 65 20 68 65 61 64 65 72 2e 0a 2a 2f 0a 23 69  he header..*/.#i
3450: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
3460: 0a 69 6e 74 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72  .int journal_for
3470: 6d 61 74 20 3d 20 33 3b 0a 23 65 6c 73 65 0a 23  mat = 3;.#else.#
3480: 20 64 65 66 69 6e 65 20 6a 6f 75 72 6e 61 6c 5f   define journal_
3490: 66 6f 72 6d 61 74 20 33 0a 23 65 6e 64 69 66 0a  format 3.#endif.
34a0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20  ./*.** The size 
34b0: 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 61 6e  of the header an
34c0: 64 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 69  d of each page i
34d0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 76 61  n the journal va
34e0: 72 69 65 73 20 61 63 63 6f 72 64 69 6e 67 0a 2a  ries according.*
34f0: 2a 20 74 6f 20 77 68 69 63 68 20 6a 6f 75 72 6e  * to which journ
3500: 61 6c 20 66 6f 72 6d 61 74 20 69 73 20 62 65 69  al format is bei
3510: 6e 67 20 75 73 65 64 2e 20 20 54 68 65 20 66 6f  ng used.  The fo
3520: 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 20 66  llowing macros f
3530: 69 67 75 72 65 20 6f 75 74 0a 2a 2a 20 74 68 65  igure out.** the
3540: 20 73 69 7a 65 73 20 62 61 73 65 64 20 6f 6e 20   sizes based on 
3550: 66 6f 72 6d 61 74 20 6e 75 6d 62 65 72 73 2e 0a  format numbers..
3560: 2a 2f 0a 2f 2a 0a 23 64 65 66 69 6e 65 20 4a 4f  */./*.#define JO
3570: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 58 29 20  URNAL_HDR_SZ(X) 
3580: 5c 0a 20 20 20 28 73 69 7a 65 6f 66 28 61 4a 6f  \.   (sizeof(aJo
3590: 75 72 6e 61 6c 4d 61 67 69 63 31 29 20 2b 20 73  urnalMagic1) + s
35a0: 69 7a 65 6f 66 28 50 67 6e 6f 29 20 2b 20 28 28  izeof(Pgno) + ((
35b0: 58 29 3e 3d 33 29 2a 32 2a 73 69 7a 65 6f 66 28  X)>=3)*2*sizeof(
35c0: 75 33 32 29 29 0a 2a 2f 0a 23 64 65 66 69 6e 65  u32)).*/.#define
35d0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
35e0: 70 50 61 67 65 72 2c 20 58 29 20 28 5c 0a 20 20  pPager, X) (\.  
35f0: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
3600: 4d 61 67 69 63 31 29 20 2b 20 5c 0a 20 20 20 73  Magic1) + \.   s
3610: 69 7a 65 6f 66 28 50 67 6e 6f 29 20 2b 20 5c 0a  izeof(Pgno) + \.
3620: 20 20 20 28 28 58 29 3e 3d 33 3f 33 2a 73 69 7a     ((X)>=3?3*siz
3630: 65 6f 66 28 75 33 32 29 2b 28 70 50 61 67 65 72  eof(u32)+(pPager
3640: 29 2d 3e 6e 4d 61 73 74 65 72 3a 30 29 20 29 0a  )->nMaster:0) ).
3650: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
3660: 50 47 5f 53 5a 28 58 29 20 5c 0a 20 20 20 28 53  PG_SZ(X) \.   (S
3670: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 20  QLITE_PAGE_SIZE 
3680: 2b 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 20 2b  + sizeof(Pgno) +
3690: 20 28 28 58 29 3e 3d 33 29 2a 73 69 7a 65 6f 66   ((X)>=3)*sizeof
36a0: 28 75 33 32 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 45  (u32)).../*.** E
36b0: 6e 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65 20  nable reference 
36c0: 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67 20 68  count tracking h
36d0: 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ere:.*/.#ifdef S
36e0: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
36f0: 20 70 61 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f   pager3_refinfo_
3700: 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20 20 73 74  enable = 0;.  st
3710: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
3720: 72 65 66 69 6e 66 6f 28 50 67 48 64 72 20 2a 70  refinfo(PgHdr *p
3730: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e  ){.    static in
3740: 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69  t cnt = 0;.    i
3750: 66 28 20 21 70 61 67 65 72 33 5f 72 65 66 69 6e  f( !pager3_refin
3760: 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72 65 74 75  fo_enable ) retu
3770: 72 6e 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 0a  rn;.    printf(.
3780: 20 20 20 20 20 20 20 22 52 45 46 43 4e 54 3a 20         "REFCNT: 
3790: 25 34 64 20 61 64 64 72 3d 30 78 25 30 38 78 20  %4d addr=0x%08x 
37a0: 6e 52 65 66 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  nRef=%d\n",.    
37b0: 20 20 20 70 2d 3e 70 67 6e 6f 2c 20 28 69 6e 74     p->pgno, (int
37c0: 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
37d0: 29 2c 20 70 2d 3e 6e 52 65 66 0a 20 20 20 20 29  ), p->nRef.    )
37e0: 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 20 20 20 2f  ;.    cnt++;   /
37f0: 2a 20 53 6f 6d 65 74 68 69 6e 67 20 74 6f 20 73  * Something to s
3800: 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20  et a breakpoint 
3810: 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64 65 66 69  on */.  }.# defi
3820: 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 20 20 70  ne REFINFO(X)  p
3830: 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 58 29 0a  ager_refinfo(X).
3840: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 52  #else.# define R
3850: 45 46 49 4e 46 4f 28 58 29 0a 23 65 6e 64 69 66  EFINFO(X).#endif
3860: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33  ../*.** Read a 3
3870: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72  2-bit integer fr
3880: 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  om the given fil
3890: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53  e descriptor.  S
38a0: 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72  tore the integer
38b0: 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64  .** that is read
38c0: 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75   in *pRes.  Retu
38d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
38e0: 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65  everything worke
38f0: 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f  d, or an.** erro
3900: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
3910: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
3920: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
3930: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 69 73 20 32  rnal format is 2
3940: 20 6f 72 20 33 2c 20 72 65 61 64 20 61 20 62 69   or 3, read a bi
3950: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
3960: 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 6a 6f 75  .  If the.** jou
3970: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 69 73 20 31  rnal format is 1
3980: 2c 20 72 65 61 64 20 61 6e 20 69 6e 74 65 67 65  , read an intege
3990: 72 20 69 6e 20 74 68 65 20 6e 61 74 69 76 65 20  r in the native 
39a0: 62 79 74 65 2d 6f 72 64 65 72 20 6f 66 20 74 68  byte-order of th
39b0: 65 0a 2a 2a 20 68 6f 73 74 20 6d 61 63 68 69 6e  e.** host machin
39c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
39d0: 20 72 65 61 64 33 32 62 69 74 73 28 69 6e 74 20   read32bits(int 
39e0: 66 6f 72 6d 61 74 2c 20 4f 73 46 69 6c 65 20 2a  format, OsFile *
39f0: 66 64 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a  fd, u32 *pRes){.
3a00: 20 20 75 33 32 20 72 65 73 3b 0a 20 20 69 6e 74    u32 res;.  int
3a10: 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
3a20: 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 26 72  te3OsRead(fd, &r
3a30: 65 73 2c 20 73 69 7a 65 6f 66 28 72 65 73 29 29  es, sizeof(res))
3a40: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
3a50: 54 45 5f 4f 4b 20 26 26 20 66 6f 72 6d 61 74 3e  TE_OK && format>
3a60: 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 31  JOURNAL_FORMAT_1
3a70: 20 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   ){.    unsigned
3a80: 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 20   char ac[4];.   
3a90: 20 6d 65 6d 63 70 79 28 61 63 2c 20 26 72 65 73   memcpy(ac, &res
3aa0: 2c 20 34 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  , 4);.    res = 
3ab0: 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61  (ac[0]<<24) | (a
3ac0: 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b  c[1]<<16) | (ac[
3ad0: 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a  2]<<8) | ac[3];.
3ae0: 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 72 65    }.  *pRes = re
3af0: 73 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  s;.  return rc;.
3b00: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
3b10: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
3b20: 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66  into the given f
3b30: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
3b40: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
3b50: 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  K.** on success 
3b60: 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
3b70: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
3b80: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20  es wrong..**.** 
3b90: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
3ba0: 6f 72 6d 61 74 20 69 73 20 32 20 6f 72 20 33 2c  ormat is 2 or 3,
3bb0: 20 77 72 69 74 65 20 74 68 65 20 69 6e 74 65 67   write the integ
3bc0: 65 72 20 61 73 20 34 20 62 69 67 2d 65 6e 64 69  er as 4 big-endi
3bd0: 61 6e 0a 2a 2a 20 62 79 74 65 73 2e 20 20 49 66  an.** bytes.  If
3be0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
3bf0: 6d 61 74 20 69 73 20 31 2c 20 77 72 69 74 65 20  mat is 1, write 
3c00: 74 68 65 20 69 6e 74 65 67 65 72 20 69 6e 20 74  the integer in t
3c10: 68 65 20 6e 61 74 69 76 65 0a 2a 2a 20 62 79 74  he native.** byt
3c20: 65 20 6f 72 64 65 72 2e 20 20 49 6e 20 6e 6f 72  e order.  In nor
3c30: 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f  mal operation, o
3c40: 6e 6c 79 20 66 6f 72 6d 61 74 73 20 32 20 61 6e  nly formats 2 an
3c50: 64 20 33 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a  d 3 are used..**
3c60: 20 4a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   Journal format 
3c70: 31 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66  1 is only used f
3c80: 6f 72 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 73  or testing..*/.s
3c90: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33  tatic int write3
3ca0: 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64  2bits(OsFile *fd
3cb0: 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 75 6e  , u32 val){.  un
3cc0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34  signed char ac[4
3cd0: 5d 3b 0a 20 20 69 66 28 20 6a 6f 75 72 6e 61 6c  ];.  if( journal
3ce0: 5f 66 6f 72 6d 61 74 3c 3d 31 20 29 7b 0a 20 20  _format<=1 ){.  
3cf0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
3d00: 4f 73 57 72 69 74 65 28 66 64 2c 20 26 76 61 6c  OsWrite(fd, &val
3d10: 2c 20 34 29 3b 0a 20 20 7d 0a 20 20 61 63 5b 30  , 4);.  }.  ac[0
3d20: 5d 20 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26 20  ] = (val>>24) & 
3d30: 30 78 66 66 3b 0a 20 20 61 63 5b 31 5d 20 3d 20  0xff;.  ac[1] = 
3d40: 28 76 61 6c 3e 3e 31 36 29 20 26 20 30 78 66 66  (val>>16) & 0xff
3d50: 3b 0a 20 20 61 63 5b 32 5d 20 3d 20 28 76 61 6c  ;.  ac[2] = (val
3d60: 3e 3e 38 29 20 26 20 30 78 66 66 3b 0a 20 20 61  >>8) & 0xff;.  a
3d70: 63 5b 33 5d 20 3d 20 76 61 6c 20 26 20 30 78 66  c[3] = val & 0xf
3d80: 66 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  f;.  return sqli
3d90: 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61  te3OsWrite(fd, a
3da0: 63 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c, 4);.}../*.** 
3db0: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
3dc0: 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 70 61  nteger into a pa
3dd0: 67 65 20 68 65 61 64 65 72 20 72 69 67 68 74 20  ge header right 
3de0: 62 65 66 6f 72 65 20 74 68 65 0a 2a 2a 20 70 61  before the.** pa
3df0: 67 65 20 64 61 74 61 2e 20 20 54 68 69 73 20 77  ge data.  This w
3e00: 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68  ill overwrite th
3e10: 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70  e PgHdr.pDirty p
3e20: 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ointer..**.** Th
3e30: 65 20 69 6e 74 65 67 65 72 20 69 73 20 62 69 67  e integer is big
3e40: 2d 65 6e 64 69 61 6e 20 66 6f 72 20 66 6f 72 6d  -endian for form
3e50: 61 74 73 20 32 20 61 6e 64 20 33 20 61 6e 64 20  ats 2 and 3 and 
3e60: 6e 61 74 69 76 65 20 62 79 74 65 20 6f 72 64 65  native byte orde
3e70: 72 0a 2a 2a 20 66 6f 72 20 6a 6f 75 72 6e 61 6c  r.** for journal
3e80: 20 66 6f 72 6d 61 74 20 31 2e 0a 2a 2f 0a 73 74   format 1..*/.st
3e90: 61 74 69 63 20 76 6f 69 64 20 73 74 6f 72 65 33  atic void store3
3ea0: 32 62 69 74 73 28 75 33 32 20 76 61 6c 2c 20 50  2bits(u32 val, P
3eb0: 67 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66  gHdr *p, int off
3ec0: 73 65 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  set){.  unsigned
3ed0: 20 63 68 61 72 20 2a 61 63 3b 0a 20 20 61 63 20   char *ac;.  ac 
3ee0: 3d 20 26 28 28 75 6e 73 69 67 6e 65 64 20 63 68  = &((unsigned ch
3ef0: 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54  ar*)PGHDR_TO_DAT
3f00: 41 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20  A(p))[offset];. 
3f10: 20 69 66 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72   if( journal_for
3f20: 6d 61 74 3c 3d 31 20 29 7b 0a 20 20 20 20 6d 65  mat<=1 ){.    me
3f30: 6d 63 70 79 28 61 63 2c 20 26 76 61 6c 2c 20 34  mcpy(ac, &val, 4
3f40: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
3f50: 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34  ac[0] = (val>>24
3f60: 29 20 26 20 30 78 66 66 3b 0a 20 20 20 20 61 63  ) & 0xff;.    ac
3f70: 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20  [1] = (val>>16) 
3f80: 26 20 30 78 66 66 3b 0a 20 20 20 20 61 63 5b 32  & 0xff;.    ac[2
3f90: 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20 30  ] = (val>>8) & 0
3fa0: 78 66 66 3b 0a 20 20 20 20 61 63 5b 33 5d 20 3d  xff;.    ac[3] =
3fb0: 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 20 20 7d   val & 0xff;.  }
3fc0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .}.../*.** Conve
3fd0: 72 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74  rt the bits in t
3fe0: 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  he pPager->errMa
3ff0: 73 6b 20 69 6e 74 6f 20 61 6e 20 61 70 70 72 6f  sk into an appro
4000: 70 72 61 74 65 0a 2a 2a 20 72 65 74 75 72 6e 20  prate.** return 
4010: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
4020: 69 6e 74 20 70 61 67 65 72 5f 65 72 72 63 6f 64  int pager_errcod
4030: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
4040: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
4050: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
4060: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
4070: 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 29  PAGER_ERR_LOCK )
4080: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4090: 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 69 66 28 20  PROTOCOL;.  if( 
40a0: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
40b0: 26 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b  & PAGER_ERR_DISK
40c0: 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54   )    rc = SQLIT
40d0: 45 5f 49 4f 45 52 52 3b 0a 20 20 69 66 28 20 70  E_IOERR;.  if( p
40e0: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26  Pager->errMask &
40f0: 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20   PAGER_ERR_FULL 
4100: 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  )    rc = SQLITE
4110: 5f 46 55 4c 4c 3b 0a 20 20 69 66 28 20 70 50 61  _FULL;.  if( pPa
4120: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50  ger->errMask & P
4130: 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20 29 20 20  AGER_ERR_MEM )  
4140: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
4150: 4f 4d 45 4d 3b 0a 20 20 69 66 28 20 70 50 61 67  OMEM;.  if( pPag
4160: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41  er->errMask & PA
4170: 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 20  GER_ERR_CORRUPT 
4180: 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  ) rc = SQLITE_CO
4190: 52 52 55 50 54 3b 0a 20 20 72 65 74 75 72 6e 20  RRUPT;.  return 
41a0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  rc;.}../*.** Add
41b0: 20 6f 72 20 72 65 6d 6f 76 65 20 61 20 70 61 67   or remove a pag
41c0: 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20  e from the list 
41d0: 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 74 68 61  of all pages tha
41e0: 74 20 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a 20  t are in the.** 
41f0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
4200: 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67  l..**.** The Pag
4210: 65 72 20 6b 65 65 70 73 20 61 20 73 65 70 61 72  er keeps a separ
4220: 61 74 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65  ate list of page
4230: 73 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65  s that are curre
4240: 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65 20 73  ntly in.** the s
4250: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
4260: 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 74 68  .  This helps th
4270: 65 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  e sqlite3pager_s
4280: 74 6d 74 5f 63 6f 6d 6d 69 74 28 29 0a 2a 2a 20  tmt_commit().** 
4290: 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55 43 48  routine run MUCH
42a0: 20 66 61 73 74 65 72 20 66 6f 72 20 74 68 65 20   faster for the 
42b0: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
42c0: 65 20 74 68 65 72 65 20 61 72 65 20 6d 61 6e 79  e there are many
42d0: 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d 65 6d  .** pages in mem
42e0: 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20 61 20 66  ory but only a f
42f0: 65 77 20 61 72 65 20 69 6e 20 74 68 65 20 73 74  ew are in the st
4300: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
4310: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4320: 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
4330: 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50 67  _list(PgHdr *pPg
4340: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
4350: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
4360: 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 53  ;.  if( pPg->inS
4370: 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  tmt ) return;.  
4380: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 72  assert( pPg->pPr
4390: 65 76 53 74 6d 74 3d 3d 30 20 26 26 20 70 50 67  evStmt==0 && pPg
43a0: 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 30 20 29  ->pNextStmt==0 )
43b0: 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74  ;.  pPg->pPrevSt
43c0: 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  mt = 0;.  if( pP
43d0: 61 67 65 72 2d 3e 70 53 74 6d 74 20 29 7b 0a 20  ager->pStmt ){. 
43e0: 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74     pPager->pStmt
43f0: 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50  ->pPrevStmt = pP
4400: 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e  g;.  }.  pPg->pN
4410: 65 78 74 53 74 6d 74 20 3d 20 70 50 61 67 65 72  extStmt = pPager
4420: 2d 3e 70 53 74 6d 74 3b 0a 20 20 70 50 61 67 65  ->pStmt;.  pPage
4430: 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67 3b 0a  r->pStmt = pPg;.
4440: 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20    pPg->inStmt = 
4450: 31 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  1;.}.static void
4460: 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f   page_remove_fro
4470: 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64  m_stmt_list(PgHd
4480: 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 21  r *pPg){.  if( !
4490: 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72 65  pPg->inStmt ) re
44a0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d  turn;.  if( pPg-
44b0: 3e 70 50 72 65 76 53 74 6d 74 20 29 7b 0a 20 20  >pPrevStmt ){.  
44c0: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
44d0: 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74 53  PrevStmt->pNextS
44e0: 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  tmt==pPg );.    
44f0: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 2d 3e  pPg->pPrevStmt->
4500: 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 67 2d  pNextStmt = pPg-
4510: 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d 65  >pNextStmt;.  }e
4520: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
4530: 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 53   pPg->pPager->pS
4540: 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  tmt==pPg );.    
4550: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 53 74  pPg->pPager->pSt
4560: 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53  mt = pPg->pNextS
4570: 74 6d 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  tmt;.  }.  if( p
4580: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 29 7b  Pg->pNextStmt ){
4590: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
45a0: 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50 72  ->pNextStmt->pPr
45b0: 65 76 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20  evStmt==pPg );. 
45c0: 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d     pPg->pNextStm
45d0: 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  t->pPrevStmt = p
45e0: 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 3b 0a 20  Pg->pPrevStmt;. 
45f0: 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 53   }.  pPg->pNextS
4600: 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e  tmt = 0;.  pPg->
4610: 70 50 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a 20  pPrevStmt = 0;. 
4620: 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pPg->inStmt = 0
4630: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
4640: 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 68 61  a page in the ha
4650: 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69  sh table given i
4660: 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  ts page number. 
4670: 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   Return.** a poi
4680: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
4690: 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20   or NULL if not 
46a0: 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
46b0: 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f   PgHdr *pager_lo
46c0: 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67  okup(Pager *pPag
46d0: 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
46e0: 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 61    PgHdr *p = pPa
46f0: 67 65 72 2d 3e 61 48 61 73 68 5b 70 61 67 65 72  ger->aHash[pager
4700: 5f 68 61 73 68 28 70 67 6e 6f 29 5d 3b 0a 20 20  _hash(pgno)];.  
4710: 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 70  while( p && p->p
4720: 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20 20  gno!=pgno ){.   
4730: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61 73   p = p->pNextHas
4740: 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  h;.  }.  return 
4750: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f  p;.}../*.** Unlo
4760: 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ck the database 
4770: 61 6e 64 20 63 6c 65 61 72 20 74 68 65 20 69 6e  and clear the in
4780: 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
4790: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
47a0: 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f  sets the state o
47b0: 66 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b  f the pager back
47c0: 20 74 6f 20 77 68 61 74 20 69 74 20 77 61 73 20   to what it was 
47d0: 77 68 65 6e 20 69 74 20 77 61 73 20 66 69 72 73  when it was firs
47e0: 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e  t.** opened.  An
47f0: 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  y outstanding pa
4800: 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
4810: 74 65 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  ted and subseque
4820: 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74  nt attempts.** t
4830: 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65 20 70  o access those p
4840: 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ages will likely
4850: 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72   result in a cor
4860: 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  edump..*/.static
4870: 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65   void pager_rese
4880: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
4890: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20  {.  PgHdr *pPg, 
48a0: 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 50  *pNext;.  for(pP
48b0: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
48c0: 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b  pPg; pPg=pNext){
48d0: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67  .    pNext = pPg
48e0: 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
48f0: 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b  sqliteFree(pPg);
4900: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70  .  }.  pPager->p
4910: 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 70 50 61  First = 0;.  pPa
4920: 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
4930: 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  d = 0;.  pPager-
4940: 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 50  >pLast = 0;.  pP
4950: 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a  ager->pAll = 0;.
4960: 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d    memset(pPager-
4970: 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f  >aHash, 0, sizeo
4980: 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  f(pPager->aHash)
4990: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61  );.  pPager->nPa
49a0: 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  ge = 0;.  if( pP
49b0: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 51 4c  ager->state>=SQL
49c0: 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 29 7b  ITE_WRITELOCK ){
49d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65  .    sqlite3page
49e0: 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
49f0: 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  r);.  }.  sqlite
4a00: 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  3OsUnlock(&pPage
4a10: 72 2d 3e 66 64 29 3b 0a 20 20 70 50 61 67 65 72  r->fd);.  pPager
4a20: 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45  ->state = SQLITE
4a30: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65  _UNLOCK;.  pPage
4a40: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
4a50: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d    pPager->nRef =
4a60: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   0;.  assert( pP
4a70: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
4a80: 6e 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n==0 );.}../*.**
4a90: 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
4aa0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
4ab0: 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20  e pager has the 
4ac0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
4ad0: 6e 20 61 6e 64 0a 2a 2a 20 61 20 77 72 69 74 65  n and.** a write
4ae0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
4af0: 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75  abase.  This rou
4b00: 74 69 6e 65 20 72 65 6c 65 61 73 65 73 20 74 68  tine releases th
4b10: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 77 72  e database.** wr
4b20: 69 74 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71  ite lock and acq
4b30: 75 69 72 65 73 20 61 20 72 65 61 64 20 6c 6f 63  uires a read loc
4b40: 6b 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20  k in its place. 
4b50: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
4b60: 65 0a 2a 2a 20 69 73 20 64 65 6c 65 74 65 64 20  e.** is deleted 
4b70: 61 6e 64 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a  and closed..**.*
4b80: 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72  * TODO: Consider
4b90: 20 6b 65 65 70 69 6e 67 20 74 68 65 20 6a 6f 75   keeping the jou
4ba0: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66  rnal file open f
4bb0: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  or temporary dat
4bc0: 61 62 61 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20  abases..** This 
4bd0: 6d 69 67 68 74 20 67 69 76 65 20 61 20 70 65 72  might give a per
4be0: 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65  formance improve
4bf0: 6d 65 6e 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20  ment on windows 
4c00: 77 68 65 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a  where opening.**
4c10: 20 61 20 66 69 6c 65 20 69 73 20 61 6e 20 65 78   a file is an ex
4c20: 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f  pensive operatio
4c30: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
4c40: 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
4c50: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
4c60: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
4c70: 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 66 28  gHdr *pPg;.  if(
4c80: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 53   pPager->state<S
4c90: 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20  QLITE_WRITELOCK 
4ca0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
4cb0: 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67  OK;.  sqlite3pag
4cc0: 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70  er_stmt_commit(p
4cd0: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
4ce0: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29  ager->stmtOpen )
4cf0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
4d00: 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74  lose(&pPager->st
4d10: 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  fd);.    pPager-
4d20: 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20  >stmtOpen = 0;. 
4d30: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
4d40: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
4d50: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
4d60: 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  se(&pPager->jfd)
4d70: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
4d80: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20  urnalOpen = 0;. 
4d90: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
4da0: 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  te(pPager->zJour
4db0: 6e 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nal);.    sqlite
4dc0: 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49  Free( pPager->aI
4dd0: 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  nJournal );.    
4de0: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
4df0: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  al = 0;.    for(
4e00: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
4e10: 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
4e20: 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
4e30: 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
4e40: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
4e50: 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  dirty = 0;.     
4e60: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
4e70: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   0;.    }.  }els
4e80: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
4e90: 50 61 67 65 72 2d 3e 64 69 72 74 79 46 69 6c 65  Pager->dirtyFile
4ea0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 75  ==0 || pPager->u
4eb0: 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  seJournal==0 );.
4ec0: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
4ed0: 65 33 4f 73 52 65 61 64 4c 6f 63 6b 28 26 70 50  e3OsReadLock(&pP
4ee0: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 69 66 28  ager->fd);.  if(
4ef0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
4f00: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  {.    pPager->st
4f10: 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 52 45 41  ate = SQLITE_REA
4f20: 44 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DLOCK;.  }else{.
4f30: 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6e 20      /* This can 
4f40: 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 61  only happen if a
4f50: 20 70 72 6f 63 65 73 73 20 64 6f 65 73 20 61 20   process does a 
4f60: 42 45 47 49 4e 2c 20 74 68 65 6e 20 66 6f 72 6b  BEGIN, then fork
4f70: 73 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a  s and the.    **
4f80: 20 63 68 69 6c 64 20 70 72 6f 63 65 73 73 20 64   child process d
4f90: 6f 65 73 20 74 68 65 20 43 4f 4d 4d 49 54 2e 20  oes the COMMIT. 
4fa0: 20 42 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   Because of the 
4fb0: 73 65 6d 61 6e 74 69 63 73 20 6f 66 20 75 6e 69  semantics of uni
4fc0: 78 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6c 6f  x.    ** file lo
4fd0: 63 6b 69 6e 67 2c 20 74 68 65 20 75 6e 6c 6f 63  cking, the unloc
4fe0: 6b 20 77 69 6c 6c 20 66 61 69 6c 2e 0a 20 20 20  k will fail..   
4ff0: 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
5000: 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 55  state = SQLITE_U
5010: 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 72 65 74  NLOCK;.  }.  ret
5020: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5030: 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74   Compute and ret
5040: 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 66  urn a checksum f
5050: 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66 20 64  or the page of d
5060: 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ata..**.** This 
5070: 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68  is not a real ch
5080: 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20 72  ecksum.  It is r
5090: 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73  eally just the s
50a0: 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61  um of the .** ra
50b0: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c  ndom initial val
50c0: 75 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  ue and the page 
50d0: 6e 75 6d 62 65 72 2e 20 20 57 65 20 63 6f 6e 73  number.  We cons
50e0: 69 64 65 72 65 64 20 64 6f 20 61 20 63 68 65 63  idered do a chec
50f0: 6b 73 75 6d 0a 2a 2a 20 6f 66 20 74 68 65 20 64  ksum.** of the d
5100: 61 74 61 62 61 73 65 2c 20 62 75 74 20 74 68 61  atabase, but tha
5110: 74 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20 62  t was found to b
5120: 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2f 0a 73  e too slow..*/.s
5130: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
5140: 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61  cksum(Pager *pPa
5150: 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  ger, Pgno pgno, 
5160: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 44 61 74  const char *aDat
5170: 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20  a){.  u32 cksum 
5180: 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
5190: 6e 69 74 20 2b 20 70 67 6e 6f 3b 0a 20 20 72 65  nit + pgno;.  re
51a0: 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f  turn cksum;.}../
51b0: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67  *.** Read a sing
51c0: 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  le page from the
51d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70   journal file op
51e0: 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64 65 73  ened on file des
51f0: 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20  criptor.** jfd. 
5200: 20 50 6c 61 79 62 61 63 6b 20 74 68 69 73 20 6f   Playback this o
5210: 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ne page..**.** T
5220: 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 64  here are three d
5230: 69 66 66 65 72 65 6e 74 20 6a 6f 75 72 6e 61 6c  ifferent journal
5240: 20 66 6f 72 6d 61 74 73 2e 20 20 54 68 65 20 66   formats.  The f
5250: 6f 72 6d 61 74 20 70 61 72 61 6d 65 74 65 72 20  ormat parameter 
5260: 64 65 74 65 72 6d 69 6e 65 73 0a 2a 2a 20 77 68  determines.** wh
5270: 69 63 68 20 66 6f 72 6d 61 74 20 69 73 20 75 73  ich format is us
5280: 65 64 20 62 79 20 74 68 65 20 6a 6f 75 72 6e 61  ed by the journa
5290: 6c 20 74 68 61 74 20 69 73 20 70 6c 61 79 65 64  l that is played
52a0: 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   back..*/.static
52b0: 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
52c0: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 50 61 67  ack_one_page(Pag
52d0: 65 72 20 2a 70 50 61 67 65 72 2c 20 4f 73 46 69  er *pPager, OsFi
52e0: 6c 65 20 2a 6a 66 64 2c 20 69 6e 74 20 66 6f 72  le *jfd, int for
52f0: 6d 61 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  mat){.  int rc;.
5300: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20    PgHdr *pPg;   
5310: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
5320: 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69   existing page i
5330: 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  n the cache */. 
5340: 20 50 61 67 65 52 65 63 6f 72 64 20 70 67 52 65   PageRecord pgRe
5350: 63 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a  c;.  u32 cksum;.
5360: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
5370: 74 73 28 66 6f 72 6d 61 74 2c 20 6a 66 64 2c 20  ts(format, jfd, 
5380: 26 70 67 52 65 63 2e 70 67 6e 6f 29 3b 0a 20 20  &pgRec.pgno);.  
5390: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
53a0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
53b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
53c0: 65 61 64 28 6a 66 64 2c 20 26 70 67 52 65 63 2e  ead(jfd, &pgRec.
53d0: 61 44 61 74 61 2c 20 73 69 7a 65 6f 66 28 70 67  aData, sizeof(pg
53e0: 52 65 63 2e 61 44 61 74 61 29 29 3b 0a 20 20 69  Rec.aData));.  i
53f0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
5400: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
5410: 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
5420: 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  ing on the page.
5430: 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69    This is more i
5440: 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20  mportant that I 
5450: 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20  originally.  ** 
5460: 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70  thought.  If a p
5470: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
5480: 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  urs while the jo
5490: 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77  urnal is being w
54a0: 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20  ritten,.  ** it 
54b0: 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61  could cause inva
54c0: 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77  lid data to be w
54d0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
54e0: 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65  journal.  We nee
54f0: 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74  d to.  ** detect
5500: 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61   this invalid da
5510: 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72  ta (with high pr
5520: 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69  obability) and i
5530: 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20  gnore it..  */. 
5540: 20 69 66 28 20 70 67 52 65 63 2e 70 67 6e 6f 3d   if( pgRec.pgno=
5550: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
5560: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
5570: 7d 0a 20 20 69 66 28 20 70 67 52 65 63 2e 70 67  }.  if( pgRec.pg
5580: 6e 6f 3e 28 75 6e 73 69 67 6e 65 64 29 70 50 61  no>(unsigned)pPa
5590: 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
55a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
55b0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  _OK;.  }.  if( f
55c0: 6f 72 6d 61 74 3e 3d 4a 4f 55 52 4e 41 4c 5f 46  ormat>=JOURNAL_F
55d0: 4f 52 4d 41 54 5f 33 20 29 7b 0a 20 20 20 20 72  ORMAT_3 ){.    r
55e0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 66  c = read32bits(f
55f0: 6f 72 6d 61 74 2c 20 6a 66 64 2c 20 26 63 6b 73  ormat, jfd, &cks
5600: 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  um);.    if( rc 
5610: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
5620: 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d   if( pager_cksum
5630: 28 70 50 61 67 65 72 2c 20 70 67 52 65 63 2e 70  (pPager, pgRec.p
5640: 67 6e 6f 2c 20 70 67 52 65 63 2e 61 44 61 74 61  gno, pgRec.aData
5650: 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  )!=cksum ){.    
5660: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5670: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
5680: 0a 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 74  .  /* Playback t
5690: 68 65 20 70 61 67 65 2e 20 20 55 70 64 61 74 65  he page.  Update
56a0: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
56b0: 6f 70 79 20 6f 66 20 74 68 65 20 70 61 67 65 0a  opy of the page.
56c0: 20 20 2a 2a 20 61 74 20 74 68 65 20 73 61 6d 65    ** at the same
56d0: 20 74 69 6d 65 2c 20 69 66 20 74 68 65 72 65 20   time, if there 
56e0: 69 73 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 70  is one..  */.  p
56f0: 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
5700: 70 28 70 50 61 67 65 72 2c 20 70 67 52 65 63 2e  p(pPager, pgRec.
5710: 70 67 6e 6f 29 3b 0a 20 20 54 52 41 43 45 32 28  pgno);.  TRACE2(
5720: 22 50 4c 41 59 42 41 43 4b 20 25 64 5c 6e 22 2c  "PLAYBACK %d\n",
5730: 20 70 67 52 65 63 2e 70 67 6e 6f 29 3b 0a 20 20   pgRec.pgno);.  
5740: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
5750: 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 52 65  Pager->fd, (pgRe
5760: 63 2e 70 67 6e 6f 2d 31 29 2a 28 6f 66 66 5f 74  c.pgno-1)*(off_t
5770: 29 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a  )SQLITE_PAGE_SIZ
5780: 45 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  E);.  rc = sqlit
5790: 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67 65  e3OsWrite(&pPage
57a0: 72 2d 3e 66 64 2c 20 70 67 52 65 63 2e 61 44 61  r->fd, pgRec.aDa
57b0: 74 61 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  ta, SQLITE_PAGE_
57c0: 53 49 5a 45 29 3b 0a 20 20 69 66 28 20 70 50 67  SIZE);.  if( pPg
57d0: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
57e0: 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
57f0: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  e rolled back th
5800: 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78  at is in use, ex
5810: 63 65 70 74 20 66 6f 72 20 70 61 67 65 0a 20 20  cept for page.  
5820: 20 20 2a 2a 20 31 20 77 68 69 63 68 20 69 73 20    ** 1 which is 
5830: 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f  held in use in o
5840: 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65  rder to keep the
5850: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
5860: 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 61 63 74  abase.    ** act
5870: 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ive..    */.    
5880: 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20  void *pData;.   
5890: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
58a0: 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67  ef==0 || pPg->pg
58b0: 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 70 44 61  no==1 );.    pDa
58c0: 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41  ta = PGHDR_TO_DA
58d0: 54 41 28 70 50 67 29 3b 0a 20 20 20 20 6d 65 6d  TA(pPg);.    mem
58e0: 63 70 79 28 70 44 61 74 61 2c 20 70 67 52 65 63  cpy(pData, pgRec
58f0: 2e 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  .aData, pPager->
5900: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69  pageSize);.    i
5910: 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74  f( pPager->xDest
5920: 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 20 20  ructor ){.      
5930: 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
5940: 74 6f 72 28 70 44 61 74 61 2c 20 70 50 61 67 65  tor(pData, pPage
5950: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
5960: 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 64 69 72    }.    pPg->dir
5970: 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d  ty = 0;.    pPg-
5980: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
5990: 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
59a0: 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
59b0: 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74  o, 3);.  }.  ret
59c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
59d0: 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74   Parameter zMast
59e0: 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  er is the name o
59f0: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
5a00: 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c  al file. A singl
5a10: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
5a20: 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20  e that referred 
5a30: 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  to the master jo
5a40: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a  urnal file has j
5a50: 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ust been rolled 
5a60: 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  back..** This ro
5a70: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
5a80: 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
5a90: 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
5aa0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
5ab0: 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f  ,.** and does so
5ac0: 20 69 66 20 69 74 20 69 73 2e 0a 2a 2f 0a 73 74   if it is..*/.st
5ad0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64  atic int pager_d
5ae0: 65 6c 6d 61 73 74 65 72 28 63 6f 6e 73 74 20 63  elmaster(const c
5af0: 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
5b00: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d   int rc;.  int m
5b10: 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a  aster_open = 0;.
5b20: 20 20 4f 73 46 69 6c 65 20 6d 61 73 74 65 72 3b    OsFile master;
5b30: 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
5b40: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20  Journal = 0; /* 
5b50: 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74  Contents of mast
5b60: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
5b70: 2a 2f 0a 20 20 6f 66 66 5f 74 20 6e 4d 61 73 74  */.  off_t nMast
5b80: 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 2f  erJournal;     /
5b90: 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72  * Size of master
5ba0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
5bb0: 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
5bc0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
5bd0: 69 6c 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20  ile exclusively 
5be0: 69 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f 74 68  in case some oth
5bf0: 65 72 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20  er process.  ** 
5c00: 69 73 20 72 75 6e 6e 69 6e 67 20 74 68 69 73 20  is running this 
5c10: 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f  routine also. No
5c20: 74 20 74 68 61 74 20 69 74 20 6d 61 6b 65 73 20  t that it makes 
5c30: 74 6f 6f 20 6d 75 63 68 20 64 69 66 66 65 72 65  too much differe
5c40: 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  nce..  */.  rc =
5c50: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78   sqlite3OsOpenEx
5c60: 63 6c 75 73 69 76 65 28 7a 4d 61 73 74 65 72 2c  clusive(zMaster,
5c70: 20 26 6d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   &master, 0);.  
5c80: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
5c90: 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
5ca0: 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72  er_out;.  master
5cb0: 5f 6f 70 65 6e 20 3d 20 31 3b 0a 0a 20 20 72 63  _open = 1;..  rc
5cc0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
5cd0: 53 69 7a 65 28 26 6d 61 73 74 65 72 2c 20 26 6e  Size(&master, &n
5ce0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
5cf0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5d00: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
5d10: 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28  ster_out;..  if(
5d20: 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e   nMasterJournal>
5d30: 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
5d40: 44 62 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a  Db;.    zMasterJ
5d50: 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a  ournal = (char *
5d60: 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d  )sqliteMalloc(nM
5d70: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
5d80: 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a     if( !zMasterJ
5d90: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
5da0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
5db0: 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  M;.      goto de
5dc0: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
5dd0: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
5de0: 74 65 33 4f 73 52 65 61 64 28 26 6d 61 73 74 65  te3OsRead(&maste
5df0: 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r, zMasterJourna
5e00: 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l, nMasterJourna
5e10: 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  l);.    if( rc!=
5e20: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
5e30: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
5e40: 0a 20 20 20 20 7a 44 62 20 3d 20 7a 4d 61 73 74  .    zDb = zMast
5e50: 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77  erJournal;.    w
5e60: 68 69 6c 65 28 20 28 7a 44 62 2d 7a 4d 61 73 74  hile( (zDb-zMast
5e70: 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74  erJournal)<nMast
5e80: 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
5e90: 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61     char *zJourna
5ea0: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  l = 0;.      sql
5eb0: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a  ite3SetString(&z
5ec0: 4a 6f 75 72 6e 61 6c 2c 20 7a 44 62 2c 20 22 2d  Journal, zDb, "-
5ed0: 6a 6f 75 72 6e 61 6c 22 2c 20 30 29 3b 0a 20 20  journal", 0);.  
5ee0: 20 20 20 20 69 66 28 20 21 7a 4a 6f 75 72 6e 61      if( !zJourna
5ef0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  l ){.        rc 
5f00: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
5f10: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
5f20: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
5f30: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71    }.      if( sq
5f40: 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74  lite3OsFileExist
5f50: 73 28 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20  s(zJournal) ){. 
5f60: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
5f70: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f   the journals po
5f80: 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
5f90: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65  master journal e
5fa0: 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  xists..        *
5fb0: 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68  * Open it and ch
5fc0: 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73  eck if it points
5fd0: 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a   at the master j
5fe0: 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20  ournal. If.     
5ff0: 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
6000: 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
6010: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
6020: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
6030: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f 73     */.        Os
6040: 46 69 6c 65 20 6a 6f 75 72 6e 61 6c 3b 0a 20 20  File journal;.  
6050: 20 20 20 20 20 20 69 6e 74 20 6e 4d 61 73 74 65        int nMaste
6060: 72 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d  r;..        rc =
6070: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
6080: 61 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61 6c 2c  adOnly(zJournal,
6090: 20 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20   &journal);.    
60a0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
60b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
60c0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
60d0: 65 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  e(&journal);.   
60e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
60f0: 65 28 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  e(zJournal);.   
6100: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
6110: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
6120: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
6130: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6a 6f 75  ite3OsClose(&jou
6140: 72 6e 61 6c 29 3b 0a 0a 20 20 20 20 20 20 20 20  rnal);..        
6150: 2f 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 70  /* Seek to the p
6160: 6f 69 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  oint in the jour
6170: 6e 61 6c 20 77 68 65 72 65 20 74 68 65 20 6d 61  nal where the ma
6180: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
6190: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  e.        ** is 
61a0: 73 74 6f 72 65 64 2e 20 52 65 61 64 20 74 68 65  stored. Read the
61b0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
61c0: 6e 61 6d 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  name into memory
61d0: 20 6f 62 74 61 69 6e 65 64 0a 20 20 20 20 20 20   obtained.      
61e0: 20 20 2a 2a 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63    ** from malloc
61f0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
6200: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6210: 33 4f 73 53 65 65 6b 28 26 6a 6f 75 72 6e 61 6c  3OsSeek(&journal
6220: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
6230: 6c 4d 61 67 69 63 33 29 2b 32 2a 73 69 7a 65 6f  lMagic3)+2*sizeo
6240: 66 28 75 33 32 29 29 3b 0a 20 20 20 20 20 20 20  f(u32));.       
6250: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6260: 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
6270: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
6280: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
6290: 28 33 2c 20 26 6a 6f 75 72 6e 61 6c 2c 20 28 75  (3, &journal, (u
62a0: 33 32 20 2a 29 26 6e 4d 61 73 74 65 72 29 3b 0a  32 *)&nMaster);.
62b0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
62c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
62d0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
62e0: 20 20 20 20 20 20 20 20 69 66 28 20 6e 4d 61 73          if( nMas
62f0: 74 65 72 3e 30 20 26 26 20 6e 4d 61 73 74 65 72  ter>0 && nMaster
6300: 3d 3d 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72  ==strlen(zMaster
6310: 29 2b 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  )+1 ){.         
6320: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74   char *zMasterPt
6330: 72 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  r = (char *)sqli
6340: 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72  teMalloc(nMaster
6350: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
6360: 20 21 7a 4d 61 73 74 65 72 50 74 72 20 29 7b 0a   !zMasterPtr ){.
6370: 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
6380: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
6390: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
63a0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
63b0: 33 4f 73 52 65 61 64 28 26 6a 6f 75 72 6e 61 6c  3OsRead(&journal
63c0: 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d  , zMasterPtr, nM
63d0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
63e0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
63f0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
6400: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d     sqliteFree(zM
6410: 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20  asterPtr);.     
6420: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
6430: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
6440: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6450: 20 69 66 28 20 30 3d 3d 73 74 72 6e 63 6d 70 28   if( 0==strncmp(
6460: 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73  zMasterPtr, zMas
6470: 74 65 72 2c 20 6e 4d 61 73 74 65 72 29 20 29 7b  ter, nMaster) ){
6480: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
6490: 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e  We have a match.
64a0: 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   Do not delete t
64b0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
64c0: 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  l file. */.     
64d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
64e0: 65 28 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20  e(zMasterPtr);. 
64f0: 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
6500: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
6510: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6520: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
6530: 20 20 20 7a 44 62 20 2b 3d 20 28 73 74 72 6c 65     zDb += (strle
6540: 6e 28 7a 44 62 29 2b 31 29 3b 0a 20 20 20 20 7d  n(zDb)+1);.    }
6550: 0a 20 20 7d 0a 20 20 0a 20 20 73 71 6c 69 74 65  .  }.  .  sqlite
6560: 33 4f 73 44 65 6c 65 74 65 28 7a 4d 61 73 74 65  3OsDelete(zMaste
6570: 72 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f  r);..delmaster_o
6580: 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74 65  ut:.  if( zMaste
6590: 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
65a0: 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74  sqliteFree(zMast
65b0: 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20  erJournal);.  } 
65c0: 20 0a 20 20 69 66 28 20 6d 61 73 74 65 72 5f 6f   .  if( master_o
65d0: 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
65e0: 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74 65  e3OsClose(&maste
65f0: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
6600: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c   rc;.}../*.** Pl
6610: 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e  ayback the journ
6620: 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74  al and thus rest
6630: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
6640: 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20   file to.** the 
6650: 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20  state it was in 
6660: 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65  before we starte
6670: 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73  d making changes
6680: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .  .**.** The jo
6690: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
66a0: 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  t is as follows:
66b0: 20 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 38 20   .**.**    *  8 
66c0: 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 4f 6e  byte prefix.  On
66d0: 65 20 6f 66 20 74 68 65 20 61 4a 6f 75 72 6e 61  e of the aJourna
66e0: 6c 4d 61 67 69 63 31 32 33 20 76 65 63 74 6f 72  lMagic123 vector
66f0: 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20 20 20 20  s defined.**    
6700: 20 20 20 61 62 6f 76 65 2e 20 20 54 68 65 20 66     above.  The f
6710: 6f 72 6d 61 74 20 6f 66 20 74 68 65 20 6a 6f 75  ormat of the jou
6720: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 74  rnal file is det
6730: 65 72 6d 69 6e 65 64 20 62 79 20 77 68 69 63 68  ermined by which
6740: 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 74 68 65  .**       of the
6750: 20 74 68 72 65 65 20 70 72 65 66 69 78 20 76 65   three prefix ve
6760: 63 74 6f 72 73 20 69 73 20 73 65 65 6e 2e 0a 2a  ctors is seen..*
6770: 2a 20 20 20 20 2a 20 20 34 20 62 79 74 65 20 62  *    *  4 byte b
6780: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
6790: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
67a0: 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70  umber of valid p
67b0: 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20  age records.**  
67c0: 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72       in the jour
67d0: 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61  nal.  If this va
67e0: 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
67f0: 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20  f, then compute 
6800: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d  the.**       num
6810: 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
6820: 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  rds from the jou
6830: 72 6e 61 6c 20 73 69 7a 65 2e 20 20 54 68 69 73  rnal size.  This
6840: 20 66 69 65 6c 64 20 61 70 70 65 61 72 73 0a 2a   field appears.*
6850: 2a 20 20 20 20 20 20 20 69 6e 20 66 6f 72 6d 61  *       in forma
6860: 74 20 33 20 6f 6e 6c 79 2e 0a 2a 2a 20 20 20 20  t 3 only..**    
6870: 2a 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  *  4 byte big-en
6880: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
6890: 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  ch is the initia
68a0: 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  l value for the 
68b0: 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79  .**       sanity
68c0: 20 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 69 73   checksum.  This
68d0: 20 66 69 65 6c 64 20 61 70 70 65 61 72 73 20 69   field appears i
68e0: 6e 20 66 6f 72 6d 61 74 20 33 20 6f 6e 6c 79 2e  n format 3 only.
68f0: 0a 2a 2a 20 20 20 20 2a 20 20 34 20 62 79 74 65  .**    *  4 byte
6900: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
6910: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
6920: 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74  pages to truncat
6930: 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64  e the.**       d
6940: 61 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e  atabase to durin
6950: 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  g a rollback..**
6960: 20 20 20 20 2a 20 20 5a 65 72 6f 20 6f 72 20 6d      *  Zero or m
6970: 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e  ore pages instan
6980: 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c  ces, each as fol
6990: 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20  lows:.**        
69a0: 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e  +  4 byte page n
69b0: 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20  umber..**       
69c0: 20 2b 20 20 53 51 4c 49 54 45 5f 50 41 47 45 5f   +  SQLITE_PAGE_
69d0: 53 49 5a 45 20 62 79 74 65 73 20 6f 66 20 64 61  SIZE bytes of da
69e0: 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ta..**        + 
69f0: 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d   4 byte checksum
6a00: 20 28 66 6f 72 6d 61 74 20 33 20 6f 6e 6c 79 29   (format 3 only)
6a10: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73  .**.** When we s
6a20: 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72  peak of the jour
6a30: 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d  nal header, we m
6a40: 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 34 20  ean the first 4 
6a50: 62 75 6c 6c 65 74 73 20 61 62 6f 76 65 2e 0a 2a  bullets above..*
6a60: 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20  * Each entry in 
6a70: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61  the journal is a
6a80: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
6a90: 65 20 35 74 68 20 62 75 6c 6c 65 74 2e 20 20 4e  e 5th bullet.  N
6aa0: 6f 74 65 20 74 68 61 74 0a 2a 2a 20 62 75 6c 6c  ote that.** bull
6ab0: 65 74 73 20 32 20 61 6e 64 20 33 20 6f 6e 6c 79  ets 2 and 3 only
6ac0: 20 61 70 70 65 61 72 20 69 6e 20 66 6f 72 6d 61   appear in forma
6ad0: 74 2d 33 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a  t-3 journals..**
6ae0: 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c  .** Call the val
6af0: 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  ue from the seco
6b00: 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22  nd bullet "nRec"
6b10: 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e  .  nRec is the n
6b20: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69  umber of.** vali
6b30: 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69  d page entries i
6b40: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
6b50: 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79  In most cases, y
6b60: 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ou can compute t
6b70: 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e  he.** value of n
6b80: 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  Rec from the siz
6b90: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
6ba0: 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61   file.  But if a
6bb0: 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
6bc0: 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  e occurred while
6bd0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
6be0: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
6bf0: 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a  it could be the.
6c00: 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65  ** case that the
6c10: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
6c20: 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c  rnal file had al
6c30: 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
6c40: 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20  ased but.** the 
6c50: 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61  extra entries ha
6c60: 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69  d not yet made i
6c70: 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b  t safely to disk
6c80: 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73  .  In such a cas
6c90: 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  e,.** the value 
6ca0: 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  of nRec computed
6cb0: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
6cc0: 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f  ize would be too
6cd0: 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20   large.  For.** 
6ce0: 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20  that reason, we 
6cf0: 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e  always use the n
6d00: 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65  Rec value in the
6d10: 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   header..**.** I
6d20: 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  f the nRec value
6d30: 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69   is 0xffffffff i
6d40: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65  t means that nRe
6d50: 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  c should be comp
6d60: 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  uted.** from the
6d70: 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69   file size.  Thi
6d80: 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20  s value is used 
6d90: 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65  when the user se
6da0: 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d  lects the.** no-
6db0: 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20  sync option for 
6dc0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20  the journal.  A 
6dd0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
6de0: 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72  uld lead to corr
6df0: 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69  uption.** in thi
6e00: 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72  s case.  But for
6e10: 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d   things like tem
6e20: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68  porary table (wh
6e30: 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64  ich will be.** d
6e40: 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
6e50: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
6e60: 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65  d) we don't care
6e70: 2e 20 20 0a 2a 2a 0a 2a 2a 20 4a 6f 75 72 6e 61  .  .**.** Journa
6e80: 6c 20 66 6f 72 6d 61 74 73 20 31 20 61 6e 64 20  l formats 1 and 
6e90: 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 6e  2 do not have an
6ea0: 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74   nRec value in t
6eb0: 68 65 20 68 65 61 64 65 72 20 73 6f 20 77 65 0a  he header so we.
6ec0: 2a 2a 20 68 61 76 65 20 74 6f 20 63 6f 6d 70 75  ** have to compu
6ed0: 74 65 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65  te nRec from the
6ee0: 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69   file size.  Thi
6ef0: 73 20 68 61 73 20 72 69 73 6b 73 20 28 61 73 20  s has risks (as 
6f00: 64 65 73 63 72 69 62 65 64 0a 2a 2a 20 61 62 6f  described.** abo
6f10: 76 65 29 20 77 68 69 63 68 20 69 73 20 77 68 79  ve) which is why
6f20: 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20   all persistent 
6f30: 74 61 62 6c 65 73 20 68 61 76 65 20 62 65 65 6e  tables have been
6f40: 20 63 68 61 6e 67 65 64 20 74 6f 20 75 73 65 0a   changed to use.
6f50: 2a 2a 20 66 6f 72 6d 61 74 20 33 2e 0a 2a 2a 0a  ** format 3..**.
6f60: 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  ** If the file o
6f70: 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75  pened as the jou
6f80: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
6f90: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a   a well-formed.*
6fa0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
6fb0: 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
6fc0: 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 61 6c 72   will likely alr
6fd0: 65 61 64 79 20 62 65 0a 2a 2a 20 63 6f 72 72 75  eady be.** corru
6fe0: 70 74 65 64 2c 20 73 6f 20 74 68 65 20 50 41 47  pted, so the PAG
6ff0: 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 20 62  ER_ERR_CORRUPT b
7000: 69 74 20 69 73 20 73 65 74 20 69 6e 20 70 50 61  it is set in pPa
7010: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 0a 2a 2a 20  ger->errMask.** 
7020: 61 6e 64 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  and SQLITE_CORRU
7030: 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  PT is returned. 
7040: 20 49 66 20 69 74 20 61 6c 6c 20 77 6f 72 6b 73   If it all works
7050: 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
7060: 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 53  ine.** returns S
7070: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
7080: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
7090: 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
70a0: 61 67 65 72 2c 20 69 6e 74 20 75 73 65 4a 6f 75  ager, int useJou
70b0: 72 6e 61 6c 53 69 7a 65 29 7b 0a 20 20 6f 66 66  rnalSize){.  off
70c0: 5f 74 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  _t szJ;         
70d0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
70e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
70f0: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
7100: 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20  int nRec;       
7110: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7120: 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e  er of Records in
7130: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
7140: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
7150: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
7160: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
7170: 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20  Pgno mxPg = 0;  
7180: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
7190: 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
71a0: 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a   file in pages *
71b0: 2f 0a 20 20 69 6e 74 20 66 6f 72 6d 61 74 3b 20  /.  int format; 
71c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
71d0: 46 6f 72 6d 61 74 20 6f 66 20 74 68 65 20 6a 6f  Format of the jo
71e0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
71f0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
7200: 4d 61 67 69 63 5b 73 69 7a 65 6f 66 28 61 4a 6f  Magic[sizeof(aJo
7210: 75 72 6e 61 6c 4d 61 67 69 63 31 29 5d 3b 0a 20  urnalMagic1)];. 
7220: 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
7230: 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20  *zMaster = 0;   
7240: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d      /* Name of m
7250: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
7260: 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20  le if any */..  
7270: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
7280: 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
7290: 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
72a0: 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20  l.  Abort early 
72b0: 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  if.  ** the jour
72c0: 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20  nal is empty..  
72d0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
72e0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
72f0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 53   );.  sqlite3OsS
7300: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
7310: 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  , 0);.  rc = sql
7320: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26  ite3OsFileSize(&
7330: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
7340: 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  J);.  if( rc!=SQ
7350: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
7360: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
7370: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
7380: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7390: 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 74 6f 20  is too small to 
73a0: 63 6f 6e 74 61 69 6e 20 61 20 63 6f 6d 70 6c 65  contain a comple
73b0: 74 65 20 68 65 61 64 65 72 2c 0a 20 20 2a 2a 20  te header,.  ** 
73c0: 69 74 20 6d 75 73 74 20 6d 65 61 6e 20 74 68 61  it must mean tha
73d0: 74 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  t the process th
73e0: 61 74 20 63 72 65 61 74 65 64 20 74 68 65 20 6a  at created the j
73f0: 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74 0a  ournal was just.
7400: 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 74    ** beginning t
7410: 6f 20 77 72 69 74 65 20 74 68 65 20 6a 6f 75 72  o write the jour
7420: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74  nal file when it
7430: 20 64 69 65 64 2e 20 20 49 6e 20 74 68 61 74 20   died.  In that 
7440: 63 61 73 65 2c 0a 20 20 2a 2a 20 74 68 65 20 64  case,.  ** the d
7450: 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
7460: 75 6c 64 20 68 61 76 65 20 73 74 69 6c 6c 20 62  uld have still b
7470: 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75  een completely u
7480: 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 20 4e  nchanged..  ** N
7490: 6f 74 68 69 6e 67 20 6e 65 65 64 73 20 74 6f 20  othing needs to 
74a0: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  be rolled back. 
74b0: 20 57 65 20 63 61 6e 20 73 61 66 65 6c 79 20 69   We can safely i
74c0: 67 6e 6f 72 65 20 74 68 69 73 20 6a 6f 75 72 6e  gnore this journ
74d0: 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  al..  */.  if( s
74e0: 7a 4a 20 3c 20 73 69 7a 65 6f 66 28 61 4d 61 67  zJ < sizeof(aMag
74f0: 69 63 29 2b 73 69 7a 65 6f 66 28 50 67 6e 6f 29  ic)+sizeof(Pgno)
7500: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
7510: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
7520: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 62 65    /* Read the be
7530: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a  ginning of the j
7540: 6f 75 72 6e 61 6c 20 61 6e 64 20 74 72 75 6e 63  ournal and trunc
7550: 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 64 61 74  ate the.  ** dat
7560: 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20  abase file back 
7570: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
7580: 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  size..  */.  rc 
7590: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
75a0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  &pPager->jfd, aM
75b0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
75c0: 67 69 63 29 29 3b 0a 20 20 69 66 28 20 72 63 21  gic));.  if( rc!
75d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
75e0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 52    rc = SQLITE_PR
75f0: 4f 54 4f 43 4f 4c 3b 0a 20 20 20 20 67 6f 74 6f  OTOCOL;.    goto
7600: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
7610: 20 7d 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28   }.  if( memcmp(
7620: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
7630: 4d 61 67 69 63 33 2c 20 73 69 7a 65 6f 66 28 61  Magic3, sizeof(a
7640: 4d 61 67 69 63 29 29 3d 3d 30 20 29 7b 0a 20 20  Magic))==0 ){.  
7650: 20 20 66 6f 72 6d 61 74 20 3d 20 4a 4f 55 52 4e    format = JOURN
7660: 41 4c 5f 46 4f 52 4d 41 54 5f 33 3b 0a 20 20 7d  AL_FORMAT_3;.  }
7670: 65 6c 73 65 20 69 66 28 20 6d 65 6d 63 6d 70 28  else if( memcmp(
7680: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
7690: 4d 61 67 69 63 32 2c 20 73 69 7a 65 6f 66 28 61  Magic2, sizeof(a
76a0: 4d 61 67 69 63 29 29 3d 3d 30 20 29 7b 0a 20 20  Magic))==0 ){.  
76b0: 20 20 66 6f 72 6d 61 74 20 3d 20 4a 4f 55 52 4e    format = JOURN
76c0: 41 4c 5f 46 4f 52 4d 41 54 5f 32 3b 0a 20 20 7d  AL_FORMAT_2;.  }
76d0: 65 6c 73 65 20 69 66 28 20 6d 65 6d 63 6d 70 28  else if( memcmp(
76e0: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
76f0: 4d 61 67 69 63 31 2c 20 73 69 7a 65 6f 66 28 61  Magic1, sizeof(a
7700: 4d 61 67 69 63 29 29 3d 3d 30 20 29 7b 0a 20 20  Magic))==0 ){.  
7710: 20 20 66 6f 72 6d 61 74 20 3d 20 4a 4f 55 52 4e    format = JOURN
7720: 41 4c 5f 46 4f 52 4d 41 54 5f 31 3b 0a 20 20 7d  AL_FORMAT_1;.  }
7730: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
7740: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a  QLITE_PROTOCOL;.
7750: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
7760: 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  yback;.  }.  if(
7770: 20 66 6f 72 6d 61 74 3e 3d 4a 4f 55 52 4e 41 4c   format>=JOURNAL
7780: 5f 46 4f 52 4d 41 54 5f 33 20 29 7b 0a 20 20 20  _FORMAT_3 ){.   
7790: 20 69 66 28 20 73 7a 4a 20 3c 20 73 69 7a 65 6f   if( szJ < sizeo
77a0: 66 28 61 4d 61 67 69 63 29 20 2b 20 34 2a 73 69  f(aMagic) + 4*si
77b0: 7a 65 6f 66 28 75 33 32 29 20 29 7b 0a 20 20 20  zeof(u32) ){.   
77c0: 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65     /* Ignore the
77d0: 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69   journal if it i
77e0: 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 74 6f 20 63  s too small to c
77f0: 6f 6e 74 61 69 6e 20 61 20 63 6f 6d 70 6c 65 74  ontain a complet
7800: 65 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 64 65  e.      ** heade
7810: 72 2e 20 20 57 65 20 61 6c 72 65 61 64 79 20 64  r.  We already d
7820: 69 64 20 74 68 69 73 20 74 65 73 74 20 6f 6e 63  id this test onc
7830: 65 20 61 62 6f 76 65 2c 20 62 75 74 20 61 74 20  e above, but at 
7840: 74 68 65 20 70 72 69 6f 72 0a 20 20 20 20 20 20  the prior.      
7850: 2a 2a 20 74 65 73 74 2c 20 77 65 20 64 69 64 20  ** test, we did 
7860: 6e 6f 74 20 6b 6e 6f 77 20 74 68 65 20 6a 6f 75  not know the jou
7870: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 61 6e 64 20  rnal format and 
7880: 73 6f 20 77 65 20 68 61 64 20 74 6f 20 61 73 73  so we had to ass
7890: 75 6d 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ume.      ** the
78a0: 20 73 6d 61 6c 6c 65 73 74 20 70 6f 73 73 69 62   smallest possib
78b0: 6c 65 20 68 65 61 64 65 72 2e 20 20 4e 6f 77 20  le header.  Now 
78c0: 77 65 20 6b 6e 6f 77 20 74 68 65 20 68 65 61 64  we know the head
78d0: 65 72 20 69 73 20 62 69 67 67 65 72 0a 20 20 20  er is bigger.   
78e0: 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20 6d     ** than the m
78f0: 69 6e 69 6d 75 6d 20 73 6f 20 77 65 20 74 65 73  inimum so we tes
7900: 74 20 61 67 61 69 6e 2e 0a 20 20 20 20 20 20 2a  t again..      *
7910: 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  /.      goto end
7920: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d  _playback;.    }
7930: 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32  .    rc = read32
7940: 62 69 74 73 28 66 6f 72 6d 61 74 2c 20 26 70 50  bits(format, &pP
7950: 61 67 65 72 2d 3e 6a 66 64 2c 20 28 75 33 32 2a  ager->jfd, (u32*
7960: 29 26 6e 52 65 63 29 3b 0a 20 20 20 20 69 66 28  )&nRec);.    if(
7970: 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70   rc ) goto end_p
7980: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 72 63 20  layback;.    rc 
7990: 3d 20 72 65 61 64 33 32 62 69 74 73 28 66 6f 72  = read32bits(for
79a0: 6d 61 74 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66  mat, &pPager->jf
79b0: 64 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  d, &pPager->cksu
79c0: 6d 49 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20  mInit);.    if( 
79d0: 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  rc ) goto end_pl
79e0: 61 79 62 61 63 6b 3b 0a 20 20 20 20 69 66 28 20  ayback;.    if( 
79f0: 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66  nRec==0xffffffff
7a00: 20 7c 7c 20 75 73 65 4a 6f 75 72 6e 61 6c 53 69   || useJournalSi
7a10: 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63  ze ){.      nRec
7a20: 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41   = (szJ - JOURNA
7a30: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 2c  L_HDR_SZ(pPager,
7a40: 20 33 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f   3))/JOURNAL_PG_
7a50: 53 5a 28 33 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  SZ(3);.    }..  
7a60: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
7a70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
7a80: 69 6c 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ile is specified
7a90: 2e 20 49 66 20 6f 6e 65 20 69 73 20 73 70 65 63  . If one is spec
7aa0: 69 66 69 65 64 2c 20 0a 20 20 20 20 2a 2a 20 6f  ified, .    ** o
7ab0: 6e 6c 79 20 70 72 6f 63 65 65 64 20 77 69 74 68  nly proceed with
7ac0: 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 69 66   the playback if
7ad0: 20 69 74 20 73 74 69 6c 6c 20 65 78 69 73 74 73   it still exists
7ae0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
7af0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 66 6f 72  = read32bits(for
7b00: 6d 61 74 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66  mat, &pPager->jf
7b10: 64 2c 20 26 70 50 61 67 65 72 2d 3e 6e 4d 61 73  d, &pPager->nMas
7b20: 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ter);.    if( rc
7b30: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79   ) goto end_play
7b40: 62 61 63 6b 3b 0a 20 20 20 20 69 66 28 20 70 50  back;.    if( pP
7b50: 61 67 65 72 2d 3e 6e 4d 61 73 74 65 72 3e 30 20  ager->nMaster>0 
7b60: 29 7b 0a 20 20 20 20 20 20 7a 4d 61 73 74 65 72  ){.      zMaster
7b70: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
7b80: 70 50 61 67 65 72 2d 3e 6e 4d 61 73 74 65 72 29  pPager->nMaster)
7b90: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4d 61  ;.      if( !zMa
7ba0: 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ster ){.        
7bb0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
7bc0: 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  M;.        goto 
7bd0: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
7be0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
7bf0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26   sqlite3OsRead(&
7c00: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
7c10: 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 6e 4d  ster, pPager->nM
7c20: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66  aster);.      if
7c30: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7c40: 7c 7c 20 28 73 74 72 6c 65 6e 28 7a 4d 61 73 74  || (strlen(zMast
7c50: 65 72 29 20 26 26 20 21 73 71 6c 69 74 65 33 4f  er) && !sqlite3O
7c60: 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4d 61 73  sFileExists(zMas
7c70: 74 65 72 29 29 20 29 7b 0a 20 20 20 20 20 20 20  ter)) ){.       
7c80: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
7c90: 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ck;.      }.    
7ca0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  }.  }else{.    n
7cb0: 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55  Rec = (szJ - JOU
7cc0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
7cd0: 65 72 2c 20 32 29 29 2f 4a 4f 55 52 4e 41 4c 5f  er, 2))/JOURNAL_
7ce0: 50 47 5f 53 5a 28 32 29 3b 0a 20 20 20 20 61 73  PG_SZ(2);.    as
7cf0: 73 65 72 74 28 20 6e 52 65 63 2a 4a 4f 55 52 4e  sert( nRec*JOURN
7d00: 41 4c 5f 50 47 5f 53 5a 28 32 29 2b 4a 4f 55 52  AL_PG_SZ(2)+JOUR
7d10: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
7d20: 72 2c 20 32 29 3d 3d 73 7a 4a 20 29 3b 0a 20 20  r, 2)==szJ );.  
7d30: 7d 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  }.  rc = read32b
7d40: 69 74 73 28 66 6f 72 6d 61 74 2c 20 26 70 50 61  its(format, &pPa
7d50: 67 65 72 2d 3e 6a 66 64 2c 20 26 6d 78 50 67 29  ger->jfd, &mxPg)
7d60: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
7d70: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
7d80: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
7d90: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
7da0: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
7db0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6f  ==0 || pPager->o
7dc0: 72 69 67 44 62 53 69 7a 65 3d 3d 6d 78 50 67 20  rigDbSize==mxPg 
7dd0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
7de0: 33 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50 61  3OsTruncate(&pPa
7df0: 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
7e00: 50 41 47 45 5f 53 49 5a 45 2a 28 6f 66 66 5f 74  PAGE_SIZE*(off_t
7e10: 29 6d 78 50 67 29 3b 0a 20 20 69 66 28 20 72 63  )mxPg);.  if( rc
7e20: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
7e30: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
7e40: 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  back;.  }.  pPag
7e50: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50  er->dbSize = mxP
7e60: 67 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20  g;.  .  /* Copy 
7e70: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f  original pages o
7e80: 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ut of the journa
7e90: 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20  l and back into 
7ea0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
7eb0: 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  e..  */.  for(i=
7ec0: 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b  0; i<nRec; i++){
7ed0: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
7ee0: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
7ef0: 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
7f00: 72 2d 3e 6a 66 64 2c 20 66 6f 72 6d 61 74 29 3b  r->jfd, format);
7f10: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
7f20: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
7f30: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
7f40: 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ONE ){.        r
7f50: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
7f60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
7f70: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
7f80: 20 2f 2a 20 50 61 67 65 73 20 74 68 61 74 20 68   /* Pages that h
7f90: 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
7fa0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
7fb0: 62 75 74 20 6e 65 76 65 72 20 73 79 6e 63 65 64  but never synced
7fc0: 0a 20 20 2a 2a 20 77 68 65 72 65 20 6e 6f 74 20  .  ** where not 
7fd0: 72 65 73 74 6f 72 65 64 20 62 79 20 74 68 65 20  restored by the 
7fe0: 6c 6f 6f 70 20 61 62 6f 76 65 2e 20 20 57 65 20  loop above.  We 
7ff0: 68 61 76 65 20 74 6f 20 72 65 73 74 6f 72 65 20  have to restore 
8000: 74 68 6f 73 65 0a 20 20 2a 2a 20 70 61 67 65 73  those.  ** pages
8010: 20 62 79 20 72 65 61 64 69 6e 67 20 74 68 65 6d   by reading them
8020: 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6f   back from the o
8030: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
8040: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
8050: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8060: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
8070: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
8080: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
8090: 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
80a0: 0a 20 20 20 20 20 20 63 68 61 72 20 7a 42 75 66  .      char zBuf
80b0: 5b 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a  [SQLITE_PAGE_SIZ
80c0: 45 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  E];.      if( !p
80d0: 50 67 2d 3e 64 69 72 74 79 20 29 20 63 6f 6e 74  Pg->dirty ) cont
80e0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
80f0: 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c  (int)pPg->pgno <
8100: 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
8110: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
8120: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
8130: 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
8140: 45 5f 50 41 47 45 5f 53 49 5a 45 2a 28 6f 66 66  E_PAGE_SIZE*(off
8150: 5f 74 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29  _t)(pPg->pgno-1)
8160: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
8170: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70  sqlite3OsRead(&p
8180: 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c  Pager->fd, zBuf,
8190: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
81a0: 45 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43  E);.        TRAC
81b0: 45 32 28 22 52 45 46 45 54 43 48 20 25 64 5c 6e  E2("REFETCH %d\n
81c0: 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  ", pPg->pgno);. 
81d0: 20 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61         CODEC(pPa
81e0: 67 65 72 2c 20 7a 42 75 66 2c 20 70 50 67 2d 3e  ger, zBuf, pPg->
81f0: 70 67 6e 6f 2c 20 32 29 3b 0a 20 20 20 20 20 20  pgno, 2);.      
8200: 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
8210: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8220: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 7a 42         memset(zB
8230: 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50 41  uf, 0, SQLITE_PA
8240: 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  GE_SIZE);.      
8250: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d  }.      if( pPg-
8260: 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 6d 65 6d 63  >nRef==0 || memc
8270: 6d 70 28 7a 42 75 66 2c 20 50 47 48 44 52 5f 54  mp(zBuf, PGHDR_T
8280: 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 53 51 4c  O_DATA(pPg), SQL
8290: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 20 29  ITE_PAGE_SIZE) )
82a0: 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
82b0: 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
82c0: 50 67 29 2c 20 7a 42 75 66 2c 20 53 51 4c 49 54  Pg), zBuf, SQLIT
82d0: 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  E_PAGE_SIZE);.  
82e0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
82f0: 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 29  DR_TO_EXTRA(pPg)
8300: 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78  , 0, pPager->nEx
8310: 74 72 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tra);.      }.  
8320: 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
8330: 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  c = 0;.      pPg
8340: 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
8350: 20 7d 0a 20 20 7d 0a 0a 65 6e 64 5f 70 6c 61 79   }.  }..end_play
8360: 62 61 63 6b 3a 0a 20 20 69 66 28 20 7a 4d 61 73  back:.  if( zMas
8370: 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ter ){.    /* If
8380: 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73   there was a mas
8390: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ter journal and 
83a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
83b0: 6c 20 72 65 74 75 72 6e 20 74 72 75 65 2c 0a 20  l return true,. 
83c0: 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
83d0: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
83e0: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
83f0: 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 65 72 72   journal. If err
8400: 6f 72 73 20 0a 20 20 20 20 2a 2a 20 6f 63 63 75  ors .    ** occu
8410: 72 20 64 75 72 69 6e 67 20 74 68 69 73 20 70 72  r during this pr
8420: 6f 63 65 73 73 2c 20 69 67 6e 6f 72 65 20 74 68  ocess, ignore th
8430: 65 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  em..    */.    i
8440: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
8450: 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
8460: 64 65 6c 6d 61 73 74 65 72 28 7a 4d 61 73 74 65  delmaster(zMaste
8470: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
8480: 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72  liteFree(zMaster
8490: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
84a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
84b0: 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 57 65 20    /* FIX ME: We 
84c0: 73 68 6f 75 6c 64 6e 27 74 20 64 65 6c 65 74 65  shouldn't delete
84d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20   the journal if 
84e0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  an error occured
84f0: 20 64 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20 72   during.    ** r
8500: 6f 6c 6c 62 61 63 6b 2e 20 49 74 20 6d 61 79 20  ollback. It may 
8510: 68 61 76 65 20 62 65 65 6e 20 61 20 74 72 61 6e  have been a tran
8520: 73 69 65 6e 74 20 65 72 72 6f 72 20 61 6e 64 20  sient error and 
8530: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79  the rollback may
8540: 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 65 64 20  .    ** succeed 
8550: 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73 20  next time it is 
8560: 61 74 74 65 6d 70 74 65 64 2e 0a 20 20 20 20 2a  attempted..    *
8570: 2f 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 77 72  /.    pager_unwr
8580: 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
8590: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
85a0: 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52  Mask |= PAGER_ER
85b0: 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72  R_CORRUPT;.    r
85c0: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
85d0: 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  PT;.  }else{.   
85e0: 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
85f0: 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
8600: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
8610: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  ;.}../*.** Playb
8620: 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ack the statemen
8630: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
8640: 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72   This is similar
8650: 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   to playing back
8660: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
8670: 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74   journal but wit
8680: 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61  h.** a few extra
8690: 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20   twists..**.**  
86a0: 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65    (1)  The numbe
86b0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
86c0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
86d0: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a  at the start of.
86e0: 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 73  **         the s
86f0: 74 61 74 65 6d 65 6e 74 20 69 73 20 73 74 6f 72  tatement is stor
8700: 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 73 74  ed in pPager->st
8710: 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74  mtSize, not in t
8720: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f  he.**         jo
8730: 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c  urnal file itsel
8740: 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  f..**.**    (2) 
8750: 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20   In addition to 
8760: 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65  playing back the
8770: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
8780: 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20  al, also.**     
8790: 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c      playback all
87a0: 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 74 72   pages of the tr
87b0: 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
87c0: 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20  l beginning.**  
87d0: 20 20 20 20 20 20 20 61 74 20 6f 66 66 73 65 74         at offset
87e0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
87f0: 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
8800: 74 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61  t pager_stmt_pla
8810: 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
8820: 67 65 72 29 7b 0a 20 20 6f 66 66 5f 74 20 73 7a  ger){.  off_t sz
8830: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
8840: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
8850: 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  full journal */.
8860: 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20    int nRec;     
8870: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8880: 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
8890: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
88a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
88b0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
88c0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
88d0: 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 64 61   Truncate the da
88e0: 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f 20 69  tabase back to i
88f0: 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
8900: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
8910: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
8920: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  &pPager->fd, SQL
8930: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2a 28 6f  ITE_PAGE_SIZE*(o
8940: 66 66 5f 74 29 70 50 61 67 65 72 2d 3e 73 74 6d  ff_t)pPager->stm
8950: 74 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72  tSize);.  pPager
8960: 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
8970: 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 0a 20 20  r->stmtSize;..  
8980: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
8990: 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
89a0: 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  re in the statem
89b0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  ent journal..  *
89c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
89d0: 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26  er->stmtInUse &&
89e0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
89f0: 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65  Open );.  sqlite
8a00: 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
8a10: 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52 65  >stfd, 0);.  nRe
8a20: 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  c = pPager->stmt
8a30: 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f  NRec;.  .  /* Co
8a40: 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  py original page
8a50: 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74 61  s out of the sta
8a60: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61  tement journal a
8a70: 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
8a80: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
8a90: 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  ile.  Note that 
8aa0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
8ab0: 75 72 6e 61 6c 20 61 6c 77 61 79 73 20 75 73 65  urnal always use
8ac0: 73 20 66 6f 72 6d 61 74 0a 20 20 2a 2a 20 32 20  s format.  ** 2 
8ad0: 69 6e 73 74 65 61 64 20 6f 66 20 66 6f 72 6d 61  instead of forma
8ae0: 74 20 33 20 73 69 6e 63 65 20 69 74 20 64 6f 65  t 3 since it doe
8af0: 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
8b00: 20 63 6f 6e 63 65 72 6e 65 64 20 77 69 74 68 0a   concerned with.
8b10: 20 20 2a 2a 20 70 6f 77 65 72 20 66 61 69 6c 75    ** power failu
8b20: 72 65 73 20 63 6f 72 72 75 70 74 69 6e 67 20 74  res corrupting t
8b30: 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 63  he journal and c
8b40: 61 6e 20 74 68 75 73 20 6f 6d 69 74 20 74 68 65  an thus omit the
8b50: 20 63 68 65 63 6b 73 75 6d 73 2e 0a 20 20 2a 2f   checksums..  */
8b60: 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b  .  for(i=nRec-1;
8b70: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
8b80: 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
8b90: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
8ba0: 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 73  ager, &pPager->s
8bb0: 74 66 64 2c 20 32 29 3b 0a 20 20 20 20 61 73 73  tfd, 2);.    ass
8bc0: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
8bd0: 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20  DONE );.    if( 
8be0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
8bf0: 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
8c00: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
8c10: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
8c20: 20 6d 61 6e 79 20 70 61 67 65 73 20 6e 65 65 64   many pages need
8c30: 20 74 6f 20 62 65 20 63 6f 70 69 65 64 20 6f 75   to be copied ou
8c40: 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
8c50: 74 69 6f 6e 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  tion.  ** journa
8c60: 6c 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  l..  */.  rc = s
8c70: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50  qlite3OsSeek(&pP
8c80: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
8c90: 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20  r->stmtJSize);. 
8ca0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8cb0: 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  OK ){.    goto e
8cc0: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
8cd0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
8ce0: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26  ite3OsFileSize(&
8cf0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
8d00: 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  J);.  if( rc!=SQ
8d10: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
8d20: 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
8d30: 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 6e 52 65  yback;.  }.  nRe
8d40: 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65  c = (szJ - pPage
8d50: 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 2f 4a 4f  r->stmtJSize)/JO
8d60: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 6a 6f 75 72  URNAL_PG_SZ(jour
8d70: 6e 61 6c 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 66  nal_format);.  f
8d80: 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d  or(i=nRec-1; i>=
8d90: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20  0; i--){.    rc 
8da0: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
8db0: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
8dc0: 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  , &pPager->jfd, 
8dd0: 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 29 3b  journal_format);
8de0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
8df0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
8e00: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
8e10: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20  TE_DONE );.     
8e20: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
8e30: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20  layback;.    }. 
8e40: 20 7d 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70   }.  .end_stmt_p
8e50: 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72  layback:.  if( r
8e60: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
8e70: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
8e80: 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
8e90: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72 63  _CORRUPT;.    rc
8ea0: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
8eb0: 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
8ec0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
8ed0: 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
8ee0: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
8ef0: 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61  ory pages that a
8f00: 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 0a 2a  re allowed..**.*
8f10: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  * The maximum nu
8f20: 6d 62 65 72 20 69 73 20 74 68 65 20 61 62 73 6f  mber is the abso
8f30: 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 20 74 68  lute value of th
8f40: 65 20 6d 78 50 61 67 65 20 70 61 72 61 6d 65 74  e mxPage paramet
8f50: 65 72 2e 0a 2a 2a 20 49 66 20 6d 78 50 61 67 65  er..** If mxPage
8f60: 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
8f70: 65 20 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69 73  e noSync flag is
8f80: 20 61 6c 73 6f 20 73 65 74 2e 20 20 6e 6f 53 79   also set.  noSy
8f90: 6e 63 20 62 79 70 61 73 73 65 73 0a 2a 2a 20 63  nc bypasses.** c
8fa0: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f  alls to sqlite3O
8fb0: 73 53 79 6e 63 28 29 2e 20 20 54 68 65 20 70 61  sSync().  The pa
8fc0: 67 65 72 20 72 75 6e 73 20 6d 75 63 68 20 66 61  ger runs much fa
8fd0: 73 74 65 72 20 77 69 74 68 20 6e 6f 53 79 6e 63  ster with noSync
8fe0: 20 6f 6e 2c 0a 2a 2a 20 62 75 74 20 69 66 20 74   on,.** but if t
8ff0: 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
9000: 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74  tem crashes or t
9010: 68 65 72 65 20 69 73 20 61 6e 20 61 62 72 75 70  here is an abrup
9020: 74 20 70 6f 77 65 72 20 0a 2a 2a 20 66 61 69 6c  t power .** fail
9030: 75 72 65 2c 20 74 68 65 20 64 61 74 61 62 61 73  ure, the databas
9040: 65 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20  e file might be 
9050: 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  left in an incon
9060: 73 69 73 74 65 6e 74 20 61 6e 64 0a 2a 2a 20 75  sistent and.** u
9070: 6e 72 65 70 61 69 72 61 62 6c 65 20 73 74 61 74  nrepairable stat
9080: 65 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  e.  .*/.void sql
9090: 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 63 61  ite3pager_set_ca
90a0: 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  chesize(Pager *p
90b0: 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
90c0: 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65  e){.  if( mxPage
90d0: 3e 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  >=0 ){.    pPage
90e0: 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67  r->noSync = pPag
90f0: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
9100: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
9110: 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e  Sync ) pPager->n
9120: 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 0a 20 20  eedSync = 0; .  
9130: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
9140: 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31 3b 0a 20  r->noSync = 1;. 
9150: 20 20 20 6d 78 50 61 67 65 20 3d 20 2d 6d 78 50     mxPage = -mxP
9160: 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d  age;.  }.  if( m
9170: 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20 20  xPage>10 ){.    
9180: 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d  pPager->mxPage =
9190: 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 7d 0a 0a   mxPage;.  }.}..
91a0: 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65  /*.** Adjust the
91b0: 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74   robustness of t
91c0: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64  he database to d
91d0: 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20  amage due to OS 
91e0: 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f  crashes.** or po
91f0: 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 20  wer failures by 
9200: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d  changing the num
9210: 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20  ber of syncs()s 
9220: 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20  when writing.** 
9230: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
9240: 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65  rnal.  There are
9250: 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a   three levels:.*
9260: 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20  *.**    OFF     
9270: 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28    sqlite3OsSync(
9280: 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  ) is never calle
9290: 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  d.  This is the 
92a0: 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20  default.**      
92b0: 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70          for temp
92c0: 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69  orary and transi
92d0: 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ent files..**.**
92e0: 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68      NORMAL    Th
92f0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
9300: 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20  ced once before 
9310: 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
9320: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
9330: 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54      database.  T
9340: 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20  his is normally 
9350: 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74  adequate protect
9360: 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20  ion, but.**     
9370: 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74           it is t
9380: 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73  heoretically pos
9390: 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65  sible, though ve
93a0: 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20  ry unlikely,.** 
93b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61               tha
93c0: 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20  t an inopertune 
93d0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
93e0: 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f  uld leave the jo
93f0: 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  urnal.**        
9400: 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65        in a state
9410: 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75   which would cau
9420: 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65  se damage to the
9430: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
9440: 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69            when i
9450: 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t is rolled back
9460: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20  ..**.**    FULL 
9470: 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c       The journal
9480: 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65   is synced twice
9490: 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
94a0: 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
94b0: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
94c0: 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20  base (with some 
94d0: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
94e0: 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65  mation - the nRe
94f0: 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20  c field.**      
9500: 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a          of the j
9510: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20  ournal header - 
9520: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e  being written in
9530: 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f   between the two
9540: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
9550: 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20   syncs).  If we 
9560: 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74  assume that writ
9570: 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  ing a.**        
9580: 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73        single dis
9590: 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d  k sector is atom
95a0: 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f  ic, then this mo
95b0: 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20  de provides.**  
95c0: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75              assu
95d0: 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a  rance that the j
95e0: 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20  ournal will not 
95f0: 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20  be corrupted to 
9600: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
9610: 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75      point of cau
9620: 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74  sing damage to t
9630: 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69  he database duri
9640: 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  ng rollback..**.
9650: 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65  ** Numeric value
9660: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
9670: 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61  h these states a
9680: 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41  re OFF==1, NORMA
9690: 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c  L=2,.** and FULL
96a0: 3d 33 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  =3..*/.void sqli
96b0: 74 65 33 70 61 67 65 72 5f 73 65 74 5f 73 61 66  te3pager_set_saf
96c0: 65 74 79 5f 6c 65 76 65 6c 28 50 61 67 65 72 20  ety_level(Pager 
96d0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76  *pPager, int lev
96e0: 65 6c 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  el){.  pPager->n
96f0: 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d  oSync =  level==
9700: 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  1 || pPager->tem
9710: 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
9720: 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65  >fullSync = leve
9730: 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d  l==3 && !pPager-
9740: 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28  >tempFile;.  if(
9750: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
9760: 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ) pPager->needSy
9770: 6e 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nc = 0;.}../*.**
9780: 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   Open a temporar
9790: 79 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74  y file.  Write t
97a0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  he name of the f
97b0: 69 6c 65 20 69 6e 74 6f 20 7a 4e 61 6d 65 0a 2a  ile into zName.*
97c0: 2a 20 28 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65  * (zName must be
97d0: 20 61 74 20 6c 65 61 73 74 20 53 51 4c 49 54 45   at least SQLITE
97e0: 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20 62  _TEMPNAME_SIZE b
97f0: 79 74 65 73 20 6c 6f 6e 67 2e 29 20 20 57 72 69  ytes long.)  Wri
9800: 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64  te.** the file d
9810: 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a  escriptor into *
9820: 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  fd.  Return SQLI
9830: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
9840: 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65   or some.** othe
9850: 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  r error code if 
9860: 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54  we fail..**.** T
9870: 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d  he OS will autom
9880: 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20  atically delete 
9890: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  the temporary fi
98a0: 6c 65 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a  le when it is.**
98b0: 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74   closed..*/.stat
98c0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 70 61  ic int sqlite3pa
98d0: 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 63 68 61  ger_opentemp(cha
98e0: 72 20 2a 7a 46 69 6c 65 2c 20 4f 73 46 69 6c 65  r *zFile, OsFile
98f0: 20 2a 66 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74   *fd){.  int cnt
9900: 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 8;.  int rc;.
9910: 20 20 64 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b    do{.    cnt--;
9920: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 54 65  .    sqlite3OsTe
9930: 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65  mpFileName(zFile
9940: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
9950: 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69  te3OsOpenExclusi
9960: 76 65 28 7a 46 69 6c 65 2c 20 66 64 2c 20 31 29  ve(zFile, fd, 1)
9970: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e  ;.  }while( cnt>
9980: 30 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  0 && rc!=SQLITE_
9990: 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  OK );.  return r
99a0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
99b0: 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 63 61  te a new page ca
99c0: 63 68 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f  che and put a po
99d0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
99e0: 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61  e cache in *ppPa
99f0: 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ger..** The file
9a00: 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65   to be cached ne
9a10: 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54  ed not exist.  T
9a20: 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c  he file is not l
9a30: 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74  ocked until.** t
9a40: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
9a50: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
9a60: 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20  t() and is only 
9a70: 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20  held open until 
9a80: 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65  the.** last page
9a90: 20 69 73 20 72 65 6c 65 61 73 65 64 20 75 73 69   is released usi
9aa0: 6e 67 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  ng sqlite3pager_
9ab0: 75 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  unref()..**.** I
9ac0: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
9ad0: 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f  ULL then a rando
9ae0: 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72  mly-named tempor
9af0: 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61  ary file is crea
9b00: 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20  ted.** and used 
9b10: 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  as the file to b
9b20: 65 20 63 61 63 68 65 64 2e 20 20 54 68 65 20 66  e cached.  The f
9b30: 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65  ile will be dele
9b40: 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63  ted.** automatic
9b50: 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20  ally when it is 
9b60: 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  closed..*/.int s
9b70: 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e  qlite3pager_open
9b80: 28 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61  (.  Pager **ppPa
9b90: 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ger,         /* 
9ba0: 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72  Return the Pager
9bb0: 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
9bc0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
9bd0: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a  *zFilename,   /*
9be0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
9bf0: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
9c00: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61  en */.  int mxPa
9c10: 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ge,             
9c20: 20 2f 2a 20 4d 61 78 20 6e 75 6d 62 65 72 20 6f   /* Max number o
9c30: 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  f in-memory cach
9c40: 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  e pages */.  int
9c50: 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
9c60: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62        /* Extra b
9c70: 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65  ytes append to e
9c80: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
9c90: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a  ge */.  int useJ
9ca0: 6f 75 72 6e 61 6c 2c 20 20 20 20 20 20 20 20 20  ournal,         
9cb0: 20 2f 2a 20 54 52 55 45 20 74 6f 20 75 73 65 20   /* TRUE to use 
9cc0: 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  a rollback journ
9cd0: 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20  al on this file 
9ce0: 2a 2f 0a 20 20 76 6f 69 64 20 20 2a 70 42 75 73  */.  void  *pBus
9cf0: 79 48 61 6e 64 6c 65 72 20 20 20 20 20 20 2f 2a  yHandler      /*
9d00: 20 42 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 2a   Busy callback *
9d10: 2f 0a 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  /.){.  Pager *pP
9d20: 61 67 65 72 3b 0a 20 20 63 68 61 72 20 2a 7a 46  ager;.  char *zF
9d30: 75 6c 6c 50 61 74 68 6e 61 6d 65 3b 0a 20 20 69  ullPathname;.  i
9d40: 6e 74 20 6e 61 6d 65 4c 65 6e 3b 0a 20 20 4f 73  nt nameLen;.  Os
9d50: 46 69 6c 65 20 66 64 3b 0a 20 20 69 6e 74 20 72  File fd;.  int r
9d60: 63 2c 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70  c, i;.  int temp
9d70: 46 69 6c 65 3b 0a 20 20 69 6e 74 20 6d 65 6d 44  File;.  int memD
9d80: 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61  b = 0;.  int rea
9d90: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 63 68 61  dOnly = 0;.  cha
9da0: 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54  r zTemp[SQLITE_T
9db0: 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a  EMPNAME_SIZE];..
9dc0: 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a    *ppPager = 0;.
9dd0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d 61    if( sqlite3_ma
9de0: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20  lloc_failed ){. 
9df0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9e00: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
9e10: 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
9e20: 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
9e30: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46     if( strcmp(zF
9e40: 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79  ilename,":memory
9e50: 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  :")==0 ){.      
9e60: 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20  memDb = 1;.     
9e70: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d   zFullPathname =
9e80: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 34 29   sqliteMalloc(4)
9e90: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c  ;.      if( zFul
9ea0: 6c 50 61 74 68 6e 61 6d 65 20 29 20 73 74 72 63  lPathname ) strc
9eb0: 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  py(zFullPathname
9ec0: 2c 20 22 6e 69 6c 22 29 3b 0a 20 20 20 20 20 20  , "nil");.      
9ed0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
9ee0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9ef0: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d   zFullPathname =
9f00: 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
9f10: 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65  thname(zFilename
9f20: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
9f30: 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57  lite3OsOpenReadW
9f40: 72 69 74 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  rite(zFullPathna
9f50: 6d 65 2c 20 26 66 64 2c 20 26 72 65 61 64 4f 6e  me, &fd, &readOn
9f60: 6c 79 29 3b 0a 20 20 20 20 20 20 74 65 6d 70 46  ly);.      tempF
9f70: 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ile = 0;.    }. 
9f80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
9f90: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70   sqlite3pager_op
9fa0: 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26 66  entemp(zTemp, &f
9fb0: 64 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d  d);.    zFilenam
9fc0: 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a  e = zTemp;.    z
9fd0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
9fe0: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
9ff0: 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
a000: 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20  .    tempFile = 
a010: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  1;.  }.  if( sql
a020: 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
a030: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
a040: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
a050: 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
a060: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
a070: 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61  liteFree(zFullPa
a080: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  thname);.    ret
a090: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
a0a0: 50 45 4e 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 4c  PEN;.  }.  nameL
a0b0: 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6c  en = strlen(zFul
a0c0: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 70 50  lPathname);.  pP
a0d0: 61 67 65 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c  ager = sqliteMal
a0e0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 61  loc( sizeof(*pPa
a0f0: 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a 33  ger) + nameLen*3
a100: 20 2b 20 33 30 20 29 3b 0a 20 20 69 66 28 20 70   + 30 );.  if( p
a110: 50 61 67 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Pager==0 ){.    
a120: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
a130: 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  fd);.    sqliteF
a140: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
a150: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
a160: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
a170: 0a 20 20 53 45 54 5f 50 41 47 45 52 28 70 50 61  .  SET_PAGER(pPa
a180: 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ger);.  pPager->
a190: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61  zFilename = (cha
a1a0: 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20  r*)&pPager[1];. 
a1b0: 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
a1c0: 6f 72 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  ory = &pPager->z
a1d0: 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e  Filename[nameLen
a1e0: 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  +1];.  pPager->z
a1f0: 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65  Journal = &pPage
a200: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 61  r->zDirectory[na
a210: 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74 72 63  meLen+1];.  strc
a220: 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  py(pPager->zFile
a230: 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  name, zFullPathn
a240: 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28 70  ame);.  strcpy(p
a250: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
a260: 79 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  y, zFullPathname
a270: 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 61 6d 65 4c  );.  for(i=nameL
a280: 65 6e 3b 20 69 3e 30 20 26 26 20 70 50 61 67 65  en; i>0 && pPage
a290: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d  r->zDirectory[i-
a2a0: 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a  1]!='/'; i--){}.
a2b0: 20 20 69 66 28 20 69 3e 30 20 29 20 70 50 61 67    if( i>0 ) pPag
a2c0: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69  er->zDirectory[i
a2d0: 2d 31 5d 20 3d 20 30 3b 0a 20 20 73 74 72 63 70  -1] = 0;.  strcp
a2e0: 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
a2f0: 61 6c 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  al, zFullPathnam
a300: 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  e);.  sqliteFree
a310: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
a320: 0a 20 20 73 74 72 63 70 79 28 26 70 50 61 67 65  .  strcpy(&pPage
a330: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65  r->zJournal[name
a340: 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22  Len], "-journal"
a350: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20  );.  pPager->fd 
a360: 3d 20 66 64 3b 0a 20 20 70 50 61 67 65 72 2d 3e  = fd;.  pPager->
a370: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b  journalOpen = 0;
a380: 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  .  pPager->useJo
a390: 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e  urnal = useJourn
a3a0: 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20  al && !memDb;.  
a3b0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
a3c0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
a3d0: 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20  stmtInUse = 0;. 
a3e0: 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20   pPager->nRef = 
a3f0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  0;.  pPager->dbS
a400: 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20  ize = memDb-1;. 
a410: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
a420: 65 20 3d 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  e = SQLITE_PAGE_
a430: 53 49 5a 45 3b 0a 20 20 70 50 61 67 65 72 2d 3e  SIZE;.  pPager->
a440: 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 0a 20 20  stmtSize = 0;.  
a450: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
a460: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
a470: 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 50  >nPage = 0;.  pP
a480: 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d  ager->mxPage = m
a490: 78 50 61 67 65 3e 35 20 3f 20 6d 78 50 61 67 65  xPage>5 ? mxPage
a4a0: 20 3a 20 31 30 3b 0a 20 20 70 50 61 67 65 72 2d   : 10;.  pPager-
a4b0: 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f  >state = SQLITE_
a4c0: 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72  UNLOCK;.  pPager
a4d0: 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 0a 20  ->errMask = 0;. 
a4e0: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
a4f0: 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20  e = tempFile;.  
a500: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20  pPager->memDb = 
a510: 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
a520: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64  >readOnly = read
a530: 4f 6e 6c 79 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Only;.  pPager->
a540: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
a550: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
a560: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
a570: 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c  e || !useJournal
a580: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72  ;.  pPager->pFir
a590: 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  st = 0;.  pPager
a5a0: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
a5b0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c   0;.  pPager->pL
a5c0: 61 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ast = 0;.  pPage
a5d0: 72 2d 3e 6e 45 78 74 72 61 20 3d 20 6e 45 78 74  r->nExtra = nExt
a5e0: 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42  ra;.  pPager->pB
a5f0: 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 28 42 75  usyHandler = (Bu
a600: 73 79 48 61 6e 64 6c 65 72 20 2a 29 70 42 75 73  syHandler *)pBus
a610: 79 48 61 6e 64 6c 65 72 3b 0a 20 20 6d 65 6d 73  yHandler;.  mems
a620: 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  et(pPager->aHash
a630: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  , 0, sizeof(pPag
a640: 65 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 2a  er->aHash));.  *
a650: 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  ppPager = pPager
a660: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
a670: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
a680: 65 74 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  et the destructo
a690: 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  r for this pager
a6a0: 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  .  If not NULL, 
a6b0: 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  the destructor i
a6c0: 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e  s called.** when
a6d0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
a6e0: 6f 75 6e 74 20 6f 6e 20 65 61 63 68 20 70 61 67  ount on each pag
a6f0: 65 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20  e reaches zero. 
a700: 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   The destructor 
a710: 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 74  can.** be used t
a720: 6f 20 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72  o clean up infor
a730: 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 65 78  mation in the ex
a740: 74 72 61 20 73 65 67 6d 65 6e 74 20 61 70 70 65  tra segment appe
a750: 6e 64 65 64 20 74 6f 20 65 61 63 68 20 70 61 67  nded to each pag
a760: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73  e..**.** The des
a770: 74 72 75 63 74 6f 72 20 69 73 20 6e 6f 74 20 63  tructor is not c
a780: 61 6c 6c 65 64 20 61 73 20 61 20 72 65 73 75 6c  alled as a resul
a790: 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63  t sqlite3pager_c
a7a0: 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73  lose().  .** Des
a7b0: 74 72 75 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c  tructors are onl
a7c0: 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69  y called by sqli
a7d0: 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29  te3pager_unref()
a7e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a7f0: 33 70 61 67 65 72 5f 73 65 74 5f 64 65 73 74 72  3pager_set_destr
a800: 75 63 74 6f 72 28 50 61 67 65 72 20 2a 70 50 61  uctor(Pager *pPa
a810: 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 44 65 73  ger, void (*xDes
a820: 63 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29 7b 0a  c)(void*,int)){.
a830: 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72    pPager->xDestr
a840: 75 63 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d  uctor = xDesc;.}
a850: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
a860: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
a870: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
a880: 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69  disk file associ
a890: 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61  ated with.** pPa
a8a0: 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
a8b0: 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75  te3pager_pagecou
a8c0: 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
a8d0: 29 7b 0a 20 20 6f 66 66 5f 74 20 6e 3b 0a 20 20  ){.  off_t n;.  
a8e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
a8f0: 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
a900: 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a  r->dbSize>=0 ){.
a910: 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
a920: 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 20  r->dbSize;.  }. 
a930: 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69   if( sqlite3OsFi
a940: 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e  leSize(&pPager->
a950: 66 64 2c 20 26 6e 29 21 3d 53 51 4c 49 54 45 5f  fd, &n)!=SQLITE_
a960: 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
a970: 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47  ->errMask |= PAG
a980: 45 52 5f 45 52 52 5f 44 49 53 4b 3b 0a 20 20 20  ER_ERR_DISK;.   
a990: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
a9a0: 20 6e 20 2f 3d 20 53 51 4c 49 54 45 5f 50 41 47   n /= SQLITE_PAG
a9b0: 45 5f 53 49 5a 45 3b 0a 20 20 69 66 28 20 70 50  E_SIZE;.  if( pP
a9c0: 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c  ager->state!=SQL
a9d0: 49 54 45 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  ITE_UNLOCK ){.  
a9e0: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
a9f0: 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = n;.  }.  retu
aa00: 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rn n;.}../*.** F
aa10: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
aa20: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on.*/.static int
aa30: 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67   syncJournal(Pag
aa40: 65 72 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  er*, const char*
aa50: 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  );.../*.** Unlin
aa60: 6b 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  k a page from th
aa70: 65 20 66 72 65 65 20 6c 69 73 74 20 28 74 68 65  e free list (the
aa80: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67   list of all pag
aa90: 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30  es where nRef==0
aaa0: 29 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74  ).** and from it
aab0: 73 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e  s hash collision
aac0: 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69   chain..*/.stati
aad0: 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67  c void unlinkPag
aae0: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
aaf0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
ab00: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20   pPg->pPager;.. 
ab10: 20 2f 2a 20 4b 65 65 70 20 74 68 65 20 70 46 69   /* Keep the pFi
ab20: 72 73 74 53 79 6e 63 65 64 20 70 6f 69 6e 74 65  rstSynced pointe
ab30: 72 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68  r pointing at th
ab40: 65 20 66 69 72 73 74 20 73 79 6e 63 68 72 6f 6e  e first synchron
ab50: 69 7a 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69  ized page */.  i
ab60: 66 28 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e  f( pPg==pPager->
ab70: 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a  pFirstSynced ){.
ab80: 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70      PgHdr *p = p
ab90: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
aba0: 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70     while( p && p
abb0: 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20  ->needSync ){ p 
abc0: 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20  = p->pNextFree; 
abd0: 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46  }.    pPager->pF
abe0: 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a  irstSynced = p;.
abf0: 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b    }..  /* Unlink
ac00: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
ac10: 73 74 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  st */.  if( pPg-
ac20: 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20  >pPrevFree ){.  
ac30: 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65    pPg->pPrevFree
ac40: 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50  ->pNextFree = pP
ac50: 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
ac60: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
ac70: 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  t( pPager->pFirs
ac80: 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  t==pPg );.    pP
ac90: 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70  ager->pFirst = p
aca0: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
acb0: 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e   }.  if( pPg->pN
acc0: 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20 70  extFree ){.    p
acd0: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70  Pg->pNextFree->p
ace0: 50 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e  PrevFree = pPg->
acf0: 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 65 6c  pPrevFree;.  }el
ad00: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
ad10: 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70  pPager->pLast==p
ad20: 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Pg );.    pPager
ad30: 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70  ->pLast = pPg->p
ad40: 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 0a 20 20  PrevFree;.  }.  
ad50: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  pPg->pNextFree =
ad60: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
ad70: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e  = 0;..  /* Unlin
ad80: 6b 20 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20  k from the pgno 
ad90: 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20  hash table */.  
ada0: 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  if( pPg->pNextHa
adb0: 73 68 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70  sh ){.    pPg->p
adc0: 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48  NextHash->pPrevH
add0: 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ash = pPg->pPrev
ade0: 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Hash;.  }.  if( 
adf0: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 29  pPg->pPrevHash )
ae00: 7b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  {.    pPg->pPrev
ae10: 48 61 73 68 2d 3e 70 4e 65 78 74 48 61 73 68 20  Hash->pNextHash 
ae20: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  = pPg->pNextHash
ae30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
ae40: 6e 74 20 68 20 3d 20 70 61 67 65 72 5f 68 61 73  nt h = pager_has
ae50: 68 28 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  h(pPg->pgno);.  
ae60: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
ae70: 2d 3e 61 48 61 73 68 5b 68 5d 3d 3d 70 50 67 20  ->aHash[h]==pPg 
ae80: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
ae90: 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70  Hash[h] = pPg->p
aea0: 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20  NextHash;.  }.  
aeb0: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
aec0: 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20   pPg->pPrevHash 
aed0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  = 0;.}../*.** Th
aee0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
aef0: 65 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61  ed to truncate a
af00: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
af10: 62 61 73 65 2e 20 20 44 65 6c 65 74 65 0a 2a 2a  base.  Delete.**
af20: 20 65 76 65 72 79 20 70 61 67 65 73 20 77 68 6f   every pages who
af30: 73 65 20 70 67 6e 6f 20 69 73 20 6c 61 72 67 65  se pgno is large
af40: 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64  r than pPager->d
af50: 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75 6e 72  bSize and is unr
af60: 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20 52 65  eferenced..** Re
af70: 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 6c  ferenced pages l
af80: 61 72 67 65 72 20 74 68 61 6e 20 70 50 61 67 65  arger than pPage
af90: 72 2d 3e 64 62 53 69 7a 65 20 61 72 65 20 7a 65  r->dbSize are ze
afa0: 72 6f 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  roed..*/.static 
afb0: 76 6f 69 64 20 6d 65 6d 6f 72 79 54 72 75 6e 63  void memoryTrunc
afc0: 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
afd0: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
afe0: 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50 67  ;.  PgHdr **ppPg
aff0: 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 20 3d  ;.  int dbSize =
b000: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
b010: 0a 0a 20 20 70 70 50 67 20 3d 20 26 70 50 61 67  ..  ppPg = &pPag
b020: 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68 69 6c  er->pAll;.  whil
b030: 65 28 20 28 70 50 67 20 3d 20 2a 70 70 50 67 29  e( (pPg = *ppPg)
b040: 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  !=0 ){.    if( p
b050: 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a 65  Pg->pgno<=dbSize
b060: 20 29 7b 0a 20 20 20 20 20 20 70 70 50 67 20 3d   ){.      ppPg =
b070: 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b   &pPg->pNextAll;
b080: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
b090: 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20  Pg->nRef>0 ){.  
b0a0: 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
b0b0: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30  _TO_DATA(pPg), 0
b0c0: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
b0d0: 7a 65 29 3b 0a 20 20 20 20 20 20 70 70 50 67 20  ze);.      ppPg 
b0e0: 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  = &pPg->pNextAll
b0f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
b100: 20 20 20 2a 70 70 50 67 20 3d 20 70 50 67 2d 3e     *ppPg = pPg->
b110: 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20  pNextAll;.      
b120: 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b  unlinkPage(pPg);
b130: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
b140: 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50  e(pPg);.      pP
b150: 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20  ager->nPage--;. 
b160: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
b170: 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 66  * Truncate the f
b180: 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ile to the numbe
b190: 72 20 6f 66 20 70 61 67 65 73 20 73 70 65 63 69  r of pages speci
b1a0: 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  fied..*/.int sql
b1b0: 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61  ite3pager_trunca
b1c0: 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
b1d0: 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
b1e0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
b1f0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20  Pager->dbSize<0 
b200: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61  ){.    sqlite3pa
b210: 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50  ger_pagecount(pP
b220: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
b230: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
b240: 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  !=0 ){.    rc = 
b250: 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
b260: 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
b270: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
b280: 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64  nPage>=(unsigned
b290: 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  )pPager->dbSize 
b2a0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
b2b0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
b2c0: 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  f( pPager->memDb
b2d0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
b2e0: 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  dbSize = nPage;.
b2f0: 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61      memoryTrunca
b300: 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  te(pPager);.    
b310: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
b320: 3b 0a 20 20 7d 0a 20 20 73 79 6e 63 4a 6f 75 72  ;.  }.  syncJour
b330: 6e 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  nal(pPager, 0);.
b340: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
b350: 54 72 75 6e 63 61 74 65 28 26 70 50 61 67 65 72  Truncate(&pPager
b360: 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 50 41 47  ->fd, SQLITE_PAG
b370: 45 5f 53 49 5a 45 2a 28 6f 66 66 5f 74 29 6e 50  E_SIZE*(off_t)nP
b380: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  age);.  if( rc==
b390: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b3a0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
b3b0: 3d 20 6e 50 61 67 65 3b 0a 20 20 7d 0a 20 20 72  = nPage;.  }.  r
b3c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
b3d0: 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20  ** Shutdown the 
b3e0: 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65  page cache.  Fre
b3f0: 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64  e all memory and
b400: 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73   close all files
b410: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61  ..**.** If a tra
b420: 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20  nsaction was in 
b430: 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68  progress when th
b440: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
b450: 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72  lled, that.** tr
b460: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
b470: 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f  led back.  All o
b480: 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
b490: 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
b4a0: 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65  .** and their me
b4b0: 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20  mory is freed.  
b4c0: 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
b4d0: 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69  se a page associ
b4e0: 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69  ated.** with thi
b4f0: 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74  s page cache aft
b500: 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
b510: 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69   returns will li
b520: 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69  kely.** result i
b530: 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f  n a coredump..*/
b540: 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
b550: 72 5f 63 6c 6f 73 65 28 50 61 67 65 72 20 2a 70  r_close(Pager *p
b560: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
b570: 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  *pPg, *pNext;.  
b580: 73 77 69 74 63 68 28 20 70 50 61 67 65 72 2d 3e  switch( pPager->
b590: 73 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73  state ){.    cas
b5a0: 65 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f  e SQLITE_WRITELO
b5b0: 43 4b 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  CK: {.      sqli
b5c0: 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
b5d0: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
b5e0: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65   if( !pPager->me
b5f0: 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73  mDb ){.        s
b600: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26  qlite3OsUnlock(&
b610: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
b620: 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
b630: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
b640: 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20  alOpen==0 );.   
b650: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b660: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b670: 52 45 41 44 4c 4f 43 4b 3a 20 7b 0a 20 20 20 20  READLOCK: {.    
b680: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d    if( !pPager->m
b690: 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20  emDb ){.        
b6a0: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
b6b0: 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  &pPager->fd);.  
b6c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
b6d0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
b6e0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ault: {.      /*
b6f0: 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20   Do nothing */. 
b700: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b710: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 50 67 3d  }.  }.  for(pPg=
b720: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
b730: 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20  g; pPg=pNext){. 
b740: 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e     pNext = pPg->
b750: 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71  pNextAll;.    sq
b760: 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20  liteFree(pPg);. 
b770: 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72   }.  if( !pPager
b780: 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73  ->memDb ){.    s
b790: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70  qlite3OsClose(&p
b7a0: 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a  Pager->fd);.  }.
b7b0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
b7c0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
b7d0: 20 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69   );.  /* Temp fi
b7e0: 6c 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69  les are automati
b7f0: 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79  cally deleted by
b800: 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28   the OS.  ** if(
b810: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
b820: 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69  e ){.  **   sqli
b830: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
b840: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  er->zFilename);.
b850: 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 20 20 43 4c    ** }.  */.  CL
b860: 52 5f 50 41 47 45 52 28 70 50 61 67 65 72 29 3b  R_PAGER(pPager);
b870: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 7a  .  if( pPager->z
b880: 46 69 6c 65 6e 61 6d 65 21 3d 28 63 68 61 72 2a  Filename!=(char*
b890: 29 26 70 50 61 67 65 72 5b 31 5d 20 29 7b 0a 20  )&pPager[1] ){. 
b8a0: 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 20     assert( 0 ); 
b8b0: 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 70 70 65   /* Cannot happe
b8c0: 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 46  n */.    sqliteF
b8d0: 72 65 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ree(pPager->zFil
b8e0: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  ename);.    sqli
b8f0: 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 7a  teFree(pPager->z
b900: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71  Journal);.    sq
b910: 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
b920: 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20  >zDirectory);.  
b930: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
b940: 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
b950: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
b960: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
b970: 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
b980: 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64  the given page d
b990: 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c  ata..*/.Pgno sql
b9a0: 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 6e 75  ite3pager_pagenu
b9b0: 6d 62 65 72 28 76 6f 69 64 20 2a 70 44 61 74 61  mber(void *pData
b9c0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20  ){.  PgHdr *p = 
b9d0: 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
b9e0: 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ata);.  return p
b9f0: 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pgno;.}../*.**
ba00: 20 54 68 65 20 70 61 67 65 5f 72 65 66 28 29 20   The page_ref() 
ba10: 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65  function increme
ba20: 6e 74 73 20 74 68 65 20 72 65 66 65 72 65 6e 63  nts the referenc
ba30: 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61  e count for a pa
ba40: 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  ge..** If the pa
ba50: 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ge is currently 
ba60: 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
ba70: 28 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63  (the reference c
ba80: 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74 68  ount is zero) th
ba90: 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20  en.** remove it 
baa0: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
bab0: 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e  t..**.** For non
bac0: 2d 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70  -test systems, p
bad0: 61 67 65 5f 72 65 66 28 29 20 69 73 20 61 20 6d  age_ref() is a m
bae0: 61 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73 20  acro that calls 
baf0: 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 6f  _page_ref().** o
bb00: 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65 66  nline of the ref
bb10: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
bb20: 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74 20  zero.  For test 
bb30: 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65  systems, page_re
bb40: 66 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61 6c  f().** is a real
bb50: 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68 61   function so tha
bb60: 74 20 77 65 20 63 61 6e 20 73 65 74 20 62 72 65  t we can set bre
bb70: 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72 61  akpoints and tra
bb80: 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ce it..*/.static
bb90: 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66 28   void _page_ref(
bba0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
bbb0: 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
bbc0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ){.    /* The pa
bbd0: 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ge is currently 
bbe0: 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
bbf0: 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a    Remove it. */.
bc00: 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50 67      if( pPg==pPg
bc10: 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ->pPager->pFirst
bc20: 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 20 20  Synced ){.      
bc30: 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e  PgHdr *p = pPg->
bc40: 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20  pNextFree;.     
bc50: 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
bc60: 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20  needSync ){ p = 
bc70: 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a  p->pNextFree; }.
bc80: 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
bc90: 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
bca0: 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = p;.    }.    i
bcb0: 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65  f( pPg->pPrevFre
bcc0: 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  e ){.      pPg->
bcd0: 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74  pPrevFree->pNext
bce0: 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Free = pPg->pNex
bcf0: 74 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65  tFree;.    }else
bd00: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  {.      pPg->pPa
bd10: 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50  ger->pFirst = pP
bd20: 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
bd30: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
bd40: 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20  >pNextFree ){.  
bd50: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72      pPg->pNextFr
bd60: 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  ee->pPrevFree = 
bd70: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a  pPg->pPrevFree;.
bd80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
bd90: 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 4c   pPg->pPager->pL
bda0: 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ast = pPg->pPrev
bdb0: 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Free;.    }.    
bdc0: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65  pPg->pPager->nRe
bdd0: 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  f++;.  }.  pPg->
bde0: 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e 46  nRef++;.  REFINF
bdf0: 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64 65 66  O(pPg);.}.#ifdef
be00: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
be10: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f  tatic void page_
be20: 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ref(PgHdr *pPg){
be30: 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  .    if( pPg->nR
be40: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 5f  ef==0 ){.      _
be50: 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
be60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
be70: 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  pPg->nRef++;.   
be80: 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b     REFINFO(pPg);
be90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
bea0: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 5f 72  .# define page_r
beb0: 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e 6e 52  ef(P)   ((P)->nR
bec0: 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66 28  ef==0?_page_ref(
bed0: 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e 52  P):(void)(P)->nR
bee0: 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ef++).#endif../*
bef0: 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
bf00: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
bf10: 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54  t for a page.  T
bf20: 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72  he input pointer
bf30: 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e   is.** a referen
bf40: 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  ce to the page d
bf50: 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ata..*/.int sqli
bf60: 74 65 33 70 61 67 65 72 5f 72 65 66 28 76 6f 69  te3pager_ref(voi
bf70: 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
bf80: 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54  dr *pPg = DATA_T
bf90: 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
bfa0: 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
bfb0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
bfc0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79  _OK;.}../*.** Sy
bfd0: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  nc the journal. 
bfe0: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
bff0: 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74   make sure all t
c000: 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61  he pages that ha
c010: 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  ve.** been writt
c020: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
c030: 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20  l have actually 
c040: 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66  reached the surf
c050: 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69  ace of the.** di
c060: 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73  sk.  It is not s
c070: 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  afe to modify th
c080: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
c090: 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61  ase file until a
c0a0: 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  fter.** the jour
c0b0: 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e  nal has been syn
c0c0: 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69  ced.  If the ori
c0d0: 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69  ginal database i
c0e0: 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72  s modified befor
c0f0: 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e.** the journal
c100: 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61   is synced and a
c110: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
c120: 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e  ccurs, the unsyn
c130: 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64  ced journal.** d
c140: 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73  ata would be los
c150: 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62  t and we would b
c160: 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70  e unable to comp
c170: 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20  letely rollback 
c180: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
c190: 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61  changes.  Databa
c1a0: 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f  se corruption wo
c1b0: 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a  uld occur..** .*
c1c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
c1d0: 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68 65 20  lso updates the 
c1e0: 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68  nRec field in th
c1f0: 65 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20  e header of the 
c200: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65  journal..** (See
c210: 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65   comments on the
c220: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
c230: 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64  ) routine for ad
c240: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
c250: 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65  tion.).** If the
c260: 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55   sync mode is FU
c270: 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69  LL, two syncs wi
c280: 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74  ll occur.  First
c290: 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e   the whole journ
c2a0: 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c  al.** is synced,
c2b0: 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66   then the nRec f
c2c0: 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c  ield is updated,
c2d0: 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73   then a second s
c2e0: 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ync occurs..**.*
c2f0: 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  * For temporary 
c300: 64 61 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f  databases, we do
c310: 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65 20   not care if we 
c320: 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c  are able to roll
c330: 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20  back.** after a 
c340: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73  power failure, s
c350: 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a  o sync occurs..*
c360: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
c370: 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65 65  e clears the nee
c380: 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20 65  dSync field of e
c390: 76 65 72 79 20 70 61 67 65 20 63 75 72 72 65 6e  very page curren
c3a0: 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d  t held in.** mem
c3b0: 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ory..*/.static i
c3c0: 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
c3d0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
c3e0: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
c3f0: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
c400: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
c410: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79  ITE_OK;..  /* Sy
c420: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  nc the journal b
c430: 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20  efore modifying 
c440: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
c450: 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67  e.  ** (assuming
c460: 20 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72   there is a jour
c470: 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73  nal and it needs
c480: 20 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a   to be synced.).
c490: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
c4a0: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 7c 7c 20 7a  r->needSync || z
c4b0: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 69 66  Master ){.    if
c4c0: 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
c4d0: 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ile ){.      ass
c4e0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
c4f0: 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20  rnalOpen );.    
c500: 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50    /* assert( !pP
c510: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20  ager->noSync ); 
c520: 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20  // noSync might 
c530: 62 65 20 73 65 74 20 69 66 20 73 79 6e 63 68 72  be set if synchr
c540: 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 77  onous.      ** w
c550: 61 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61 66  as turned off af
c560: 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74  ter the transact
c570: 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2e  ion was started.
c580: 20 20 54 69 63 6b 65 74 20 23 36 31 35 20 2a 2f    Ticket #615 */
c590: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
c5a0: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
c5b0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
c5c0: 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f   pPager->nRec co
c5d0: 75 6e 74 65 72 20 77 65 20 61 72 65 20 6b 65 65  unter we are kee
c5e0: 70 69 6e 67 20 61 67 72 65 65 73 0a 20 20 20 20  ping agrees.    
c5f0: 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20      ** with the 
c600: 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
c610: 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
c620: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
c630: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
c640: 20 20 20 20 6f 66 66 5f 74 20 68 64 72 53 7a 2c      off_t hdrSz,
c650: 20 70 67 53 7a 2c 20 6a 53 7a 3b 0a 20 20 20 20   pgSz, jSz;.    
c660: 20 20 20 20 68 64 72 53 7a 20 3d 20 4a 4f 55 52      hdrSz = JOUR
c670: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
c680: 72 2c 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61  r, journal_forma
c690: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 67 53 7a  t);.        pgSz
c6a0: 20 3d 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   = JOURNAL_PG_SZ
c6b0: 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 29  (journal_format)
c6c0: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
c6d0: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
c6e0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  (&pPager->jfd, &
c6f0: 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  jSz);.        if
c700: 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
c710: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73   rc;.        ass
c720: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
c730: 63 2a 70 67 53 7a 2b 68 64 72 53 7a 3d 3d 6a 53  c*pgSz+hdrSz==jS
c740: 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  z );.      }.#en
c750: 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 6a 6f  dif.      if( jo
c760: 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 3e 3d 33 20  urnal_format>=3 
c770: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72  ){.        /* Wr
c780: 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  ite the nRec val
c790: 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ue into the jour
c7a0: 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 20  nal file header 
c7b0: 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74  */.        off_t
c7c0: 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 69 66   szJ;.        if
c7d0: 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
c7e0: 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
c7f0: 54 52 41 43 45 31 28 22 53 59 4e 43 5c 6e 22 29  TRACE1("SYNC\n")
c800: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
c810: 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 26   sqlite3OsSync(&
c820: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
c830: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
c840: 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
c850: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c860: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
c870: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 73 69 7a  pPager->jfd, siz
c880: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
c890: 63 31 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63  c1));.        rc
c8a0: 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26   = write32bits(&
c8b0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
c8c0: 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20  ger->nRec);.    
c8d0: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
c8e0: 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 20  urn rc;..       
c8f0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61   /* Write the na
c900: 6d 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  me of the master
c910: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
c920: 20 6f 6e 65 20 69 73 20 73 70 65 63 69 66 69 65   one is specifie
c930: 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  d */.        if(
c940: 20 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20   zMaster ){.    
c950: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 74        assert( st
c960: 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3c 70 50  rlen(zMaster)<pP
c970: 61 67 65 72 2d 3e 6e 4d 61 73 74 65 72 20 29 3b  ager->nMaster );
c980: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
c990: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
c9a0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 73 69 7a 65  Pager->jfd, size
c9b0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
c9c0: 33 29 20 2b 20 33 2a 34 29 3b 0a 20 20 20 20 20  3) + 3*4);.     
c9d0: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
c9e0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
c9f0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
ca00: 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
ca10: 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 73 74  jfd, zMaster, st
ca20: 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29 2b 31 29  rlen(zMaster)+1)
ca30: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
ca40: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
ca50: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
ca60: 20 20 20 73 7a 4a 20 3d 20 4a 4f 55 52 4e 41 4c     szJ = JOURNAL
ca70: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 2c 20  _HDR_SZ(pPager, 
ca80: 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 29 20  journal_format) 
ca90: 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +.              
caa0: 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2a     pPager->nRec*
cab0: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 6a 6f  JOURNAL_PG_SZ(jo
cac0: 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 29 3b 0a 20  urnal_format);. 
cad0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
cae0: 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66  Seek(&pPager->jf
caf0: 64 2c 20 73 7a 4a 29 3b 0a 20 20 20 20 20 20 7d  d, szJ);.      }
cb00: 0a 20 20 20 20 20 20 54 52 41 43 45 31 28 22 53  .      TRACE1("S
cb10: 59 4e 43 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  YNC\n");.      r
cb20: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
cb30: 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  c(&pPager->jfd);
cb40: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30  .      if( rc!=0
cb50: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
cb60: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
cb70: 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a  nalStarted = 1;.
cb80: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
cb90: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
cba0: 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74 68  .    /* Erase th
cbb0: 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  e needSync flag 
cbc0: 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65 2e  from every page.
cbd0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
cbe0: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
cbf0: 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
cc00: 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
cc10: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
cc20: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50   0;.    }.    pP
cc30: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
cc40: 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  ed = pPager->pFi
cc50: 72 73 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  rst;.  }..#ifnde
cc60: 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66  f NDEBUG.  /* If
cc70: 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   the Pager.needS
cc80: 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65 61  ync flag is clea
cc90: 72 20 74 68 65 6e 20 74 68 65 20 50 67 48 64 72  r then the PgHdr
cca0: 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66  .needSync.  ** f
ccb0: 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  lag must also be
ccc0: 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20 70   clear for all p
ccd0: 61 67 65 73 2e 20 20 56 65 72 69 66 79 20 74 68  ages.  Verify th
cce0: 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76  at this.  ** inv
ccf0: 61 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e 0a  ariant is true..
cd00: 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20    */.  else{.   
cd10: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
cd20: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
cd30: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
cd40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
cd50: 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29  g->needSync==0 )
cd60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
cd70: 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72  rt( pPager->pFir
cd80: 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67 65 72  stSynced==pPager
cd90: 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a  ->pFirst );.  }.
cda0: 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
cdb0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69   rc;.}../*.** Gi
cdc0: 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 61  ven a list of pa
cdd0: 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64 20 62  ges (connected b
cde0: 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72  y the PgHdr.pDir
cdf0: 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72 69 74  ty pointer) writ
ce00: 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f  e.** every one o
ce10: 66 20 74 68 6f 73 65 20 70 61 67 65 73 20 6f 75  f those pages ou
ce20: 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
ce30: 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20  e file and mark 
ce40: 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63  them all.** as c
ce50: 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lean..*/.static 
ce60: 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f  int pager_write_
ce70: 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a  pagelist(PgHdr *
ce80: 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20  pList){.  Pager 
ce90: 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  *pPager;.  int r
cea0: 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  c;..  if( pList=
ceb0: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
cec0: 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20  TE_OK;.  pPager 
ced0: 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b  = pList->pPager;
cee0: 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20  .  while( pList 
cef0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
cf00: 4c 69 73 74 2d 3e 64 69 72 74 79 20 29 3b 0a 20  List->dirty );. 
cf10: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b     sqlite3OsSeek
cf20: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70  (&pPager->fd, (p
cf30: 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28 6f  List->pgno-1)*(o
cf40: 66 66 5f 74 29 53 51 4c 49 54 45 5f 50 41 47 45  ff_t)SQLITE_PAGE
cf50: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 43 4f 44 45  _SIZE);.    CODE
cf60: 43 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f  C(pPager, PGHDR_
cf70: 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20  TO_DATA(pList), 
cf80: 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b  pList->pgno, 6);
cf90: 0a 20 20 20 20 54 52 41 43 45 32 28 22 53 54 4f  .    TRACE2("STO
cfa0: 52 45 20 25 64 5c 6e 22 2c 20 70 4c 69 73 74 2d  RE %d\n", pList-
cfb0: 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 72 63 20 3d  >pgno);.    rc =
cfc0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
cfd0: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48  &pPager->fd, PGH
cfe0: 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74  DR_TO_DATA(pList
cff0: 29 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  ), SQLITE_PAGE_S
d000: 49 5a 45 29 3b 0a 20 20 20 20 43 4f 44 45 43 28  IZE);.    CODEC(
d010: 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f  pPager, PGHDR_TO
d020: 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c  _DATA(pList), pL
d030: 69 73 74 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20  ist->pgno, 0);. 
d040: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
d050: 72 6e 20 72 63 3b 0a 20 20 20 20 70 4c 69 73 74  rn rc;.    pList
d060: 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
d070: 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e   pList = pList->
d080: 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65  pDirty;.  }.  re
d090: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d0a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74  }../*.** Collect
d0b0: 20 65 76 65 72 79 20 64 69 72 74 79 20 70 61 67   every dirty pag
d0c0: 65 20 69 6e 74 6f 20 61 20 64 69 72 74 79 20 6c  e into a dirty l
d0d0: 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72  ist and.** retur
d0e0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
d0f0: 68 65 20 68 65 61 64 20 6f 66 20 74 68 61 74 20  he head of that 
d100: 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61 67 65 73  list.  All pages
d110: 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65   are.** collecte
d120: 64 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 61  d even if they a
d130: 72 65 20 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e  re still in use.
d140: 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72  .*/.static PgHdr
d150: 20 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f   *pager_get_all_
d160: 64 69 72 74 79 5f 70 61 67 65 73 28 50 61 67 65  dirty_pages(Page
d170: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
d180: 48 64 72 20 2a 70 2c 20 2a 70 4c 69 73 74 3b 0a  Hdr *p, *pList;.
d190: 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 66    pList = 0;.  f
d1a0: 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c  or(p=pPager->pAl
d1b0: 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  l; p; p=p->pNext
d1c0: 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  All){.    if( p-
d1d0: 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20  >dirty ){.      
d1e0: 70 2d 3e 70 44 69 72 74 79 20 3d 20 70 4c 69 73  p->pDirty = pLis
d1f0: 74 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d  t;.      pList =
d200: 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   p;.    }.  }.  
d210: 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
d220: 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
d230: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72   page..**.** A r
d240: 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
d250: 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f 62 74  disk file is obt
d260: 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65 20 66  ained when the f
d270: 69 72 73 74 20 70 61 67 65 20 69 73 20 61 63 71  irst page is acq
d280: 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20  uired. .** This 
d290: 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f  read lock is dro
d2a0: 70 70 65 64 20 77 68 65 6e 20 74 68 65 20 6c 61  pped when the la
d2b0: 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61  st page is relea
d2c0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f 67 65  sed..**.** A _ge
d2d0: 74 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20  t works for any 
d2e0: 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61  page number grea
d2f0: 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20  ter than 0.  If 
d300: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
d310: 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20  file is smaller 
d320: 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
d330: 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f  ed page, then no
d340: 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20   actual disk.** 
d350: 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20  read occurs and 
d360: 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65  the memory image
d370: 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 73 20   of the page is 
d380: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a  initialized to.*
d390: 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68  * all zeros.  Th
d3a0: 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70  e extra data app
d3b0: 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20  ended to a page 
d3c0: 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61  is always initia
d3d0: 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f  lized.** to zero
d3e0: 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  s the first time
d3f0: 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65   a page is loade
d400: 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a  d into memory..*
d410: 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69  *.** The acquisi
d420: 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20  tion might fail 
d430: 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73  for several reas
d440: 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73  ons.  In all cas
d450: 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70  es,.** an approp
d460: 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
d470: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
d480: 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
d490: 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53  to NULL..**.** S
d4a0: 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 70  ee also sqlite3p
d4b0: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 29 2e 20 20  ager_lookup().  
d4c0: 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  Both this routin
d4d0: 65 20 61 6e 64 20 5f 6c 6f 6f 6b 75 70 28 29 20  e and _lookup() 
d4e0: 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69  attempt.** to fi
d4f0: 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
d500: 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
d510: 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20   first.  If the 
d520: 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
d530: 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  ady.** in memory
d540: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67  , this routine g
d550: 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72  oes to disk to r
d560: 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61  ead it in wherea
d570: 73 20 5f 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a  s _lookup().** j
d580: 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20  ust returns 0.  
d590: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71  This routine acq
d5a0: 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  uires a read-loc
d5b0: 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  k the first time
d5c0: 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f   it.** has to go
d5d0: 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f   to disk, and co
d5e0: 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63  uld also playbac
d5f0: 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  k an old journal
d600: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
d610: 2a 20 53 69 6e 63 65 20 5f 6c 6f 6f 6b 75 70 28  * Since _lookup(
d620: 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20  ) never goes to 
d630: 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68  disk, it never h
d640: 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  as to deal with 
d650: 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72  locks.** or jour
d660: 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e  nal files..*/.in
d670: 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  t sqlite3pager_g
d680: 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
d690: 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69  , Pgno pgno, voi
d6a0: 64 20 2a 2a 70 70 50 61 67 65 29 7b 0a 20 20 50  d **ppPage){.  P
d6b0: 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
d6c0: 20 72 63 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20   rc;..  /* Make 
d6d0: 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f 74  sure we have not
d6e0: 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63 61   hit any critica
d6f0: 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a  l errors..  */ .
d700: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
d710: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
d720: 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 2a 70   pgno!=0 );.  *p
d730: 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28  pPage = 0;.  if(
d740: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
d750: 20 26 20 7e 28 50 41 47 45 52 5f 45 52 52 5f 46   & ~(PAGER_ERR_F
d760: 55 4c 4c 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ULL) ){.    retu
d770: 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65  rn pager_errcode
d780: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
d790: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
d7a0: 68 65 20 66 69 72 73 74 20 70 61 67 65 20 61 63  he first page ac
d7b0: 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65 74  cessed, then get
d7c0: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20   a SHARED lock. 
d7d0: 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62   ** on the datab
d7e0: 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ase file..  */. 
d7f0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65   if( pPager->nRe
d800: 66 3d 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d  f==0 && !pPager-
d810: 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 69 6e  >memDb ){.    in
d820: 74 20 62 75 73 79 20 3d 20 31 3b 0a 20 20 20 20  t busy = 1;.    
d830: 77 68 69 6c 65 28 20 62 75 73 79 20 29 7b 0a 20  while( busy ){. 
d840: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d850: 33 4f 73 52 65 61 64 4c 6f 63 6b 28 26 70 50 61  3OsReadLock(&pPa
d860: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
d870: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
d880: 55 53 59 20 26 26 20 0a 20 20 20 20 20 20 20 20  USY && .        
d890: 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48    pPager->pBusyH
d8a0: 61 6e 64 6c 65 72 20 26 26 20 0a 20 20 20 20 20  andler && .     
d8b0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75       pPager->pBu
d8c0: 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63  syHandler->xFunc
d8d0: 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 70   && .          p
d8e0: 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
d8f0: 6c 65 72 2d 3e 78 46 75 6e 63 28 70 50 61 67 65  ler->xFunc(pPage
d900: 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d  r->pBusyHandler-
d910: 3e 70 41 72 67 2c 20 22 22 2c 20 62 75 73 79 2b  >pArg, "", busy+
d920: 2b 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  +).      ){.    
d930: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
d940: 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OK;.      }else{
d950: 0a 20 20 20 20 20 20 20 20 62 75 73 79 20 3d 20  .        busy = 
d960: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
d970: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d980: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
d990: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
d9a0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
d9b0: 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54  r->state = SQLIT
d9c0: 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 0a 20 20 20  E_READLOCK;..   
d9d0: 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
d9e0: 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e   file exists, an
d9f0: 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45  d there is no RE
da00: 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
da10: 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
da20: 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  se file, then it
da30: 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f   either needs to
da40: 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
da50: 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  or deleted..    
da60: 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
da70: 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26  r->useJournal &&
da80: 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
da90: 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 70 50  3OsFileExists(pP
daa0: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20  ager->zJournal) 
dab0: 26 26 0a 20 20 20 20 20 20 20 20 21 73 71 6c 69  &&.        !sqli
dac0: 74 65 33 4f 73 43 68 65 63 6b 57 72 69 74 65 4c  te3OsCheckWriteL
dad0: 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29  ock(&pPager->fd)
dae0: 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20   .    ){.       
daf0: 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 20 20 20  int rc;..       
db00: 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
db10: 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
db20: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
db30: 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  /.       rc = sq
db40: 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61  lite3OsLock(&pPa
db50: 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49  ger->fd, EXCLUSI
db60: 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
db70: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
db80: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 69  OK ){.         i
db90: 66 28 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  f( sqlite3OsUnlo
dba0: 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 21  ck(&pPager->fd)!
dbb0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
dbc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
dbd0: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61   should never ha
dbe0: 70 70 65 6e 21 20 2a 2f 0a 20 20 20 20 20 20 20  ppen! */.       
dbf0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
dc00: 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 20 20 20 20  INTERNAL;.      
dc10: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 72 65     }.         re
dc20: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
dc30: 7d 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  }.       pPager-
dc40: 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f  >state = SQLITE_
dc50: 57 52 49 54 45 4c 4f 43 4b 3b 0a 0a 20 20 20 20  WRITELOCK;..    
dc60: 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a     /* Open the j
dc70: 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 69  ournal for readi
dc80: 6e 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e  ng only.  Return
dc90: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 0a   SQLITE_BUSY if.
dca0: 20 20 20 20 20 20 20 2a 2a 20 77 65 20 61 72 65         ** we are
dcb0: 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20   unable to open 
dcc0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
dcd0: 2e 20 0a 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  . .       **.   
dce0: 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e      ** The journ
dcf0: 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
dd00: 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b   need to be lock
dd10: 65 64 20 69 74 73 65 6c 66 2e 20 20 54 68 65 0a  ed itself.  The.
dd20: 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61         ** journa
dd30: 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20  l file is never 
dd40: 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74 68 65 20  open unless the 
dd50: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
dd60: 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20 20 20 20  le holds.       
dd70: 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c  ** a write lock,
dd80: 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76   so there is nev
dd90: 65 72 20 61 6e 79 20 63 68 61 6e 63 65 20 6f 66  er any chance of
dda0: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20   two or more.   
ddb0: 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 73      ** processes
ddc0: 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75   opening the jou
ddd0: 72 6e 61 6c 20 61 74 20 74 68 65 20 73 61 6d 65  rnal at the same
dde0: 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 2a 2f   time..       */
ddf0: 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  .       rc = sql
de00: 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e  ite3OsOpenReadOn
de10: 6c 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  ly(pPager->zJour
de20: 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66  nal, &pPager->jf
de30: 64 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72  d);.       if( r
de40: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
de50: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
de60: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70  lite3OsUnlock(&p
de70: 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
de80: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
de90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
dea0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
deb0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
dec0: 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67 65    }.       pPage
ded0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
dee0: 20 31 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65   1;.       pPage
def0: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
df00: 64 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 2f  d = 0;..       /
df10: 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64  * Playback and d
df20: 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
df30: 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74  l.  Drop the dat
df40: 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20  abase write.    
df50: 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72     ** lock and r
df60: 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61  eacquire the rea
df70: 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 2a  d lock..       *
df80: 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  /.       rc = pa
df90: 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
dfa0: 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ger, 0);.       
dfb0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
dfc0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 72 65  K ){.         re
dfd0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
dfe0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20  }.    }.    pPg 
dff0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
e000: 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
e010: 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 2a 2f  page in cache */
e020: 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72  .    pPg = pager
e030: 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
e040: 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 70  pgno);.    if( p
e050: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20  Pager->memDb && 
e060: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 53  pPager->state==S
e070: 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  QLITE_UNLOCK ){.
e080: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
e090: 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 52 45 41  ate = SQLITE_REA
e0a0: 44 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  DLOCK;.    }.  }
e0b0: 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b  .  if( pPg==0 ){
e0c0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
e0d0: 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
e0e0: 74 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  t in the page ca
e0f0: 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  che. */.    int 
e100: 68 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  h;.    pPager->n
e110: 4d 69 73 73 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Miss++;.    if( 
e120: 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50  pPager->nPage<pP
e130: 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c 20  ager->mxPage || 
e140: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d  pPager->pFirst==
e150: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6d 65 6d  0 || pPager->mem
e160: 44 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  Db ){.      /* C
e170: 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  reate a new page
e180: 20 2a 2f 0a 20 20 20 20 20 20 70 50 67 20 3d 20   */.      pPg = 
e190: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
e1a0: 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20   sizeof(*pPg) + 
e1b0: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
e1c0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
e1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1e0: 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20  + sizeof(u32) + 
e1f0: 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20  pPager->nExtra. 
e200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e210: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 70               + p
e220: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 2a 73 69 7a  Pager->memDb*siz
e230: 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20 29  eof(PgHistory) )
e240: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 3d  ;.      if( pPg=
e250: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  =0 ){.        pa
e260: 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
e270: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
e280: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
e290: 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 4d 45   |= PAGER_ERR_ME
e2a0: 4d 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  M;.        retur
e2b0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
e2c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
e2d0: 6d 73 65 74 28 70 50 67 2c 20 30 2c 20 73 69 7a  mset(pPg, 0, siz
e2e0: 65 6f 66 28 2a 70 50 67 29 29 3b 0a 20 20 20 20  eof(*pPg));.    
e2f0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65    if( pPager->me
e300: 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  mDb ){.        m
e310: 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 48  emset(PGHDR_TO_H
e320: 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
e330: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 67 48 69  , 0, sizeof(PgHi
e340: 73 74 6f 72 79 29 29 3b 0a 20 20 20 20 20 20 7d  story));.      }
e350: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
e360: 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20  er = pPager;.   
e370: 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c     pPg->pNextAll
e380: 20 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b   = pPager->pAll;
e390: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
e3a0: 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 20  All = pPg;.     
e3b0: 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b   pPager->nPage++
e3c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
e3d0: 20 20 20 2f 2a 20 46 69 6e 64 20 61 20 70 61 67     /* Find a pag
e3e0: 65 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 20 54  e to recycle.  T
e3f0: 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70  ry to locate a p
e400: 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  age that does no
e410: 74 0a 20 20 20 20 20 20 2a 2a 20 72 65 71 75 69  t.      ** requi
e420: 72 65 20 75 73 20 74 6f 20 64 6f 20 61 6e 20 66  re us to do an f
e430: 73 79 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f  sync() on the jo
e440: 75 72 6e 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a  urnal..      */.
e450: 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 61 67        pPg = pPag
e460: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
e470: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 77  ;..      /* If w
e480: 65 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64  e could not find
e490: 20 61 20 70 61 67 65 20 74 68 61 74 20 64 6f 65   a page that doe
e4a0: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e  s not require an
e4b0: 20 66 73 79 6e 63 28 29 0a 20 20 20 20 20 20 2a   fsync().      *
e4c0: 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * on the journal
e4d0: 20 66 69 6c 65 20 74 68 65 6e 20 66 73 79 6e 63   file then fsync
e4e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
e4f0: 65 2e 20 20 54 68 69 73 20 69 73 20 61 0a 20 20  e.  This is a.  
e500: 20 20 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77      ** very slow
e510: 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77   operation, so w
e520: 65 20 77 6f 72 6b 20 68 61 72 64 20 74 6f 20 61  e work hard to a
e530: 76 6f 69 64 20 69 74 2e 20 20 42 75 74 20 73 6f  void it.  But so
e540: 6d 65 74 69 6d 65 73 0a 20 20 20 20 20 20 2a 2a  metimes.      **
e550: 20 69 74 20 63 61 6e 27 74 20 62 65 20 68 65 6c   it can't be hel
e560: 70 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ped..      */.  
e570: 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29      if( pPg==0 )
e580: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63  {.        int rc
e590: 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
e5a0: 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
e5b0: 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
e5c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
e5d0: 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
e5e0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
e5f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e600: 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20  _IOERR;.        
e610: 7d 0a 20 20 20 20 20 20 20 20 70 50 67 20 3d 20  }.        pPg = 
e620: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a  pPager->pFirst;.
e630: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
e640: 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d  sert( pPg->nRef=
e650: 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  =0 );..      /* 
e660: 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 74  Write the page t
e670: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
e680: 69 6c 65 20 69 66 20 69 74 20 69 73 20 64 69 72  ile if it is dir
e690: 74 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ty..      */.   
e6a0: 20 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74     if( pPg->dirt
e6b0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  y ){.        ass
e6c0: 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79  ert( pPg->needSy
e6d0: 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  nc==0 );.       
e6e0: 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30   pPg->pDirty = 0
e6f0: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  ;.        rc = p
e700: 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
e710: 69 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20  ist( pPg );.    
e720: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
e730: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
e740: 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
e750: 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
e760: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
e770: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
e780: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e790: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
e7a0: 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29   pPg->dirty==0 )
e7b0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ;..      /* If t
e7c0: 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 72  he page we are r
e7d0: 65 63 79 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b  ecycling is mark
e7e0: 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c  ed as alwaysRoll
e7f0: 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20 20 20 20  back, then.     
e800: 20 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62   ** set the glob
e810: 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  al alwaysRollbac
e820: 6b 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73  k flag, thus dis
e830: 61 62 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20  abling the.     
e840: 20 2a 2a 20 73 71 6c 69 74 65 5f 64 6f 6e 74 5f   ** sqlite_dont_
e850: 72 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d  rollback() optim
e860: 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  ization for the 
e870: 72 65 73 74 20 6f 66 20 74 68 69 73 20 74 72 61  rest of this tra
e880: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
e890: 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73 61  ** It is necessa
e8a0: 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65  ry to do this be
e8b0: 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 6d  cause the page m
e8c0: 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c  arked alwaysRoll
e8d0: 62 61 63 6b 0a 20 20 20 20 20 20 2a 2a 20 6d 69  back.      ** mi
e8e0: 67 68 74 20 62 65 20 72 65 6c 6f 61 64 65 64 20  ght be reloaded 
e8f0: 61 74 20 61 20 6c 61 74 65 72 20 74 69 6d 65 20  at a later time 
e900: 62 75 74 20 61 74 20 74 68 61 74 20 70 6f 69 6e  but at that poin
e910: 74 20 77 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d  t we won't remem
e920: 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  ber.      ** tha
e930: 74 20 69 73 20 77 61 73 20 6d 61 72 6b 65 64 20  t is was marked 
e940: 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20  alwaysRollback. 
e950: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
e960: 20 61 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 0a   all pages must.
e970: 20 20 20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b        ** be mark
e980: 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c  ed as alwaysRoll
e990: 62 61 63 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f  back from here o
e9a0: 6e 20 6f 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  n out..      */.
e9b0: 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 61        if( pPg->a
e9c0: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b  lwaysRollback ){
e9d0: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
e9e0: 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
e9f0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 1;.      }..  
ea00: 20 20 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68      /* Unlink th
ea10: 65 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20  e old page from 
ea20: 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e  the free list an
ea30: 64 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  d the hash table
ea40: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
ea50: 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b  unlinkPage(pPg);
ea60: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
ea70: 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Ovfl++;.    }.  
ea80: 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67    pPg->pgno = pg
ea90: 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  no;.    if( pPag
eaa0: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26  er->aInJournal &
eab0: 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61  & (int)pgno<=pPa
eac0: 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
ead0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
eae0: 43 68 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67  CheckMemory(pPag
eaf0: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->aInJournal, 
eb00: 70 67 6e 6f 2f 38 29 3b 0a 20 20 20 20 20 20 61  pgno/8);.      a
eb10: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
eb20: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
eb30: 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
eb40: 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e 61 49  al = (pPager->aI
eb50: 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d  nJournal[pgno/8]
eb60: 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29   & (1<<(pgno&7))
eb70: 29 21 3d 30 3b 0a 20 20 20 20 20 20 70 50 67 2d  )!=0;.      pPg-
eb80: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
eb90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
eba0: 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
ebb0: 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   0;.      pPg->n
ebc0: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
ebd0: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
ebe0: 72 2d 3e 61 49 6e 53 74 6d 74 20 26 26 20 28 69  r->aInStmt && (i
ebf0: 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  nt)pgno<=pPager-
ec00: 3e 73 74 6d 74 53 69 7a 65 0a 20 20 20 20 20 20  >stmtSize.      
ec10: 20 20 20 20 20 20 20 26 26 20 28 70 50 61 67 65         && (pPage
ec20: 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 67 6e 6f 2f  r->aInStmt[pgno/
ec30: 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37  8] & (1<<(pgno&7
ec40: 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  )))!=0 ){.      
ec50: 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
ec60: 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
ec70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 61 67  }else{.      pag
ec80: 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74  e_remove_from_st
ec90: 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
eca0: 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 64 69 72    }.    pPg->dir
ecb0: 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d  ty = 0;.    pPg-
ecc0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 52  >nRef = 1;.    R
ecd0: 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20  EFINFO(pPg);.   
ece0: 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b   pPager->nRef++;
ecf0: 0a 20 20 20 20 68 20 3d 20 70 61 67 65 72 5f 68  .    h = pager_h
ed00: 61 73 68 28 70 67 6e 6f 29 3b 0a 20 20 20 20 70  ash(pgno);.    p
ed10: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  Pg->pNextHash = 
ed20: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
ed30: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48  ;.    pPager->aH
ed40: 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20  ash[h] = pPg;.  
ed50: 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
ed60: 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73  Hash ){.      as
ed70: 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74  sert( pPg->pNext
ed80: 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 3d  Hash->pPrevHash=
ed90: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  =0 );.      pPg-
eda0: 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65  >pNextHash->pPre
edb0: 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20  vHash = pPg;.   
edc0: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
edd0: 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20  r->nExtra>0 ){. 
ede0: 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
edf0: 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 29 2c  R_TO_EXTRA(pPg),
ee00: 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74   0, pPager->nExt
ee10: 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ra);.    }.    i
ee20: 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
ee30: 65 3c 30 20 29 20 73 71 6c 69 74 65 33 70 61 67  e<0 ) sqlite3pag
ee40: 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61  er_pagecount(pPa
ee50: 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ger);.    if( pP
ee60: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30  ager->errMask!=0
ee70: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
ee80: 33 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47 48  3pager_unref(PGH
ee90: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29  DR_TO_DATA(pPg))
eea0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
eeb0: 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65  er_errcode(pPage
eec0: 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
eed0: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
eee0: 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
eef0: 65 3c 28 69 6e 74 29 70 67 6e 6f 20 29 7b 0a 20  e<(int)pgno ){. 
ef00: 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
ef10: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
ef20: 30 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  0, SQLITE_PAGE_S
ef30: 49 5a 45 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  IZE);.    }else{
ef40: 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  .      int rc;. 
ef50: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
ef60: 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b  ger->memDb==0 );
ef70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
ef80: 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Seek(&pPager->fd
ef90: 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 6f 66 66 5f  , (pgno-1)*(off_
efa0: 74 29 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  t)SQLITE_PAGE_SI
efb0: 5a 45 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ZE);.      rc = 
efc0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70  sqlite3OsRead(&p
efd0: 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52  Pager->fd, PGHDR
efe0: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 53  _TO_DATA(pPg), S
eff0: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
f000: 3b 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22  ;.      TRACE2("
f010: 46 45 54 43 48 20 25 64 5c 6e 22 2c 20 70 50 67  FETCH %d\n", pPg
f020: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43  ->pgno);.      C
f030: 4f 44 45 43 28 70 50 61 67 65 72 2c 20 50 47 48  ODEC(pPager, PGH
f040: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
f050: 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a   pPg->pgno, 3);.
f060: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
f070: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
f080: 20 20 20 6f 66 66 5f 74 20 66 69 6c 65 53 69 7a     off_t fileSiz
f090: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  e;.        if( s
f0a0: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
f0b0: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 26 66 69  (&pPager->fd,&fi
f0c0: 6c 65 53 69 7a 65 29 21 3d 53 51 4c 49 54 45 5f  leSize)!=SQLITE_
f0d0: 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  OK.             
f0e0: 20 20 7c 7c 20 66 69 6c 65 53 69 7a 65 3e 3d 70    || fileSize>=p
f0f0: 67 6e 6f 2a 53 51 4c 49 54 45 5f 50 41 47 45 5f  gno*SQLITE_PAGE_
f100: 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
f110: 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
f120: 6e 72 65 66 28 50 47 48 44 52 5f 54 4f 5f 44 41  nref(PGHDR_TO_DA
f130: 54 41 28 70 50 67 29 29 3b 0a 20 20 20 20 20 20  TA(pPg));.      
f140: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
f150: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
f160: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50          memset(P
f170: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
f180: 29 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50 41 47  ), 0, SQLITE_PAG
f190: 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20  E_SIZE);.       
f1a0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
f1b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
f1c0: 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70   The requested p
f1d0: 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 70 61  age is in the pa
f1e0: 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  ge cache. */.   
f1f0: 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 2b 2b 3b   pPager->nHit++;
f200: 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28 70 50  .    page_ref(pP
f210: 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67  g);.  }.  *ppPag
f220: 65 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  e = PGHDR_TO_DAT
f230: 41 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e  A(pPg);.  return
f240: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
f250: 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70  *.** Acquire a p
f260: 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72  age if it is alr
f270: 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d  eady in the in-m
f280: 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f  emory cache.  Do
f290: 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65  .** not read the
f2a0: 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e   page from disk.
f2b0: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
f2c0: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a  er to the page,.
f2d0: 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70  ** or 0 if the p
f2e0: 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
f2f0: 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  che..**.** See a
f300: 6c 73 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72  lso sqlite3pager
f310: 5f 67 65 74 28 29 2e 20 20 54 68 65 20 64 69 66  _get().  The dif
f320: 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
f330: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
f340: 61 6e 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  and sqlite3pager
f350: 5f 67 65 74 28 29 20 69 73 20 74 68 61 74 20 5f  _get() is that _
f360: 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f  get() will go to
f370: 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65   the disk and re
f380: 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67  ad.** in the pag
f390: 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
f3a0: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
f3b0: 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
f3c0: 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
f3d0: 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65  NULL if the page
f3e0: 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
f3f0: 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f   or if a disk I/
f400: 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20  O error .** has 
f410: 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a  ever happened..*
f420: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 70  /.void *sqlite3p
f430: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65  ager_lookup(Page
f440: 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
f450: 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
f460: 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pPg;..  assert( 
f470: 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
f480: 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
f490: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
f4a0: 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45  errMask & ~(PAGE
f4b0: 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20  R_ERR_FULL) ){. 
f4c0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
f4d0: 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c  .  pPg = pager_l
f4e0: 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
f4f0: 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d  no);.  if( pPg==
f500: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
f510: 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
f520: 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f   return PGHDR_TO
f530: 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f  _DATA(pPg);.}../
f540: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70  *.** Release a p
f550: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  age..**.** If th
f560: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
f570: 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
f580: 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c  ge drop to zero,
f590: 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67   then the.** pag
f5a0: 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
f5b0: 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65  e LRU list.  Whe
f5c0: 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  n all references
f5d0: 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a   to all pages.**
f5e0: 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61   are released, a
f5f0: 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
f600: 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
f610: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
f620: 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a  .** removed..*/.
f630: 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
f640: 5f 75 6e 72 65 66 28 76 6f 69 64 20 2a 70 44 61  _unref(void *pDa
f650: 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
f660: 67 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65  g;..  /* Decreme
f670: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
f680: 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73 20   count for this 
f690: 70 61 67 65 0a 20 20 2a 2f 0a 20 20 70 50 67 20  page.  */.  pPg 
f6a0: 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
f6b0: 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74  pData);.  assert
f6c0: 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
f6d0: 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a  .  pPg->nRef--;.
f6e0: 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
f6f0: 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e  .  /* When the n
f700: 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
f710: 63 65 73 20 74 6f 20 61 20 70 61 67 65 20 72 65  ces to a page re
f720: 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a  ach 0, call the.
f730: 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20    ** destructor 
f740: 61 6e 64 20 61 64 64 20 74 68 65 20 70 61 67 65  and add the page
f750: 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
f760: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
f770: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
f780: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
f790: 20 20 20 20 70 50 61 67 65 72 20 3d 20 70 50 67      pPager = pPg
f7a0: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50  ->pPager;.    pP
f7b0: 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 30  g->pNextFree = 0
f7c0: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  ;.    pPg->pPrev
f7d0: 46 72 65 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Free = pPager->p
f7e0: 4c 61 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72  Last;.    pPager
f7f0: 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20  ->pLast = pPg;. 
f800: 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65     if( pPg->pPre
f810: 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70  vFree ){.      p
f820: 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70  Pg->pPrevFree->p
f830: 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 3b 0a  NextFree = pPg;.
f840: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f850: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
f860: 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
f870: 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79   if( pPg->needSy
f880: 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  nc==0 && pPager-
f890: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30  >pFirstSynced==0
f8a0: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
f8b0: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
f8c0: 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
f8d0: 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73  if( pPager->xDes
f8e0: 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 20  tructor ){.     
f8f0: 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
f900: 63 74 6f 72 28 70 44 61 74 61 2c 20 70 50 61 67  ctor(pData, pPag
f910: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
f920: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57     }.  .    /* W
f930: 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65  hen all pages re
f940: 61 63 68 20 74 68 65 20 66 72 65 65 6c 69 73 74  ach the freelist
f950: 2c 20 64 72 6f 70 20 74 68 65 20 72 65 61 64 20  , drop the read 
f960: 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  lock from.    **
f970: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
f980: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  le..    */.    p
f990: 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  Pager->nRef--;. 
f9a0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
f9b0: 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20  r->nRef>=0 );.  
f9c0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52    if( pPager->nR
f9d0: 65 66 3d 3d 30 20 26 26 20 21 70 50 61 67 65 72  ef==0 && !pPager
f9e0: 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20  ->memDb ){.     
f9f0: 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
fa00: 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
fa10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fa20: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
fa30: 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ate a journal fi
fa40: 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20  le for pPager.  
fa50: 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72  There should alr
fa60: 65 61 64 79 20 62 65 20 61 20 77 72 69 74 65 0a  eady be a write.
fa70: 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ** lock on the d
fa80: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65  atabase file whe
fa90: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
faa0: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
fab0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
fac0: 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20   if everything. 
fad0: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
fae0: 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73   code and releas
faf0: 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c  e the.** write l
fb00: 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ock if anything 
fb10: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  goes wrong..*/.s
fb20: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
fb30: 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67  open_journal(Pag
fb40: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
fb50: 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
fb60: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
fb70: 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b  SQLITE_WRITELOCK
fb80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
fb90: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
fba0: 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  n==0 );.  assert
fbb0: 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
fbc0: 72 6e 61 6c 20 29 3b 0a 20 20 73 71 6c 69 74 65  rnal );.  sqlite
fbd0: 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  3pager_pagecount
fbe0: 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67  (pPager);.  pPag
fbf0: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->aInJournal =
fc00: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
fc10: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20  Pager->dbSize/8 
fc20: 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61  + 1 );.  if( pPa
fc30: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
fc40: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
fc50: 33 4f 73 52 65 61 64 4c 6f 63 6b 28 26 70 50 61  3OsReadLock(&pPa
fc60: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 70 50  ger->fd);.    pP
fc70: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51  ager->state = SQ
fc80: 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20  LITE_READLOCK;. 
fc90: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fca0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63  _NOMEM;.  }.  rc
fcb0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
fcc0: 45 78 63 6c 75 73 69 76 65 28 70 50 61 67 65 72  Exclusive(pPager
fcd0: 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61  ->zJournal, &pPa
fce0: 67 65 72 2d 3e 6a 66 64 2c 70 50 61 67 65 72 2d  ger->jfd,pPager-
fcf0: 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66  >tempFile);.  if
fd00: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
fd10: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
fd20: 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  e(pPager->aInJou
fd30: 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65  rnal);.    pPage
fd40: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->aInJournal = 
fd50: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  0;.    sqlite3Os
fd60: 52 65 61 64 4c 6f 63 6b 28 26 70 50 61 67 65 72  ReadLock(&pPager
fd70: 2d 3e 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65  ->fd);.    pPage
fd80: 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54  r->state = SQLIT
fd90: 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20 20 20 20  E_READLOCK;.    
fda0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
fdb0: 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 73 71  NTOPEN;.  }.  sq
fdc0: 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69 72 65 63  lite3OsOpenDirec
fdd0: 74 6f 72 79 28 70 50 61 67 65 72 2d 3e 7a 44 69  tory(pPager->zDi
fde0: 72 65 63 74 6f 72 79 2c 20 26 70 50 61 67 65 72  rectory, &pPager
fdf0: 2d 3e 6a 66 64 29 3b 0a 20 20 70 50 61 67 65 72  ->jfd);.  pPager
fe00: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
fe10: 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  1;.  pPager->jou
fe20: 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
fe30: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
fe40: 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ync = 0;.  pPage
fe50: 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
fe60: 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  k = 0;.  pPager-
fe70: 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28  >nRec = 0;.  if(
fe80: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
fe90: 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  !=0 ){.    rc = 
fea0: 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
feb0: 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
fec0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67  n rc;.  }.  pPag
fed0: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
fee0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
fef0: 0a 20 20 69 66 28 20 6a 6f 75 72 6e 61 6c 5f 66  .  if( journal_f
ff00: 6f 72 6d 61 74 3d 3d 4a 4f 55 52 4e 41 4c 5f 46  ormat==JOURNAL_F
ff10: 4f 52 4d 41 54 5f 33 20 29 7b 0a 20 20 20 20 2f  ORMAT_3 ){.    /
ff20: 2a 20 43 72 65 61 74 65 20 74 68 65 20 68 65 61  * Create the hea
ff30: 64 65 72 20 66 6f 72 20 61 20 66 6f 72 6d 61 74  der for a format
ff40: 20 33 20 6a 6f 75 72 6e 61 6c 3a 0a 20 20 20 20   3 journal:.    
ff50: 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61  ** - 8 bytes: Ma
ff60: 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20  gic identifying 
ff70: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 33  journal format 3
ff80: 2e 0a 20 20 20 20 2a 2a 20 2d 20 34 20 62 79 74  ..    ** - 4 byt
ff90: 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65  es: Number of re
ffa0: 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c  cords in journal
ffb0: 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20  , or -1 no-sync 
ffc0: 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 20 20 20 20  mode is on..    
ffd0: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4d 61  ** - 4 bytes: Ma
ffe0: 67 69 63 20 75 73 65 64 20 66 6f 72 20 70 61 67  gic used for pag
fff0: 65 20 63 68 65 63 6b 73 75 6d 73 2e 0a 20 20 20  e checksums..   
10000 20 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e   ** - 4 bytes: N
10010 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
10020 65 73 65 72 76 65 64 20 66 6f 72 20 6d 61 73 74  eserved for mast
10030 65 72 20 6a 6f 75 72 6e 61 6c 20 70 74 72 20 28  er journal ptr (
10040 6e 4d 61 73 74 65 72 29 0a 20 20 20 20 2a 2a 20  nMaster).    ** 
10050 2d 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 3a  - nMaster bytes:
10060 20 53 70 61 63 65 20 66 6f 72 20 61 20 6d 61 73   Space for a mas
10070 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
10080 74 65 72 2e 0a 20 20 20 20 2a 2a 20 2d 20 34 20  ter..    ** - 4 
10090 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64  bytes: Initial d
100a0 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75  atabase page cou
100b0 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  nt..    */.    r
100c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
100d0 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  te(&pPager->jfd,
100e0 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 33 2c   aJournalMagic3,
100f0 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
10100 4d 61 67 69 63 33 29 29 3b 0a 20 20 20 20 69 66  Magic3));.    if
10110 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
10120 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  ){.      rc = wr
10130 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65  ite32bits(&pPage
10140 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
10150 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66 66 66 66  noSync ? 0xfffff
10160 66 66 66 20 3a 20 30 29 3b 0a 20 20 20 20 7d 0a  fff : 0);.    }.
10170 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
10180 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
10190 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73  qlite3Randomness
101a0 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  (sizeof(pPager->
101b0 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61  cksumInit), &pPa
101c0 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
101d0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
101e0 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d  e32bits(&pPager-
101f0 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 63 6b  >jfd, pPager->ck
10200 73 75 6d 49 6e 69 74 29 3b 0a 20 20 20 20 7d 0a  sumInit);.    }.
10210 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
10220 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
10230 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
10240 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
10250 61 67 65 72 2d 3e 6e 4d 61 73 74 65 72 29 3b 0a  ager->nMaster);.
10260 20 20 20 20 7d 0a 20 20 20 0a 20 20 20 20 2f 2a      }.   .    /*
10270 20 55 6e 6c 65 73 73 20 74 68 65 20 73 69 7a 65   Unless the size
10280 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 74 68   reserved for th
10290 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
102a0 20 70 6f 69 6e 74 65 72 20 69 73 20 30 2c 20 73   pointer is 0, s
102b0 65 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  et.    ** the fi
102c0 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
102d0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
102e0 6f 69 6e 74 65 72 20 74 6f 20 30 78 30 30 2e 20  ointer to 0x00. 
102f0 20 45 69 74 68 65 72 20 77 61 79 2c 0a 20 20 20   Either way,.   
10300 20 2a 2a 20 74 68 69 73 20 69 73 20 69 6e 74 65   ** this is inte
10310 72 70 72 65 74 65 64 20 61 73 20 27 6e 6f 20 6d  rpreted as 'no m
10320 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 27 20 69  aster journal' i
10330 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
10340 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  .    ** rollback
10350 20 61 66 74 65 72 20 61 20 63 72 61 73 68 2e 0a   after a crash..
10360 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
10370 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
10380 70 50 61 67 65 72 2d 3e 6e 4d 61 73 74 65 72 3e  pPager->nMaster>
10390 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
103a0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26  sqlite3OsWrite(&
103b0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22 22 2c  pPager->jfd, "",
103c0 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   1);.    }.    i
103d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
103e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
103f0 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50  qlite3OsSeek(&pP
10400 61 67 65 72 2d 3e 6a 66 64 2c 20 0a 20 20 20 20  ager->jfd, .    
10410 20 20 20 20 20 20 73 69 7a 65 6f 66 28 61 4a 6f        sizeof(aJo
10420 75 72 6e 61 6c 4d 61 67 69 63 33 29 20 2b 20 33  urnalMagic3) + 3
10430 2a 34 20 2b 20 70 50 61 67 65 72 2d 3e 6e 4d 61  *4 + pPager->nMa
10440 73 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ster);.    }.  }
10450 65 6c 73 65 20 69 66 28 20 6a 6f 75 72 6e 61 6c  else if( journal
10460 5f 66 6f 72 6d 61 74 3d 3d 4a 4f 55 52 4e 41 4c  _format==JOURNAL
10470 5f 46 4f 52 4d 41 54 5f 32 20 29 7b 0a 20 20 20  _FORMAT_2 ){.   
10480 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
10490 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  rite(&pPager->jf
104a0 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  d, aJournalMagic
104b0 32 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  2, sizeof(aJourn
104c0 61 6c 4d 61 67 69 63 32 29 29 3b 0a 20 20 7d 65  alMagic2));.  }e
104d0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
104e0 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 3d   journal_format=
104f0 3d 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f  =JOURNAL_FORMAT_
10500 31 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  1 );.    rc = sq
10510 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50  lite3OsWrite(&pP
10520 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72  ager->jfd, aJour
10530 6e 61 6c 4d 61 67 69 63 31 2c 20 73 69 7a 65 6f  nalMagic1, sizeo
10540 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 31  f(aJournalMagic1
10550 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  ));.  }.  if( rc
10560 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
10570 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
10580 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  its(&pPager->jfd
10590 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
105a0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
105b0 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
105c0 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
105d0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
105e0 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74  qlite3pager_stmt
105f0 5f 62 65 67 69 6e 28 70 50 61 67 65 72 29 3b 0a  _begin(pPager);.
10600 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
10610 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
10620 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74  c = pager_unwrit
10630 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
10640 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
10650 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
10660 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
10670 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
10680 72 6e 20 72 63 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a  rn rc;  .}../*.*
10690 2a 20 41 63 71 75 69 72 65 20 61 20 77 72 69 74  * Acquire a writ
106a0 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e-lock on the da
106b0 74 61 62 61 73 65 2e 20 20 54 68 65 20 6c 6f 63  tabase.  The loc
106c0 6b 20 69 73 20 72 65 6d 6f 76 65 64 20 77 68 65  k is removed whe
106d0 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66 20  n.** the any of 
106e0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61  the following ha
106f0 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ppen:.**.**   * 
10700 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f   sqlite3pager_co
10710 6d 6d 69 74 28 29 20 69 73 20 63 61 6c 6c 65 64  mmit() is called
10720 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
10730 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
10740 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
10750 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65    *  sqlite3page
10760 72 5f 63 6c 6f 73 65 28 29 20 69 73 20 63 61 6c  r_close() is cal
10770 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  led..**   *  sql
10780 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
10790 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  ) is called to o
107a0 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61 6e 64  n every outstand
107b0 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ing page..**.** 
107c0 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65  The first parame
107d0 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ter to this rout
107e0 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ine is a pointer
107f0 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67   to any open pag
10800 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
10810 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68  base file.  Noth
10820 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75  ing changes abou
10830 74 20 74 68 65 20 70 61 67 65 20 2d 20 69 74 20  t the page - it 
10840 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79 20 74  is used merely t
10850 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61 20 70  o.** acquire a p
10860 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
10870 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e  ger structure an
10880 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20  d as proof that 
10890 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65  there is.** alre
108a0 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
108b0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
108c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  .**.** The secon
108d0 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69  d parameter indi
108e0 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68 20 73  cates how much s
108f0 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 74 6f  pace in bytes to
10900 20 72 65 73 65 72 76 65 20 66 6f 72 20 61 0a 2a   reserve for a.*
10910 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
10920 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68   file-name at th
10930 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
10940 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74 20 69  ournal when it i
10950 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  s created..**.**
10960 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   A journal file 
10970 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74 68 69  is opened if thi
10980 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f  s is not a tempo
10990 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f 72 20  rary file.  For 
109a0 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c  temporary.** fil
109b0 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20  es, the opening 
109c0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
109d0 69 6c 65 20 69 73 20 64 65 66 65 72 72 65 64 20  ile is deferred 
109e0 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20 61  until there is a
109f0 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65 64  n.** actual need
10a00 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
10a10 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
10a20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
10a30 69 73 20 61 6c 72 65 61 64 79 20 77 72 69 74 65  is already write
10a40 2d 6c 6f 63 6b 65 64 2c 20 74 68 69 73 20 72 6f  -locked, this ro
10a50 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
10a60 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10a70 70 61 67 65 72 5f 62 65 67 69 6e 28 76 6f 69 64  pager_begin(void
10a80 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 4d 61   *pData, int nMa
10a90 73 74 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ster){.  PgHdr *
10aa0 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
10ab0 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61  HDR(pData);.  Pa
10ac0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
10ad0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
10ae0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
10af0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
10b00 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65  nRef>0 );.  asse
10b10 72 74 28 20 6e 4d 61 73 74 65 72 3e 3d 30 20 29  rt( nMaster>=0 )
10b20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
10b30 65 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54  er->state!=SQLIT
10b40 45 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  E_UNLOCK );.  if
10b50 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
10b60 3d 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b  =SQLITE_READLOCK
10b70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
10b80 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
10b90 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  al==0 );.    if(
10ba0 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29   pPager->memDb )
10bb0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
10bc0 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 57  state = SQLITE_W
10bd0 52 49 54 45 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  RITELOCK;.      
10be0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
10bf0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
10c00 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ize;.    }else{.
10c10 20 20 20 20 20 20 69 6e 74 20 62 75 73 79 20 3d        int busy =
10c20 20 31 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   1;.      while(
10c30 20 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20   busy ){.       
10c40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
10c50 72 69 74 65 4c 6f 63 6b 28 26 70 50 61 67 65 72  riteLock(&pPager
10c60 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69  ->fd);.        i
10c70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
10c80 53 59 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  SY && .         
10c90 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79     pPager->pBusy
10ca0 48 61 6e 64 6c 65 72 20 26 26 20 0a 20 20 20 20  Handler && .    
10cb0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
10cc0 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46  pBusyHandler->xF
10cd0 75 6e 63 20 26 26 20 0a 20 20 20 20 20 20 20 20  unc && .        
10ce0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73      pPager->pBus
10cf0 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 28  yHandler->xFunc(
10d00 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
10d10 64 6c 65 72 2d 3e 70 41 72 67 2c 20 22 22 2c 20  dler->pArg, "", 
10d20 62 75 73 79 2b 2b 29 0a 20 20 20 20 20 20 20 20  busy++).        
10d30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
10d40 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
10d50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10d60 20 20 20 20 20 20 62 75 73 79 20 3d 20 30 3b 0a        busy = 0;.
10d70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10d80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10d90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
10da0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
10db0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
10dc0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 61 73      pPager->nMas
10dd0 74 65 72 20 3d 20 6e 4d 61 73 74 65 72 3b 0a 20  ter = nMaster;. 
10de0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
10df0 74 65 20 3d 20 53 51 4c 49 54 45 5f 57 52 49 54  te = SQLITE_WRIT
10e00 45 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 50 61  ELOCK;.      pPa
10e10 67 65 72 2d 3e 64 69 72 74 79 46 69 6c 65 20 3d  ger->dirtyFile =
10e20 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 31   0;.      TRACE1
10e30 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 5c 6e 22  ("TRANSACTION\n"
10e40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
10e50 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
10e60 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
10e70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  File ){.        
10e80 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f  rc = pager_open_
10e90 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  journal(pPager);
10ea0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10eb0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
10ec0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  }../*.** Mark a 
10ed0 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
10ee0 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67  teable.  The pag
10ef0 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
10f00 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a  o the journal .*
10f10 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  * if it is not t
10f20 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54  here already.  T
10f30 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
10f40 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
10f50 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e  e making.** chan
10f60 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a  ges to a page..*
10f70 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
10f80 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ime this routine
10f90 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
10fa0 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61 20  pager creates a 
10fb0 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  new.** journal a
10fc0 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 77 72  nd acquires a wr
10fd0 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
10fe0 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 74 68  database.  If th
10ff0 65 20 77 72 69 74 65 0a 2a 2a 20 6c 6f 63 6b 20  e write.** lock 
11000 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71  could not be acq
11010 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74  uired, this rout
11020 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
11030 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a  TE_BUSY.  The.**
11040 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
11050 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20   must check for 
11060 74 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75  that return valu
11070 65 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c  e and be careful
11080 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67   not to.** chang
11090 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20  e any page data 
110a0 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69  until this routi
110b0 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
110c0 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  E_OK..**.** If t
110d0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
110e0 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69  could not be wri
110f0 74 74 65 6e 20 62 65 63 61 75 73 65 20 74 68 65  tten because the
11100 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a   disk is full,.*
11110 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * then this rout
11120 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
11130 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73  TE_FULL and does
11140 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f   an immediate ro
11150 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73  llback..** All s
11160 75 62 73 65 71 75 65 6e 74 20 77 72 69 74 65 20  ubsequent write 
11170 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65  attempts also re
11180 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
11190 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20   until there.** 
111a0 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  is a call to sql
111b0 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74  ite3pager_commit
111c0 28 29 20 6f 72 20 73 71 6c 69 74 65 33 70 61 67  () or sqlite3pag
111d0 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 74 6f  er_rollback() to
111e0 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 69 6e  .** reset..*/.in
111f0 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  t sqlite3pager_w
11200 72 69 74 65 28 76 6f 69 64 20 2a 70 44 61 74 61  rite(void *pData
11210 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
11220 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
11230 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20  pData);.  Pager 
11240 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
11250 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
11260 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
11270 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72  /* Check for err
11280 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ors.  */.  if( p
11290 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 29  Pager->errMask )
112a0 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61  { .    return pa
112b0 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67  ger_errcode(pPag
112c0 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  er);.  }.  if( p
112d0 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
112e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
112f0 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a  LITE_PERM;.  }..
11300 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
11310 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66  ge as dirty.  If
11320 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c   the page has al
11330 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
11340 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a  en.  ** to the j
11350 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63  ournal then we c
11360 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20  an return right 
11370 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  away..  */.  pPg
11380 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 69  ->dirty = 1;.  i
11390 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  f( pPg->inJourna
113a0 6c 20 26 26 20 28 70 50 67 2d 3e 69 6e 53 74 6d  l && (pPg->inStm
113b0 74 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d  t || pPager->stm
113c0 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20  tInUse==0) ){.  
113d0 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 46    pPager->dirtyF
113e0 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  ile = 1;.    ret
113f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
11400 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67   }..  /* If we g
11410 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20  et this far, it 
11420 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
11430 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  age needs to be.
11440 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20    ** written to 
11450 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
11460 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63  journal or the c
11470 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  keckpoint journa
11480 6c 0a 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a  l.  ** or both..
11490 20 20 2a 2a 0a 20 20 2a 2a 20 46 69 72 73 74 20    **.  ** First 
114a0 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61  check to see tha
114b0 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
114c0 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  n journal exists
114d0 20 61 6e 64 0a 20 20 2a 2a 20 63 72 65 61 74 65   and.  ** create
114e0 20 69 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e   it if it does n
114f0 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ot..  */.  asser
11500 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
11510 21 3d 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20  !=SQLITE_UNLOCK 
11520 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
11530 33 70 61 67 65 72 5f 62 65 67 69 6e 28 70 44 61  3pager_begin(pDa
11540 74 61 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  ta, 0);.  if( rc
11550 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11560 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11570 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
11580 65 72 2d 3e 73 74 61 74 65 3d 3d 53 51 4c 49 54  er->state==SQLIT
11590 45 5f 57 52 49 54 45 4c 4f 43 4b 20 29 3b 0a 20  E_WRITELOCK );. 
115a0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
115b0 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61  urnalOpen && pPa
115c0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
115d0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
115e0 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
115f0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
11600 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
11610 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
11620 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11630 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20  >journalOpen || 
11640 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72  !pPager->useJour
11650 6e 61 6c 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  nal );.  pPager-
11660 3e 64 69 72 74 79 46 69 6c 65 20 3d 20 31 3b 0a  >dirtyFile = 1;.
11670 0a 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61  .  /* The transa
11680 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f  ction journal no
11690 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20  w exists and we 
116a0 68 61 76 65 20 61 20 77 72 69 74 65 20 6c 6f 63  have a write loc
116b0 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 6d 61  k on the.  ** ma
116c0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
116d0 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72  .  Write the cur
116e0 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65  rent page to the
116f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
11700 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74  ** journal if it
11710 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c   is not there al
11720 72 65 61 64 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ready..  */.  if
11730 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  ( !pPg->inJourna
11740 6c 20 26 26 20 28 70 50 61 67 65 72 2d 3e 75 73  l && (pPager->us
11750 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67  eJournal || pPag
11760 65 72 2d 3e 6d 65 6d 44 62 29 20 29 7b 0a 20 20  er->memDb) ){.  
11770 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e    if( (int)pPg->
11780 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
11790 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
117a0 20 20 20 20 69 6e 74 20 73 7a 50 67 3b 0a 20 20      int szPg;.  
117b0 20 20 20 20 75 33 32 20 73 61 76 65 64 3b 0a 20      u32 saved;. 
117c0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
117d0 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20  >memDb ){.      
117e0 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
117f0 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
11800 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
11810 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 32 28  .        TRACE2(
11820 22 4a 4f 55 52 4e 41 4c 20 25 64 5c 6e 22 2c 20  "JOURNAL %d\n", 
11830 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
11840 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73      assert( pHis
11850 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20  t->pOrig==0 );. 
11860 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 4f         pHist->pO
11870 72 69 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  rig = sqliteMall
11880 6f 63 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70  ocRaw( pPager->p
11890 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ageSize );.     
118a0 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f     if( pHist->pO
118b0 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rig ){.         
118c0 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70   memcpy(pHist->p
118d0 4f 72 69 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44  Orig, PGHDR_TO_D
118e0 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72  ATA(pPg), pPager
118f0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
11900 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
11910 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
11920 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
11930 20 20 20 20 20 20 20 20 69 66 28 20 6a 6f 75 72          if( jour
11940 6e 61 6c 5f 66 6f 72 6d 61 74 3e 3d 4a 4f 55 52  nal_format>=JOUR
11950 4e 41 4c 5f 46 4f 52 4d 41 54 5f 33 20 29 7b 0a  NAL_FORMAT_3 ){.
11960 20 20 20 20 20 20 20 20 20 20 75 33 32 20 63 6b            u32 ck
11970 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75  sum = pager_cksu
11980 6d 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  m(pPager, pPg->p
11990 67 6e 6f 2c 20 70 44 61 74 61 29 3b 0a 20 20 20  gno, pData);.   
119a0 20 20 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a         saved = *
119b0 28 75 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45  (u32*)PGHDR_TO_E
119c0 58 54 52 41 28 70 50 67 29 3b 0a 20 20 20 20 20  XTRA(pPg);.     
119d0 20 20 20 20 20 73 74 6f 72 65 33 32 62 69 74 73       store32bits
119e0 28 63 6b 73 75 6d 2c 20 70 50 67 2c 20 53 51 4c  (cksum, pPg, SQL
119f0 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
11a00 20 20 20 20 20 20 20 20 20 20 73 7a 50 67 20 3d            szPg =
11a10 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
11a20 45 2b 38 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  E+8;.        }el
11a30 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a  se{.          sz
11a40 50 67 20 3d 20 53 51 4c 49 54 45 5f 50 41 47 45  Pg = SQLITE_PAGE
11a50 5f 53 49 5a 45 2b 34 3b 0a 20 20 20 20 20 20 20  _SIZE+4;.       
11a60 20 7d 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65   }.        store
11a70 33 32 62 69 74 73 28 70 50 67 2d 3e 70 67 6e 6f  32bits(pPg->pgno
11a80 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20 20 20  , pPg, -4);.    
11a90 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72      CODEC(pPager
11aa0 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
11ab0 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20  no, 7);.        
11ac0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
11ad0 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ite(&pPager->jfd
11ae0 2c 20 26 28 28 63 68 61 72 2a 29 70 44 61 74 61  , &((char*)pData
11af0 29 5b 2d 34 5d 2c 20 73 7a 50 67 29 3b 0a 20 20  )[-4], szPg);.  
11b00 20 20 20 20 20 20 54 52 41 43 45 33 28 22 4a 4f        TRACE3("JO
11b10 55 52 4e 41 4c 20 25 64 20 25 64 5c 6e 22 2c 20  URNAL %d %d\n", 
11b20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e  pPg->pgno, pPg->
11b30 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20  needSync);.     
11b40 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
11b50 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
11b60 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  o, 0);.        i
11b70 66 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61  f( journal_forma
11b80 74 3e 3d 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41  t>=JOURNAL_FORMA
11b90 54 5f 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20  T_3 ){.         
11ba0 20 2a 28 75 33 32 2a 29 50 47 48 44 52 5f 54 4f   *(u32*)PGHDR_TO
11bb0 5f 45 58 54 52 41 28 70 50 67 29 20 3d 20 73 61  _EXTRA(pPg) = sa
11bc0 76 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ved;.        }. 
11bd0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
11be0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11bf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67        sqlite3pag
11c00 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
11c10 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  er);.          p
11c20 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c  Pager->errMask |
11c30 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  = PAGER_ERR_FULL
11c40 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
11c50 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
11c60 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
11c70 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRec++;.       
11c80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11c90 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >aInJournal!=0 )
11ca0 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
11cb0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67  ->aInJournal[pPg
11cc0 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
11cd0 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
11ce0 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64         pPg->need
11cf0 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e  Sync = !pPager->
11d00 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20  noSync;.        
11d10 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
11d20 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   1;.        if( 
11d30 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
11d40 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  e ){.          p
11d50 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70  Pager->aInStmt[p
11d60 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
11d70 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
11d80 0a 20 20 20 20 20 20 20 20 20 20 70 61 67 65 5f  .          page_
11d90 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
11da0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 7d  (pPg);.        }
11db0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
11dc0 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  se{.      pPg->n
11dd0 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
11de0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
11df0 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  d && !pPager->no
11e00 53 79 6e 63 3b 0a 20 20 20 20 20 20 54 52 41 43  Sync;.      TRAC
11e10 45 33 28 22 41 50 50 45 4e 44 20 25 64 20 25 64  E3("APPEND %d %d
11e20 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  \n", pPg->pgno, 
11e30 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a  pPg->needSync);.
11e40 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
11e50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  g->needSync ){. 
11e60 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65       pPager->nee
11e70 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 7d  dSync = 1;.    }
11e80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
11e90 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
11ea0 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  nal is open and 
11eb0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
11ec0 69 6e 20 69 74 2c 0a 20 20 2a 2a 20 74 68 65 6e  in it,.  ** then
11ed0 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
11ee0 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73  nt page to the s
11ef0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
11f00 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 2a  .  Note that.  *
11f10 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
11f20 6a 6f 75 72 6e 61 6c 20 61 6c 77 61 79 73 20 75  journal always u
11f30 73 65 73 20 74 68 65 20 73 69 6d 70 6c 69 65 72  ses the simplier
11f40 20 66 6f 72 6d 61 74 20 32 20 74 68 61 74 20 6c   format 2 that l
11f50 61 63 6b 73 0a 20 20 2a 2a 20 63 68 65 63 6b 73  acks.  ** checks
11f60 75 6d 73 2e 20 20 54 68 65 20 68 65 61 64 65 72  ums.  The header
11f70 20 69 73 20 61 6c 73 6f 20 6f 6d 69 74 74 65 64   is also omitted
11f80 20 66 72 6f 6d 20 74 68 65 20 73 74 61 74 65 6d   from the statem
11f90 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  ent journal..  *
11fa0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
11fb0 73 74 6d 74 49 6e 55 73 65 20 26 26 20 21 70 50  stmtInUse && !pP
11fc0 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28 69 6e  g->inStmt && (in
11fd0 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61  t)pPg->pgno<=pPa
11fe0 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 7b  ger->stmtSize ){
11ff0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
12000 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28  ->inJournal || (
12010 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50  int)pPg->pgno>pP
12020 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
12030 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
12040 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
12050 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
12060 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
12070 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
12080 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12090 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d 30 20  pHist->pStmt==0 
120a0 29 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e  );.      pHist->
120b0 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61  pStmt = sqliteMa
120c0 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72 2d  llocRaw( pPager-
120d0 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
120e0 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53     if( pHist->pS
120f0 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  tmt ){.        m
12100 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 53 74  emcpy(pHist->pSt
12110 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  mt, PGHDR_TO_DAT
12120 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
12130 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
12140 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 32 28   }.      TRACE2(
12150 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64  "STMT-JOURNAL %d
12160 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  \n", pPg->pgno);
12170 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12180 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 70 50    store32bits(pP
12190 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d 34  g->pgno, pPg, -4
121a0 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70  );.      CODEC(p
121b0 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
121c0 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20  g->pgno, 7);.   
121d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
121e0 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
121f0 73 74 66 64 2c 20 28 28 63 68 61 72 2a 29 70 44  stfd, ((char*)pD
12200 61 74 61 29 2d 34 2c 20 53 51 4c 49 54 45 5f 50  ata)-4, SQLITE_P
12210 41 47 45 5f 53 49 5a 45 2b 34 29 3b 0a 20 20 20  AGE_SIZE+4);.   
12220 20 20 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d     TRACE2("STMT-
12230 4a 4f 55 52 4e 41 4c 20 25 64 5c 6e 22 2c 20 70  JOURNAL %d\n", p
12240 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
12250 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70   CODEC(pPager, p
12260 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
12270 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
12280 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12290 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70          sqlite3p
122a0 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
122b0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70  ager);.        p
122c0 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c  Pager->errMask |
122d0 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  = PAGER_ERR_FULL
122e0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
122f0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
12300 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e     pPager->stmtN
12310 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73  Rec++;.      ass
12320 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
12330 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Stmt!=0 );.     
12340 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
12350 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
12360 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
12370 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67  );.    }.    pag
12380 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
12390 73 74 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20  st(pPg);.  }..  
123a0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61  /* Update the da
123b0 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20  tabase size and 
123c0 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69  return..  */.  i
123d0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
123e0 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  e<(int)pPg->pgno
123f0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
12400 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67  dbSize = pPg->pg
12410 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  no;.  }.  return
12420 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
12430 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
12440 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74   page given in t
12450 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  he argument was 
12460 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65  previously passe
12470 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 70  d.** to sqlite3p
12480 61 67 65 72 5f 77 72 69 74 65 28 29 2e 20 20 49  ager_write().  I
12490 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
124a0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74  eturn TRUE if it
124b0 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61   is ok.** to cha
124c0 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  nge the content 
124d0 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  of the page..*/.
124e0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
124f0 5f 69 73 77 72 69 74 65 61 62 6c 65 28 76 6f 69  _iswriteable(voi
12500 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
12510 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54  dr *pPg = DATA_T
12520 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
12530 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 64 69    return pPg->di
12540 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  rty;.}../*.** Re
12550 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e  place the conten
12560 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61  t of a single pa
12570 67 65 20 77 69 74 68 20 74 68 65 20 69 6e 66 6f  ge with the info
12580 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 74  rmation in the t
12590 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  hird.** argument
125a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
125b0 70 61 67 65 72 5f 6f 76 65 72 77 72 69 74 65 28  pager_overwrite(
125c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
125d0 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a  gno pgno, void *
125e0 70 44 61 74 61 29 7b 0a 20 20 76 6f 69 64 20 2a  pData){.  void *
125f0 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b  pPage;.  int rc;
12600 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
12610 70 61 67 65 72 5f 67 65 74 28 70 50 61 67 65 72  pager_get(pPager
12620 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b  , pgno, &pPage);
12630 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
12640 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
12650 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
12660 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ite(pPage);.    
12670 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
12680 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  K ){.      memcp
12690 79 28 70 50 61 67 65 2c 20 70 44 61 74 61 2c 20  y(pPage, pData, 
126a0 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
126b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
126c0 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
126d0 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pPage);.  }.  re
126e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
126f0 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
12700 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
12710 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74  he pager that it
12720 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
12730 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68  y to.** write th
12740 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  e information on
12750 20 70 61 67 65 20 22 70 67 6e 6f 22 20 62 61 63   page "pgno" bac
12760 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65  k to the disk, e
12770 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68  ven though.** th
12780 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  at page might be
12790 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
127a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72  ..**.** The over
127b0 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c  lying software l
127c0 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ayer calls this 
127d0 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c  routine when all
127e0 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20   of the data.** 
127f0 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
12800 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68  e is unused.  Th
12810 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68  e pager marks th
12820 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20  e page as clean 
12830 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f  so.** that it do
12840 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74  es not get writt
12850 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  en to disk..**.*
12860 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61  * Tests show tha
12870 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  t this optimizat
12880 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69  ion, together wi
12890 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  th the.** sqlite
128a0 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c  3pager_dont_roll
128b0 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f  back() below, mo
128c0 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74  re than double t
128d0 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c  he speed.** of l
128e0 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72  arge INSERT oper
128f0 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72  ations and quadr
12900 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f  uple the speed o
12910 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e  f large DELETEs.
12920 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
12930 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
12940 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61  ed, set the alwa
12950 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20  ysRollback flag 
12960 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73  to true..** Subs
12970 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
12980 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e  sqlite3pager_don
12990 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72  t_rollback() for
129a0 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a   the same page.*
129b0 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65  * will thereafte
129c0 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54  r be ignored.  T
129d0 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
129e0 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62   to avoid a prob
129f0 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70  lem.** where a p
12a00 61 67 65 20 77 69 74 68 20 64 61 74 61 20 69 73  age with data is
12a10 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
12a20 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e  eelist during on
12a30 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74  e part of.** a t
12a40 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20  ransaction then 
12a50 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
12a60 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67   freelist during
12a70 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a   a later part.**
12a80 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72 61   of the same tra
12a90 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75  nsaction and reu
12aa0 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  sed for some oth
12ab0 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65  er purpose.  Whe
12ac0 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74  n it.** is first
12ad0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
12ae0 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75  eelist, this rou
12af0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
12b00 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a   When reused,.**
12b10 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61   the dont_rollba
12b20 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20  ck() routine is 
12b30 63 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63  called.  But bec
12b40 61 75 73 65 20 74 68 65 20 70 61 67 65 20 63 6f  ause the page co
12b50 6e 74 61 69 6e 73 0a 2a 2a 20 63 72 69 74 69 63  ntains.** critic
12b60 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c  al data, we stil
12b70 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72  l need to be sur
12b80 65 20 69 74 20 67 65 74 73 20 72 6f 6c 6c 65 64  e it gets rolled
12b90 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65 0a 2a   back in spite.*
12ba0 2a 20 6f 66 20 74 68 65 20 64 6f 6e 74 5f 72 6f  * of the dont_ro
12bb0 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a  llback() call..*
12bc0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
12bd0 67 65 72 5f 64 6f 6e 74 5f 77 72 69 74 65 28 50  ger_dont_write(P
12be0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
12bf0 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
12c00 72 20 2a 70 50 67 3b 0a 0a 20 20 70 50 67 20 3d  r *pPg;..  pPg =
12c10 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
12c20 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 70  ager, pgno);.  p
12c30 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
12c40 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50  ck = 1;.  if( pP
12c50 67 20 26 26 20 70 50 67 2d 3e 64 69 72 74 79 20  g && pPg->dirty 
12c60 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
12c70 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29  r->dbSize==(int)
12c80 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61  pPg->pgno && pPa
12c90 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c  ger->origDbSize<
12ca0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
12cb0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
12cc0 69 73 20 70 61 67 65 73 20 69 73 20 74 68 65 20  is pages is the 
12cd0 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  last page in the
12ce0 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69   file and the fi
12cf0 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20 20  le has grown.   
12d00 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65     ** during the
12d10 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
12d20 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f  tion, then do NO
12d30 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  T mark the page 
12d40 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20  as clean..      
12d50 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74 61  ** When the data
12d60 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73 2c  base file grows,
12d70 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75   we must make su
12d80 72 65 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  re that the last
12d90 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 67   page.      ** g
12da0 65 74 73 20 77 72 69 74 74 65 6e 20 61 74 20 6c  ets written at l
12db0 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68 61  east once so tha
12dc0 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  t the disk file 
12dd0 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72 72  will be the corr
12de0 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a  ect.      ** siz
12df0 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74  e. If you do not
12e00 20 77 72 69 74 65 20 74 68 69 73 20 70 61 67 65   write this page
12e10 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
12e20 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20   the file.      
12e30 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 65  ** on the disk e
12e40 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f 6f  nds up being too
12e50 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e   small, that can
12e60 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
12e70 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 75  e.      ** corru
12e80 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68 65  ption during the
12e90 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f   next transactio
12ea0 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
12eb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52 41  }else{.      TRA
12ec0 43 45 32 28 22 44 4f 4e 54 5f 57 52 49 54 45 20  CE2("DONT_WRITE 
12ed0 25 64 5c 6e 22 2c 20 70 67 6e 6f 29 3b 0a 20 20  %d\n", pgno);.  
12ee0 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
12ef0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
12f00 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
12f10 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
12f20 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
12f30 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b  at if a rollback
12f40 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69   occurs,.** it i
12f50 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
12f60 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
12f70 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ata on the given
12f80 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20   page.  This.** 
12f90 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
12fa0 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61  ager does not ha
12fb0 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  ve to record the
12fc0 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74   given page in t
12fd0 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  he.** rollback j
12fe0 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20  ournal..*/.void 
12ff0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e  sqlite3pager_don
13000 74 5f 72 6f 6c 6c 62 61 63 6b 28 76 6f 69 64 20  t_rollback(void 
13010 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
13020 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
13030 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
13040 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
13050 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  pPg->pPager;..  
13060 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
13070 65 21 3d 53 51 4c 49 54 45 5f 57 52 49 54 45 4c  e!=SQLITE_WRITEL
13080 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  OCK || pPager->j
13090 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20  ournalOpen==0 ) 
130a0 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
130b0 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
130c0 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77  k || pPager->alw
130d0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70  aysRollback || p
130e0 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 20 72  Pager->memDb ) r
130f0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50  eturn;.  if( !pP
13100 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  g->inJournal && 
13110 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c  (int)pPg->pgno <
13120 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
13130 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Size ){.    asse
13140 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
13150 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20  ournal!=0 );.   
13160 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
13170 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  nal[pPg->pgno/8]
13180 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
13190 6f 26 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69  o&7);.    pPg->i
131a0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
131b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
131c0 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20  mtInUse ){.     
131d0 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
131e0 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
131f0 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
13200 29 3b 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64  );.      page_ad
13210 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
13220 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  Pg);.    }.    T
13230 52 41 43 45 32 28 22 44 4f 4e 54 5f 52 4f 4c 4c  RACE2("DONT_ROLL
13240 42 41 43 4b 20 25 64 5c 6e 22 2c 20 70 50 67 2d  BACK %d\n", pPg-
13250 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66  >pgno);.  }.  if
13260 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
13270 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 53  Use && !pPg->inS
13280 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d  tmt && (int)pPg-
13290 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73  >pgno<=pPager->s
132a0 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 61  tmtSize ){.    a
132b0 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f  ssert( pPg->inJo
132c0 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50  urnal || (int)pP
132d0 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
132e0 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20  origDbSize );.  
132f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
13300 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a  ->aInStmt!=0 );.
13310 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
13320 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  tmt[pPg->pgno/8]
13330 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
13340 6f 26 37 29 3b 0a 20 20 20 20 70 61 67 65 5f 61  o&7);.    page_a
13350 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
13360 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  pPg);.  }.}.../*
13370 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69  .** Clear a PgHi
13380 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73  story block.*/.s
13390 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72  tatic void clear
133a0 48 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72  History(PgHistor
133b0 79 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c  y *pHist){.  sql
133c0 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70  iteFree(pHist->p
133d0 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 46  Orig);.  sqliteF
133e0 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
133f0 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69  );.  pHist->pOri
13400 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e  g = 0;.  pHist->
13410 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  pStmt = 0;.}../*
13420 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63  .** Commit all c
13430 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
13440 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61  tabase and relea
13450 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
13460 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
13470 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72  commit fails for
13480 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72   any reason, a r
13490 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20  ollback attempt 
134a0 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61  is made.** and a
134b0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
134c0 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68  returned.  If th
134d0 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c  e commit worked,
134e0 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73   SQLITE_OK.** is
134f0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
13500 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63  t sqlite3pager_c
13510 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61  ommit(Pager *pPa
13520 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
13530 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
13540 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
13550 4d 61 73 6b 3d 3d 50 41 47 45 52 5f 45 52 52 5f  Mask==PAGER_ERR_
13560 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d  FULL ){.    rc =
13570 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
13580 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
13590 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
135a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
135b0 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
135c0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
135d0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
135e0 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21  pPager->errMask!
135f0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  =0 ){.    rc = p
13600 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61  ager_errcode(pPa
13610 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
13620 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   rc;.  }.  if( p
13630 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 53 51  Pager->state!=SQ
13640 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 29  LITE_WRITELOCK )
13650 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
13660 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
13670 20 54 52 41 43 45 31 28 22 43 4f 4d 4d 49 54 5c   TRACE1("COMMIT\
13680 6e 22 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  n");.  if( pPage
13690 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
136a0 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f  pPg = pager_get_
136b0 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28  all_dirty_pages(
136c0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 77 68 69  pPager);.    whi
136d0 6c 65 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20  le( pPg ){.     
136e0 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 47   clearHistory(PG
136f0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
13700 20 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20   pPager));.     
13710 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
13720 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
13730 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
13740 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pPg->inStmt = 0
13750 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72  ;.      pPg->pPr
13760 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e  evStmt = pPg->pN
13770 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  extStmt = 0;.   
13780 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 44     pPg = pPg->pD
13790 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  irty;.    }.    
137a0 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
137b0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
137c0 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 52 45  tate = SQLITE_RE
137d0 41 44 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75  ADLOCK;.    retu
137e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
137f0 7d 0a 23 69 66 20 30 0a 20 20 69 66 28 20 70 50  }.#if 0.  if( pP
13800 61 67 65 72 2d 3e 64 69 72 74 79 46 69 6c 65 3d  ager->dirtyFile=
13810 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 45 78 69  =0 ){.    /* Exi
13820 74 20 65 61 72 6c 79 20 28 77 69 74 68 6f 75 74  t early (without
13830 20 64 6f 69 6e 67 20 74 68 65 20 74 69 6d 65 2d   doing the time-
13840 63 6f 6e 73 75 6d 69 6e 67 20 73 71 6c 69 74 65  consuming sqlite
13850 33 4f 73 53 79 6e 63 28 29 20 63 61 6c 6c 73 29  3OsSync() calls)
13860 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 72 65  .    ** if there
13870 20 68 61 76 65 20 62 65 65 6e 20 6e 6f 20 63 68   have been no ch
13880 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
13890 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
138a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
138b0 72 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29  r->needSync==0 )
138c0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
138d0 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
138e0 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ger);.    pPager
138f0 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20  ->dbSize = -1;. 
13900 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
13910 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
13920 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
13930 29 3b 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f  );.  rc = syncJo
13940 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 30 29  urnal(pPager, 0)
13950 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
13960 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
13970 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a  o commit_abort;.
13980 20 20 7d 0a 20 20 70 50 67 20 3d 20 70 61 67 65    }.  pPg = page
13990 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
139a0 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20  pages(pPager);. 
139b0 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
139c0 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
139d0 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a  _pagelist(pPg);.
139e0 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20 28 21      if( rc || (!
139f0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26  pPager->noSync &
13a00 26 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  & sqlite3OsSync(
13a10 26 70 50 61 67 65 72 2d 3e 66 64 29 21 3d 53 51  &pPager->fd)!=SQ
13a20 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20  LITE_OK) ){.    
13a30 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62    goto commit_ab
13a40 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ort;.    }.  }.#
13a50 65 6e 64 69 66 0a 20 20 72 63 20 3d 20 73 71 6c  endif.  rc = sql
13a60 69 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28 70  ite3pager_sync(p
13a70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 69 66 28  Pager, 0);.  if(
13a80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13a90 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f   goto commit_abo
13aa0 72 74 3b 0a 0a 20 20 72 63 20 3d 20 70 61 67 65  rt;..  rc = page
13ab0 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50  r_unwritelock(pP
13ac0 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d  ager);.  pPager-
13ad0 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
13ae0 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
13af0 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 61 6e   Jump here if an
13b00 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
13b10 67 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d  g during the com
13b20 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a  mit process..  *
13b30 2f 0a 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3a 0a  /.commit_abort:.
13b40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
13b50 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
13b60 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ger);.  if( rc==
13b70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13b80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
13b90 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  L;.  }.  return 
13ba0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  rc;.}../*.** Rol
13bb0 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65  lback all change
13bc0 73 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65  s.  The database
13bd0 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 72   falls back to r
13be0 65 61 64 2d 6f 6e 6c 79 20 6d 6f 64 65 2e 0a 2a  ead-only mode..*
13bf0 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20  * All in-memory 
13c00 63 61 63 68 65 20 70 61 67 65 73 20 72 65 76 65  cache pages reve
13c10 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67  rt to their orig
13c20 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e  inal data conten
13c30 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ts..** The journ
13c40 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a  al is deleted..*
13c50 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13c60 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e  e cannot fail un
13c70 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20  less some other 
13c80 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66  process is not f
13c90 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20  ollowing.** the 
13ca0 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20  correct locking 
13cb0 70 72 6f 74 6f 63 6f 6c 20 28 53 51 4c 49 54 45  protocol (SQLITE
13cc0 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f 72 20 75 6e  _PROTOCOL) or un
13cd0 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a  less some other.
13ce0 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77 72  ** process is wr
13cf0 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f  iting trash into
13d00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
13d10 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  e (SQLITE_CORRUP
13d20 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20  T) or.** unless 
13d30 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29  a prior malloc()
13d40 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f   failed (SQLITE_
13d50 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72  NOMEM).  Appropr
13d60 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  iate error.** co
13d70 64 65 73 20 61 72 65 20 72 65 74 75 72 6e 65 64  des are returned
13d80 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f   for all these o
13d90 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72  ccasions.  Other
13da0 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  wise,.** SQLITE_
13db0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
13dc0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
13dd0 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67  ger_rollback(Pag
13de0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
13df0 6e 74 20 72 63 3b 0a 20 20 54 52 41 43 45 31 28  nt rc;.  TRACE1(
13e00 22 52 4f 4c 4c 42 41 43 4b 5c 6e 22 29 3b 0a 20  "ROLLBACK\n");. 
13e10 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d   if( pPager->mem
13e20 44 62 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  Db ){.    PgHdr 
13e30 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 50  *p;.    for(p=pP
13e40 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70  ager->pAll; p; p
13e50 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  =p->pNextAll){. 
13e60 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
13e70 70 48 69 73 74 3b 0a 20 20 20 20 20 20 69 66 28  pHist;.      if(
13e80 20 21 70 2d 3e 64 69 72 74 79 20 29 20 63 6f 6e   !p->dirty ) con
13e90 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 48 69  tinue;.      pHi
13ea0 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
13eb0 53 54 28 70 2c 20 70 50 61 67 65 72 29 3b 0a 20  ST(p, pPager);. 
13ec0 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e       if( pHist->
13ed0 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20  pOrig ){.       
13ee0 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f   memcpy(PGHDR_TO
13ef0 5f 44 41 54 41 28 70 29 2c 20 70 48 69 73 74 2d  _DATA(p), pHist-
13f00 3e 70 4f 72 69 67 2c 20 70 50 61 67 65 72 2d 3e  >pOrig, pPager->
13f10 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
13f20 20 20 20 54 52 41 43 45 32 28 22 52 4f 4c 4c 42     TRACE2("ROLLB
13f30 41 43 4b 2d 50 41 47 45 20 25 64 5c 6e 22 2c 20  ACK-PAGE %d\n", 
13f40 70 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  p->pgno);.      
13f50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 54  }else{.        T
13f60 52 41 43 45 32 28 22 50 41 47 45 20 25 64 20 69  RACE2("PAGE %d i
13f70 73 20 63 6c 65 61 6e 5c 6e 22 2c 20 70 2d 3e 70  s clean\n", p->p
13f80 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  gno);.      }.  
13f90 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79      clearHistory
13fa0 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70  (pHist);.      p
13fb0 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
13fc0 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20     p->inJournal 
13fd0 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e  = 0;.      p->in
13fe0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
13ff0 70 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  p->pPrevStmt = p
14000 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
14010 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
14020 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  r->pStmt = 0;.  
14030 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
14040 20 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44   = pPager->origD
14050 62 53 69 7a 65 3b 0a 20 20 20 20 6d 65 6d 6f 72  bSize;.    memor
14060 79 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  yTruncate(pPager
14070 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
14080 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20  tmtInUse = 0;.  
14090 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
140a0 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43  = SQLITE_READLOC
140b0 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  K;.    return SQ
140c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
140d0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64 69 72  if( !pPager->dir
140e0 74 79 46 69 6c 65 20 7c 7c 20 21 70 50 61 67 65  tyFile || !pPage
140f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
14100 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
14110 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
14120 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ger);.    pPager
14130 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20  ->dbSize = -1;. 
14140 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
14150 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  }..  if( pPager-
14160 3e 65 72 72 4d 61 73 6b 21 3d 30 20 26 26 20 70  >errMask!=0 && p
14170 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d  Pager->errMask!=
14180 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29  PAGER_ERR_FULL )
14190 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
141a0 2d 3e 73 74 61 74 65 3e 3d 53 51 4c 49 54 45 5f  ->state>=SQLITE_
141b0 57 52 49 54 45 4c 4f 43 4b 20 29 7b 0a 20 20 20  WRITELOCK ){.   
141c0 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63     pager_playbac
141d0 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  k(pPager, 1);.  
141e0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70    }.    return p
141f0 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61  ager_errcode(pPa
14200 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
14210 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 53  pPager->state!=S
14220 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20  QLITE_WRITELOCK 
14230 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
14240 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
14250 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
14260 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  ck(pPager, 1);. 
14270 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14280 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  OK ){.    rc = S
14290 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
142a0 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61     pPager->errMa
142b0 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f  sk |= PAGER_ERR_
142c0 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20 70  CORRUPT;.  }.  p
142d0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
142e0 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  -1;.  return rc;
142f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
14300 20 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74   TRUE if the dat
14310 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70  abase file is op
14320 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20  ened read-only. 
14330 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a   Return FALSE.**
14340 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
14350 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20   is (in theory) 
14360 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74  writable..*/.int
14370 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73   sqlite3pager_is
14380 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a  readonly(Pager *
14390 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
143a0 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  n pPager->readOn
143b0 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ly;.}../*.** Thi
143c0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
143d0 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
143e0 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
143f0 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33  .*/.int *sqlite3
14400 70 61 67 65 72 5f 73 74 61 74 73 28 50 61 67 65  pager_stats(Page
14410 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74  r *pPager){.  st
14420 61 74 69 63 20 69 6e 74 20 61 5b 39 5d 3b 0a 20  atic int a[9];. 
14430 20 61 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[0] = pPager->
14440 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70  nRef;.  a[1] = p
14450 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20  Pager->nPage;.  
14460 61 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d  a[2] = pPager->m
14470 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20  xPage;.  a[3] = 
14480 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
14490 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d    a[4] = pPager-
144a0 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d  >state;.  a[5] =
144b0 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
144c0 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65  ;.  a[6] = pPage
144d0 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20  r->nHit;.  a[7] 
144e0 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b  = pPager->nMiss;
144f0 0a 20 20 61 5b 38 5d 20 3d 20 70 50 61 67 65 72  .  a[8] = pPager
14500 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 72 65 74 75 72  ->nOvfl;.  retur
14510 6e 20 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n a;.}../*.** Se
14520 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
14530 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a  rollback point..
14540 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
14550 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  ne should be cal
14560 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 72 61  led with the tra
14570 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
14580 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e   already.** open
14590 2e 20 20 41 20 6e 65 77 20 73 74 61 74 65 6d 65  .  A new stateme
145a0 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72  nt journal is cr
145b0 65 61 74 65 64 20 74 68 61 74 20 63 61 6e 20 62  eated that can b
145c0 65 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61  e used to rollba
145d0 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66  ck.** changes of
145e0 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f   a single SQL co
145f0 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20 6c  mmand within a l
14600 61 72 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f  arger transactio
14610 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
14620 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67 69  3pager_stmt_begi
14630 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  n(Pager *pPager)
14640 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  {.  int rc;.  ch
14650 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f  ar zTemp[SQLITE_
14660 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a  TEMPNAME_SIZE];.
14670 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
14680 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a  r->stmtInUse );.
14690 20 20 54 52 41 43 45 31 28 22 53 54 4d 54 2d 42    TRACE1("STMT-B
146a0 45 47 49 4e 5c 6e 22 29 3b 0a 20 20 69 66 28 20  EGIN\n");.  if( 
146b0 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
146c0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
146d0 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 20 20  tInUse = 1;.    
146e0 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
146f0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
14700 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e;.    return SQ
14710 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
14720 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
14730 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70  nalOpen ){.    p
14740 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
14750 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  pen = 1;.    ret
14760 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
14770 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
14780 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
14790 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49   );.  pPager->aI
147a0 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61  nStmt = sqliteMa
147b0 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62  lloc( pPager->db
147c0 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20  Size/8 + 1 );.  
147d0 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  if( pPager->aInS
147e0 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  tmt==0 ){.    sq
147f0 6c 69 74 65 33 4f 73 52 65 61 64 4c 6f 63 6b 28  lite3OsReadLock(
14800 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  &pPager->fd);.  
14810 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14820 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64  NOMEM;.  }.#ifnd
14830 65 66 20 4e 44 45 42 55 47 0a 20 20 72 63 20 3d  ef NDEBUG.  rc =
14840 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
14850 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ze(&pPager->jfd,
14860 20 26 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53   &pPager->stmtJS
14870 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ize);.  if( rc )
14880 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e   goto stmt_begin
14890 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73 73 65 72  _failed;.  asser
148a0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  t( pPager->stmtJ
148b0 53 69 7a 65 20 3d 3d 20 0a 20 20 20 20 70 50 61  Size == .    pPa
148c0 67 65 72 2d 3e 6e 52 65 63 2a 4a 4f 55 52 4e 41  ger->nRec*JOURNA
148d0 4c 5f 50 47 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f  L_PG_SZ(journal_
148e0 66 6f 72 6d 61 74 29 20 2b 20 0a 20 20 20 20 4a  format) + .    J
148f0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
14900 61 67 65 72 2c 20 6a 6f 75 72 6e 61 6c 5f 66 6f  ager, journal_fo
14910 72 6d 61 74 29 20 29 3b 0a 23 65 6e 64 69 66 0a  rmat) );.#endif.
14920 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53    pPager->stmtJS
14930 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52  ize = pPager->nR
14940 65 63 2a 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ec*JOURNAL_PG_SZ
14950 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 29  (journal_format)
14960 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14970 20 20 20 20 20 20 20 20 20 20 2b 20 4a 4f 55 52            + JOUR
14980 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
14990 72 2c 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61  r, journal_forma
149a0 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  t);.  pPager->st
149b0 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  mtSize = pPager-
149c0 3e 64 62 53 69 7a 65 3b 0a 20 20 69 66 28 20 21  >dbSize;.  if( !
149d0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
149e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
149f0 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65  ite3pager_opente
14a00 6d 70 28 7a 54 65 6d 70 2c 20 26 70 50 61 67 65  mp(zTemp, &pPage
14a10 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 69 66  r->stfd);.    if
14a20 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74  ( rc ) goto stmt
14a30 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20  _begin_failed;. 
14a40 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f     pPager->stmtO
14a50 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  pen = 1;.    pPa
14a60 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20  ger->stmtNRec = 
14a70 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
14a80 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a  >stmtInUse = 1;.
14a90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14aa0 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e  OK;. .stmt_begin
14ab0 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70  _failed:.  if( p
14ac0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29  Pager->aInStmt )
14ad0 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
14ae0 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74  (pPager->aInStmt
14af0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
14b00 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  InStmt = 0;.  }.
14b10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
14b20 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73  /*.** Commit a s
14b30 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  tatement..*/.int
14b40 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
14b50 6d 74 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20  mt_commit(Pager 
14b60 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
14b70 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
14b80 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  e ){.    PgHdr *
14b90 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20  pPg, *pNext;.   
14ba0 20 54 52 41 43 45 31 28 22 53 54 4d 54 2d 43 4f   TRACE1("STMT-CO
14bb0 4d 4d 49 54 5c 6e 22 29 3b 0a 20 20 20 20 69 66  MMIT\n");.    if
14bc0 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  ( !pPager->memDb
14bd0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
14be0 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
14bf0 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 20  >stfd, 0);.     
14c00 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54 72 75   /* sqlite3OsTru
14c10 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e 73  ncate(&pPager->s
14c20 74 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20  tfd, 0); */.    
14c30 20 20 73 71 6c 69 74 65 46 72 65 65 28 20 70 50    sqliteFree( pP
14c40 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 3b  ager->aInStmt );
14c50 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
14c60 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  InStmt = 0;.    
14c70 7d 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  }.    for(pPg=pP
14c80 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67  ager->pStmt; pPg
14c90 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20  ; pPg=pNext){.  
14ca0 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d      pNext = pPg-
14cb0 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20 20  >pNextStmt;.    
14cc0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69    assert( pPg->i
14cd0 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70  nStmt );.      p
14ce0 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Pg->inStmt = 0;.
14cf0 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
14d00 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Stmt = pPg->pNex
14d10 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  tStmt = 0;.     
14d20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d   if( pPager->mem
14d30 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  Db ){.        Pg
14d40 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
14d50 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
14d60 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
14d70 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
14d80 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  pHist->pStmt);. 
14d90 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53         pHist->pS
14da0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  tmt = 0;.      }
14db0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
14dc0 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b  r->stmtNRec = 0;
14dd0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
14de0 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20  tInUse = 0;.    
14df0 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
14e00 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
14e10 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
14e20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  0;.  return SQLI
14e30 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
14e40 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65  Rollback a state
14e50 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
14e60 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 72  ite3pager_stmt_r
14e70 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
14e80 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
14e90 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
14ea0 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
14eb0 20 54 52 41 43 45 31 28 22 53 54 4d 54 2d 52 4f   TRACE1("STMT-RO
14ec0 4c 4c 42 41 43 4b 5c 6e 22 29 3b 0a 20 20 20 20  LLBACK\n");.    
14ed0 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  if( pPager->memD
14ee0 62 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  b ){.      PgHdr
14ef0 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 66 6f 72   *pPg;.      for
14f00 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74  (pPg=pPager->pSt
14f10 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  mt; pPg; pPg=pPg
14f20 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20  ->pNextStmt){.  
14f30 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
14f40 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
14f50 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
14f60 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
14f70 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b   pHist->pStmt ){
14f80 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
14f90 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
14fa0 70 50 67 29 2c 20 70 48 69 73 74 2d 3e 70 53 74  pPg), pHist->pSt
14fb0 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  mt, pPager->page
14fc0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Size);.         
14fd0 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73   sqliteFree(pHis
14fe0 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  t->pStmt);.     
14ff0 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
15000 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
15010 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
15020 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
15030 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
15040 3b 0a 20 20 20 20 20 20 6d 65 6d 6f 72 79 54 72  ;.      memoryTr
15050 75 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a  uncate(pPager);.
15060 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
15070 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
15080 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
15090 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28  r_stmt_playback(
150a0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
150b0 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
150c0 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67  stmt_commit(pPag
150d0 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
150e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
150f0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
15100 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30  stmtAutoopen = 0
15110 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
15120 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
15130 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
15140 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
15150 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
15160 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67  char *sqlite3pag
15170 65 72 5f 66 69 6c 65 6e 61 6d 65 28 50 61 67 65  er_filename(Page
15180 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
15190 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69  turn pPager->zFi
151a0 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
151b0 20 53 65 74 20 74 68 65 20 63 6f 64 65 63 20 66   Set the codec f
151c0 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f  or this pager.*/
151d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
151e0 65 72 5f 73 65 74 5f 63 6f 64 65 63 28 0a 20 20  er_set_codec(.  
151f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20  Pager *pPager,. 
15200 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 29 28   void (*xCodec)(
15210 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
15220 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70  ,int),.  void *p
15230 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50  CodecArg.){.  pP
15240 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78  ager->xCodec = x
15250 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d  Codec;.  pPager-
15260 3e 70 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f  >pCodecArg = pCo
15270 64 65 63 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  decArg;.}../*.**
15280 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   Sync the databa
15290 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
152a0 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d  pager pPager. zM
152b0 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20  aster points to 
152c0 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61  the name.** of a
152d0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
152e0 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64  file that should
152f0 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
15300 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a   the individual.
15310 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
15320 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20   zMaster may be 
15330 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69  NULL, which is i
15340 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f  nterpreted as no
15350 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
15360 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74  al (a single dat
15370 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
15380 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  n)..**.** This r
15390 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74  outine ensures t
153a0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
153b0 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64  is synced, all d
153c0 69 72 74 79 20 70 61 67 65 73 20 77 72 69 74 74  irty pages writt
153d0 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74  en.** to the dat
153e0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
153f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15400 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c   synced. The onl
15410 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20  y thing that.** 
15420 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69  remains to commi
15430 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
15440 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74  n is to delete t
15450 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
15460 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  (or.** master jo
15470 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70  urnal file if sp
15480 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20  ecified)..**.** 
15490 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61  Note that if zMa
154a0 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73  ster==NULL, this
154b0 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72   does not overwr
154c0 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20 76  ite a previous v
154d0 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74  alue.** passed t
154e0 6f 20 61 6e 20 73 71 6c 69 74 65 33 70 61 67 65  o an sqlite3page
154f0 72 5f 73 79 6e 63 28 29 20 63 61 6c 6c 2e 0a 2a  r_sync() call..*
15500 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
15510 65 72 5f 73 79 6e 63 28 50 61 67 65 72 20 2a 70  er_sync(Pager *p
15520 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
15530 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
15540 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
15550 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  K;..  /* If this
15560 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
15570 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73   db, or no pages
15580 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
15590 65 6e 20 74 6f 2c 20 74 68 69 73 0a 20 20 2a 2a  en to, this.  **
155a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
155b0 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
155c0 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
155d0 26 26 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79  && pPager->dirty
155e0 46 69 6c 65 20 29 7b 0a 20 20 20 20 50 67 48 64  File ){.    PgHd
155f0 72 20 2a 70 50 67 3b 0a 20 20 20 20 61 73 73 65  r *pPg;.    asse
15600 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
15610 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20  nalOpen );..    
15620 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  /* Sync the jour
15630 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  nal file */.    
15640 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
15650 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
15660 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
15670 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
15680 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 20 20 20 20  sync_exit;..    
15690 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72  /* Write all dir
156a0 74 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ty pages to the 
156b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
156c0 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72  .    pPg = pager
156d0 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70  _get_all_dirty_p
156e0 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20  ages(pPager);.  
156f0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
15700 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29  te_pagelist(pPg)
15710 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
15720 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
15730 79 6e 63 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f  ync_exit;..    /
15740 2a 20 49 66 20 61 6e 79 20 70 61 67 65 73 20 77  * If any pages w
15750 65 72 65 20 61 63 74 75 61 6c 6c 79 20 77 72 69  ere actually wri
15760 74 74 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 64  tten, sync the d
15770 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
15780 20 20 20 20 69 66 28 20 70 50 67 20 26 26 20 21      if( pPg && !
15790 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
157a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
157b0 69 74 65 33 4f 73 53 79 6e 63 28 26 70 50 61 67  ite3OsSync(&pPag
157c0 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 7d 0a 20  er->fd);.    }. 
157d0 20 7d 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20   }..sync_exit:. 
157e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
157f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
15800 54 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  T./*.** Print a 
15810 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72  listing of all r
15820 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20  eferenced pages 
15830 61 6e 64 20 74 68 65 69 72 20 72 65 66 20 63 6f  and their ref co
15840 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  unt..*/.void sql
15850 69 74 65 33 70 61 67 65 72 5f 72 65 66 64 75 6d  ite3pager_refdum
15860 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  p(Pager *pPager)
15870 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
15880 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
15890 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
158a0 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
158b0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  .    if( pPg->nR
158c0 65 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ef<=0 ) continue
158d0 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50 41  ;.    printf("PA
158e0 47 45 20 25 33 64 20 61 64 64 72 3d 30 78 25 30  GE %3d addr=0x%0
158f0 38 78 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a  8x nRef=%d\n", .
15900 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f         pPg->pgno
15910 2c 20 28 69 6e 74 29 50 47 48 44 52 5f 54 4f 5f  , (int)PGHDR_TO_
15920 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e  DATA(pPg), pPg->
15930 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  nRef);.  }.}.#en
15940 64 69 66 0a                                      dif.