/ Hex Artifact Content
Login

Artifact 048872f1ccd27e4c17d77098eb6e86990a7a9b88:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 31 30  : pager.c,v 1.10
0350: 39 20 32 30 30 34 2f 30 35 2f 33 31 20 30 38 3a  9 2004/05/31 08:
0360: 32 36 3a 34 39 20 64 61 6e 69 65 6c 6b 31 39 37  26:49 danielk197
0370: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c  7 Exp $.*/.#incl
0380: 75 64 65 20 22 6f 73 2e 68 22 20 20 20 20 20 20  ude "os.h"      
0390: 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 66 69     /* Must be fi
03a0: 72 73 74 20 74 6f 20 65 6e 61 62 6c 65 20 6c 61  rst to enable la
03b0: 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74  rge file support
03c0: 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71   */.#include "sq
03d0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c  liteInt.h".#incl
03e0: 75 64 65 20 22 70 61 67 65 72 2e 68 22 0a 23 69  ude "pager.h".#i
03f0: 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68  nclude <assert.h
0400: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69  >.#include <stri
0410: 6e 67 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63  ng.h>../*.** Mac
0420: 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65 73  ros for troubles
0430: 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61 6c  hooting.  Normal
0440: 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f  ly turned off.*/
0450: 0a 23 69 66 20 30 0a 73 74 61 74 69 63 20 50 61  .#if 0.static Pa
0460: 67 65 72 20 2a 6d 61 69 6e 50 61 67 65 72 20 3d  ger *mainPager =
0470: 20 30 3b 0a 23 64 65 66 69 6e 65 20 53 45 54 5f   0;.#define SET_
0480: 50 41 47 45 52 28 58 29 20 20 69 66 28 20 6d 61  PAGER(X)  if( ma
0490: 69 6e 50 61 67 65 72 3d 3d 30 20 29 20 6d 61 69  inPager==0 ) mai
04a0: 6e 50 61 67 65 72 20 3d 20 28 58 29 0a 23 64 65  nPager = (X).#de
04b0: 66 69 6e 65 20 43 4c 52 5f 50 41 47 45 52 28 58  fine CLR_PAGER(X
04c0: 29 20 20 69 66 28 20 6d 61 69 6e 50 61 67 65 72  )  if( mainPager
04d0: 3d 3d 28 58 29 20 29 20 6d 61 69 6e 50 61 67 65  ==(X) ) mainPage
04e0: 72 20 3d 20 30 0a 23 64 65 66 69 6e 65 20 54 52  r = 0.#define TR
04f0: 41 43 45 31 28 58 29 20 20 20 20 20 69 66 28 20  ACE1(X)     if( 
0500: 70 50 61 67 65 72 3d 3d 6d 61 69 6e 50 61 67 65  pPager==mainPage
0510: 72 20 29 20 66 70 72 69 6e 74 66 28 73 74 64 65  r ) fprintf(stde
0520: 72 72 2c 58 29 0a 23 64 65 66 69 6e 65 20 54 52  rr,X).#define TR
0530: 41 43 45 32 28 58 2c 59 29 20 20 20 69 66 28 20  ACE2(X,Y)   if( 
0540: 70 50 61 67 65 72 3d 3d 6d 61 69 6e 50 61 67 65  pPager==mainPage
0550: 72 20 29 20 66 70 72 69 6e 74 66 28 73 74 64 65  r ) fprintf(stde
0560: 72 72 2c 58 2c 59 29 0a 23 64 65 66 69 6e 65 20  rr,X,Y).#define 
0570: 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 20 69 66  TRACE3(X,Y,Z) if
0580: 28 20 70 50 61 67 65 72 3d 3d 6d 61 69 6e 50 61  ( pPager==mainPa
0590: 67 65 72 20 29 20 66 70 72 69 6e 74 66 28 73 74  ger ) fprintf(st
05a0: 64 65 72 72 2c 58 2c 59 2c 5a 29 0a 23 65 6c 73  derr,X,Y,Z).#els
05b0: 65 0a 23 64 65 66 69 6e 65 20 53 45 54 5f 50 41  e.#define SET_PA
05c0: 47 45 52 28 58 29 0a 23 64 65 66 69 6e 65 20 43  GER(X).#define C
05d0: 4c 52 5f 50 41 47 45 52 28 58 29 0a 23 64 65 66  LR_PAGER(X).#def
05e0: 69 6e 65 20 54 52 41 43 45 31 28 58 29 0a 23 64  ine TRACE1(X).#d
05f0: 65 66 69 6e 65 20 54 52 41 43 45 32 28 58 2c 59  efine TRACE2(X,Y
0600: 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 33  ).#define TRACE3
0610: 28 58 2c 59 2c 5a 29 0a 23 65 6e 64 69 66 0a 0a  (X,Y,Z).#endif..
0620: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ./*.** The page 
0630: 63 61 63 68 65 20 61 73 20 61 20 77 68 6f 6c 65  cache as a whole
0640: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e   is always in on
0650: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
0660: 6e 67 0a 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a  ng.** states:.**
0670: 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 55 4e 4c  .**   SQLITE_UNL
0680: 4f 43 4b 20 20 20 20 20 20 20 54 68 65 20 70 61  OCK       The pa
0690: 67 65 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ge cache is not 
06a0: 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e  currently readin
06b0: 67 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20  g or .**        
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
06d0: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
06e0: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 72 65  ase file.  There
06f0: 20 69 73 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20   is no.**       
0700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0710: 64 61 74 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d  data held in mem
0720: 6f 72 79 2e 20 20 54 68 69 73 20 69 73 20 74 68  ory.  This is th
0730: 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20  e initial.**    
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0750: 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20     state..**.** 
0760: 20 20 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43    SQLITE_READLOC
0770: 4b 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63  K     The page c
0780: 61 63 68 65 20 69 73 20 72 65 61 64 69 6e 67 20  ache is reading 
0790: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07b0: 20 20 20 20 20 20 20 57 72 69 74 69 6e 67 20 69         Writing i
07c0: 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e  s not permitted.
07d0: 20 20 54 68 65 72 65 20 63 61 6e 20 62 65 0a 2a    There can be.*
07e0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
07f0: 20 20 20 20 20 20 20 20 6d 75 6c 74 69 70 6c 65          multiple
0800: 20 72 65 61 64 65 72 73 20 61 63 63 65 73 73 69   readers accessi
0810: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
0820: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
0840: 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
0850: 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c  ime..**.**   SQL
0860: 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 20 20  ITE_WRITELOCK   
0870: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0880: 69 73 20 77 72 69 74 69 6e 67 20 74 68 65 20 64  is writing the d
0890: 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20  atabase..**     
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08b0: 20 20 41 63 63 65 73 73 20 69 73 20 65 78 63 6c    Access is excl
08c0: 75 73 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72  usive.  No other
08d0: 20 70 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a   processes or.**
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08f0: 20 20 20 20 20 20 20 74 68 72 65 61 64 73 20 63         threads c
0900: 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 6f 72  an be reading or
0910: 20 77 72 69 74 69 6e 67 20 77 68 69 6c 65 20 6f   writing while o
0920: 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ne.**           
0930: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63              proc
0940: 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 2e 0a  ess is writing..
0950: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63  **.** The page c
0960: 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69 6e  ache comes up in
0970: 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 2e 20   SQLITE_UNLOCK. 
0980: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
0990: 61 0a 2a 2a 20 73 71 6c 69 74 65 5f 70 61 67 65  a.** sqlite_page
09a0: 5f 67 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74  _get() occurs, t
09b0: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
09c0: 69 6f 6e 73 20 74 6f 20 53 51 4c 49 54 45 5f 52  ions to SQLITE_R
09d0: 45 41 44 4c 4f 43 4b 2e 0a 2a 2a 20 41 66 74 65  EADLOCK..** Afte
09e0: 72 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65  r all pages have
09f0: 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20 75   been released u
0a00: 73 69 6e 67 20 73 71 6c 69 74 65 5f 70 61 67 65  sing sqlite_page
0a10: 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65  _unref(),.** the
0a20: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
0a30: 6e 73 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54  ns back to SQLIT
0a40: 45 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66  E_UNLOCK.  The f
0a50: 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74 68 61  irst time.** tha
0a60: 74 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 77 72  t sqlite_page_wr
0a70: 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2c  ite() is called,
0a80: 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73   the state trans
0a90: 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20 53 51 4c  itions to.** SQL
0aa0: 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 2e 20 20  ITE_WRITELOCK.  
0ab0: 28 4e 6f 74 65 20 74 68 61 74 20 73 71 6c 69 74  (Note that sqlit
0ac0: 65 5f 70 61 67 65 5f 77 72 69 74 65 28 29 20 63  e_page_write() c
0ad0: 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63 61  an only be.** ca
0ae0: 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73 74  lled on an outst
0af0: 61 6e 64 69 6e 67 20 70 61 67 65 20 77 68 69 63  anding page whic
0b00: 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  h means that the
0b10: 20 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20 62   pager must.** b
0b20: 65 20 69 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  e in SQLITE_READ
0b30: 4c 4f 43 4b 20 62 65 66 6f 72 65 20 69 74 20 74  LOCK before it t
0b40: 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 53 51  ransitions to SQ
0b50: 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 2e 29  LITE_WRITELOCK.)
0b60: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 70  .** The sqlite_p
0b70: 61 67 65 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 61  age_rollback() a
0b80: 6e 64 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 63  nd sqlite_page_c
0b90: 6f 6d 6d 69 74 28 29 20 66 75 6e 63 74 69 6f 6e  ommit() function
0ba0: 73 20 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  s .** transition
0bb0: 20 74 68 65 20 73 74 61 74 65 20 66 72 6f 6d 20   the state from 
0bc0: 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b  SQLITE_WRITELOCK
0bd0: 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f   back to SQLITE_
0be0: 52 45 41 44 4c 4f 43 4b 2e 0a 2a 2f 0a 23 64 65  READLOCK..*/.#de
0bf0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e 4c 4f  fine SQLITE_UNLO
0c00: 43 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e  CK      0.#defin
0c10: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43  e SQLITE_READLOC
0c20: 4b 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20 53  K    1.#define S
0c30: 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20  QLITE_WRITELOCK 
0c40: 20 20 32 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68    2.../*.** Each
0c50: 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65   in-memory image
0c60: 20 6f 66 20 61 20 70 61 67 65 20 62 65 67 69 6e   of a page begin
0c70: 73 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  s with the follo
0c80: 77 69 6e 67 20 68 65 61 64 65 72 2e 0a 2a 2a 20  wing header..** 
0c90: 54 68 69 73 20 68 65 61 64 65 72 20 69 73 20 6f  This header is o
0ca0: 6e 6c 79 20 76 69 73 69 62 6c 65 20 74 6f 20 74  nly visible to t
0cb0: 68 69 73 20 70 61 67 65 72 20 6d 6f 64 75 6c 65  his pager module
0cc0: 2e 20 20 54 68 65 20 63 6c 69 65 6e 74 0a 2a 2a  .  The client.**
0cd0: 20 63 6f 64 65 20 74 68 61 74 20 63 61 6c 6c 73   code that calls
0ce0: 20 70 61 67 65 72 20 73 65 65 73 20 6f 6e 6c 79   pager sees only
0cf0: 20 74 68 65 20 64 61 74 61 20 74 68 61 74 20 66   the data that f
0d00: 6f 6c 6c 6f 77 73 20 74 68 65 20 68 65 61 64 65  ollows the heade
0d10: 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20  r..**.** Client 
0d20: 63 6f 64 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c  code should call
0d30: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
0d40: 69 74 65 28 29 20 6f 6e 20 61 20 70 61 67 65 20  ite() on a page 
0d50: 70 72 69 6f 72 20 74 6f 20 6d 61 6b 69 6e 67 0a  prior to making.
0d60: 2a 2a 20 61 6e 79 20 6d 6f 64 69 66 69 63 61 74  ** any modificat
0d70: 69 6f 6e 73 20 74 6f 20 74 68 61 74 20 70 61 67  ions to that pag
0d80: 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69  e.  The first ti
0d90: 6d 65 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  me sqlite3pager_
0da0: 77 72 69 74 65 28 29 0a 2a 2a 20 69 73 20 63 61  write().** is ca
0db0: 6c 6c 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e  lled, the origin
0dc0: 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  al page contents
0dd0: 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74   are written int
0de0: 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a  o the rollback.*
0df0: 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67  * journal and Pg
0e00: 48 64 72 2e 69 6e 4a 6f 75 72 6e 61 6c 20 61 6e  Hdr.inJournal an
0e10: 64 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  d PgHdr.needSync
0e20: 20 61 72 65 20 73 65 74 2e 20 20 4c 61 74 65 72   are set.  Later
0e30: 2c 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 6a 6f  , once.** the jo
0e40: 75 72 6e 61 6c 20 70 61 67 65 20 68 61 73 20 6d  urnal page has m
0e50: 61 64 65 20 69 74 20 6f 6e 74 6f 20 74 68 65 20  ade it onto the 
0e60: 64 69 73 6b 20 73 75 72 66 61 63 65 2c 20 50 67  disk surface, Pg
0e70: 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 2a 2a 20  Hdr.needSync.** 
0e80: 69 73 20 63 6c 65 61 72 65 64 2e 20 20 54 68 65  is cleared.  The
0e90: 20 6d 6f 64 69 66 69 65 64 20 70 61 67 65 20 63   modified page c
0ea0: 61 6e 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e  annot be written
0eb0: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6f   back into the o
0ec0: 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62  riginal.** datab
0ed0: 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74  ase file until t
0ee0: 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 73  he journal pages
0ef0: 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
0f00: 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 74 68 65   to disk and the
0f10: 0a 2a 2a 20 50 67 48 64 72 2e 6e 65 65 64 53 79  .** PgHdr.needSy
0f20: 6e 63 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61  nc has been clea
0f30: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  red..**.** The P
0f40: 67 48 64 72 2e 64 69 72 74 79 20 66 6c 61 67 20  gHdr.dirty flag 
0f50: 69 73 20 73 65 74 20 77 68 65 6e 20 73 71 6c 69  is set when sqli
0f60: 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29  te3pager_write()
0f70: 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 0a 2a   is called and.*
0f80: 2a 20 69 73 20 63 6c 65 61 72 65 64 20 61 67 61  * is cleared aga
0f90: 69 6e 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  in when the page
0fa0: 20 63 6f 6e 74 65 6e 74 20 69 73 20 77 72 69 74   content is writ
0fb0: 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ten back to the 
0fc0: 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61  original.** data
0fd0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 74 79  base file..*/.ty
0fe0: 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67 48  pedef struct PgH
0ff0: 64 72 20 50 67 48 64 72 3b 0a 73 74 72 75 63 74  dr PgHdr;.struct
1000: 20 50 67 48 64 72 20 7b 0a 20 20 50 61 67 65 72   PgHdr {.  Pager
1010: 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20   *pPager;       
1020: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1030: 20 70 61 67 65 72 20 74 6f 20 77 68 69 63 68 20   pager to which 
1040: 74 68 69 73 20 70 61 67 65 20 62 65 6c 6f 6e 67  this page belong
1050: 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  s */.  Pgno pgno
1060: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1070: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
1080: 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69  e number for thi
1090: 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64  s page */.  PgHd
10a0: 72 20 2a 70 4e 65 78 74 48 61 73 68 2c 20 2a 70  r *pNextHash, *p
10b0: 50 72 65 76 48 61 73 68 3b 20 20 2f 2a 20 48 61  PrevHash;  /* Ha
10c0: 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61  sh collision cha
10d0: 69 6e 20 66 6f 72 20 50 67 48 64 72 2e 70 67 6e  in for PgHdr.pgn
10e0: 6f 20 2a 2f 0a 20 20 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 7d 3b 0a 0a 2f 2a   PgHdr */.};../*
2710: 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 62 69  .** These are bi
2720: 74 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 73  ts that can be s
2730: 65 74 20 69 6e 20 50 61 67 65 72 2e 65 72 72 4d  et in Pager.errM
2740: 61 73 6b 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ask..*/.#define 
2750: 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 20  PAGER_ERR_FULL  
2760: 20 20 20 30 78 30 31 20 20 2f 2a 20 61 20 77 72     0x01  /* a wr
2770: 69 74 65 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a  ite() failed */.
2780: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52  #define PAGER_ER
2790: 52 5f 4d 45 4d 20 20 20 20 20 20 30 78 30 32 20  R_MEM      0x02 
27a0: 20 2f 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   /* malloc() fai
27b0: 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  led */.#define P
27c0: 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 20 20  AGER_ERR_LOCK   
27d0: 20 20 30 78 30 34 20 20 2f 2a 20 65 72 72 6f 72    0x04  /* error
27e0: 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
27f0: 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 23 64 65 66  protocol */.#def
2800: 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 43 4f  ine PAGER_ERR_CO
2810: 52 52 55 50 54 20 20 30 78 30 38 20 20 2f 2a 20  RRUPT  0x08  /* 
2820: 64 61 74 61 62 61 73 65 20 6f 72 20 6a 6f 75 72  database or jour
2830: 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a  nal corruption *
2840: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
2850: 45 52 52 5f 44 49 53 4b 20 20 20 20 20 30 78 31  ERR_DISK     0x1
2860: 30 20 20 2f 2a 20 67 65 6e 65 72 61 6c 20 64 69  0  /* general di
2870: 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 2d 20 62  sk I/O error - b
2880: 61 64 20 68 61 72 64 20 64 72 69 76 65 3f 20 2a  ad hard drive? *
2890: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  /../*.** The jou
28a0: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
28b0: 6e 73 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  ns page records 
28c0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
28d0: 0a 2a 2a 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  .** format..**.*
28e0: 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 69 73  * Actually, this
28f0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 74 68   structure is th
2900: 65 20 63 6f 6d 70 6c 65 74 65 20 70 61 67 65 20  e complete page 
2910: 72 65 63 6f 72 64 20 66 6f 72 20 70 61 67 65 72  record for pager
2920: 0a 2a 2a 20 66 6f 72 6d 61 74 73 20 6c 65 73 73  .** formats less
2930: 20 74 68 61 6e 20 33 2e 20 20 42 65 67 69 6e 6e   than 3.  Beginn
2940: 69 6e 67 20 77 69 74 68 20 66 6f 72 6d 61 74 20  ing with format 
2950: 33 2c 20 74 68 69 73 20 72 65 63 6f 72 64 20 69  3, this record i
2960: 73 20 73 75 72 72 6f 75 6e 64 65 64 0a 2a 2a 20  s surrounded.** 
2970: 62 79 20 74 77 6f 20 63 68 65 63 6b 73 75 6d 73  by two checksums
2980: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
2990: 75 63 74 20 50 61 67 65 52 65 63 6f 72 64 20 50  uct PageRecord P
29a0: 61 67 65 52 65 63 6f 72 64 3b 0a 73 74 72 75 63  ageRecord;.struc
29b0: 74 20 50 61 67 65 52 65 63 6f 72 64 20 7b 0a 20  t PageRecord {. 
29c0: 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e0: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d   /* The page num
29f0: 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 61 44  ber */.  char aD
2a00: 61 74 61 5b 53 51 4c 49 54 45 5f 50 41 47 45 5f  ata[SQLITE_PAGE_
2a10: 53 49 5a 45 5d 3b 20 20 20 2f 2a 20 4f 72 69 67  SIZE];   /* Orig
2a20: 69 6e 61 6c 20 64 61 74 61 20 66 6f 72 20 70 61  inal data for pa
2a30: 67 65 20 70 67 6e 6f 20 2a 2f 0a 7d 3b 0a 0a 2f  ge pgno */.};../
2a40: 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c  *.** Journal fil
2a50: 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68  es begin with th
2a60: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69  e following magi
2a70: 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64  c string.  The d
2a80: 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69  ata.** was obtai
2a90: 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61  ned from /dev/ra
2aa0: 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65  ndom.  It is use
2ab0: 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69  d only as a sani
2ac0: 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ty check..**.** 
2ad0: 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
2ae0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 73 20  journal formats 
2af0: 28 73 6f 20 66 61 72 29 2e 20 54 68 65 20 31 73  (so far). The 1s
2b00: 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  t journal format
2b10: 20 77 72 69 74 65 73 0a 2a 2a 20 33 32 2d 62 69   writes.** 32-bi
2b20: 74 20 69 6e 74 65 67 65 72 73 20 69 6e 20 74 68  t integers in th
2b30: 65 20 62 79 74 65 2d 6f 72 64 65 72 20 6f 66 20  e byte-order of 
2b40: 74 68 65 20 68 6f 73 74 20 6d 61 63 68 69 6e 65  the host machine
2b50: 2e 20 20 4e 65 77 0a 2a 2a 20 66 6f 72 6d 61 74  .  New.** format
2b60: 73 20 77 72 69 74 65 73 20 69 6e 74 65 67 65 72  s writes integer
2b70: 73 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e  s as big-endian.
2b80: 20 20 41 6c 6c 20 6e 65 77 20 6a 6f 75 72 6e 61    All new journa
2b90: 6c 73 20 75 73 65 20 74 68 65 0a 2a 2a 20 6e 65  ls use the.** ne
2ba0: 77 20 66 6f 72 6d 61 74 2c 20 62 75 74 20 77 65  w format, but we
2bb0: 20 68 61 76 65 20 74 6f 20 62 65 20 61 62 6c 65   have to be able
2bc0: 20 74 6f 20 72 65 61 64 20 61 6e 20 6f 6c 64 65   to read an olde
2bd0: 72 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6f 72 64  r journal in ord
2be0: 65 72 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 62 61 63  er.** to rollbac
2bf0: 6b 20 6a 6f 75 72 6e 61 6c 73 20 63 72 65 61 74  k journals creat
2c00: 65 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73  ed by older vers
2c10: 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 69 62 72  ions of the libr
2c20: 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 33  ary..**.** The 3
2c30: 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  rd journal forma
2c40: 74 20 28 61 64 64 65 64 20 66 6f 72 20 32 2e 38  t (added for 2.8
2c50: 2e 30 29 20 61 64 64 73 20 61 64 64 69 74 69 6f  .0) adds additio
2c60: 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68  nal sanity.** ch
2c70: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
2c80: 6f 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  on to the journa
2c90: 6c 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72  l.  If the power
2ca0: 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65   fails while the
2cb0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  .** journal is b
2cc0: 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 73 65  eing written, se
2cd0: 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67  mi-random garbag
2ce0: 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70  e data might app
2cf0: 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6a 6f  ear in.** the jo
2d00: 75 72 6e 61 6c 20 66 69 6c 65 20 61 66 74 65 72  urnal file after
2d10: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
2d20: 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d  ed.  If an attem
2d30: 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a  pt is then made.
2d40: 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a  ** to roll the j
2d50: 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65  ournal back, the
2d60: 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20   database could 
2d70: 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54  be corrupted.  T
2d80: 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a  he additional.**
2d90: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
2da0: 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65   data is an atte
2db0: 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20  mpt to discover 
2dc0: 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74  the garbage in t
2dd0: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  he.** journal an
2de0: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a  d ignore it..**.
2df0: 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68  ** The sanity ch
2e00: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
2e10: 6f 6e 20 66 6f 72 20 74 68 65 20 33 72 64 20 6a  on for the 3rd j
2e20: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
2e30: 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33  nsists.** of a 3
2e40: 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f  2-bit checksum o
2e50: 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64  n each page of d
2e60: 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73  ata.  The checks
2e70: 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a  um covers both.*
2e80: 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * the page numbe
2e90: 72 20 61 6e 64 20 74 68 65 20 53 51 4c 49 54 45  r and the SQLITE
2ea0: 5f 50 41 47 45 5f 53 49 5a 45 20 62 79 74 65 73  _PAGE_SIZE bytes
2eb0: 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65   of data for the
2ec0: 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63   page..** This c
2ed0: 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  ksum is initiali
2ee0: 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20  zed to a 32-bit 
2ef0: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61  random value tha
2f00: 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  t appears in the
2f10: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
2f20: 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65   right after the
2f30: 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61   header.  The ra
2f40: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72  ndom initializer
2f50: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a   is important,.*
2f60: 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67  * because garbag
2f70: 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65  e data that appe
2f80: 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ars at the end o
2f90: 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  f a journal is l
2fa0: 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68  ikely.** data th
2fb0: 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f  at was once in o
2fc0: 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20  ther files that 
2fd0: 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65  have now been de
2fe0: 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a  leted.  If the.*
2ff0: 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63  * garbage data c
3000: 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f  ame from an obso
3010: 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  lete journal fil
3020: 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  e, the checksums
3030: 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72   might.** be cor
3040: 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e  rect.  But by in
3050: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63  itializing the c
3060: 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f  hecksum to rando
3070: 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a  m value which.**
3080: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f   is different fo
3090: 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c  r every journal,
30a0: 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61   we minimize tha
30b0: 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  t risk..*/.stati
30c0: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
30d0: 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61   char aJournalMa
30e0: 67 69 63 31 5b 5d 20 3d 20 7b 0a 20 20 30 78 64  gic1[] = {.  0xd
30f0: 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30  9, 0xd5, 0x05, 0
3100: 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c  xf9, 0x20, 0xa1,
3110: 20 30 78 36 33 2c 20 30 78 64 34 2c 0a 7d 3b 0a   0x63, 0xd4,.};.
3120: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
3130: 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72  igned char aJour
3140: 6e 61 6c 4d 61 67 69 63 32 5b 5d 20 3d 20 7b 0a  nalMagic2[] = {.
3150: 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78    0xd9, 0xd5, 0x
3160: 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20  05, 0xf9, 0x20, 
3170: 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 35  0xa1, 0x63, 0xd5
3180: 2c 0a 7d 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73  ,.};.static cons
3190: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
31a0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 33 5b 5d  aJournalMagic3[]
31b0: 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64   = {.  0xd9, 0xd
31c0: 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30  5, 0x05, 0xf9, 0
31d0: 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c  x20, 0xa1, 0x63,
31e0: 20 30 78 64 36 2c 0a 7d 3b 0a 23 64 65 66 69 6e   0xd6,.};.#defin
31f0: 65 20 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54  e JOURNAL_FORMAT
3200: 5f 31 20 31 0a 23 64 65 66 69 6e 65 20 4a 4f 55  _1 1.#define JOU
3210: 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 32 20 32 0a  RNAL_FORMAT_2 2.
3220: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
3230: 46 4f 52 4d 41 54 5f 33 20 33 0a 0a 2f 2a 0a 2a  FORMAT_3 3../*.*
3240: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
3250: 69 6e 74 65 67 65 72 20 64 65 74 65 72 6d 69 6e  integer determin
3260: 65 73 20 77 68 61 74 20 66 6f 72 6d 61 74 20 74  es what format t
3270: 6f 20 75 73 65 20 77 68 65 6e 20 63 72 65 61 74  o use when creat
3280: 69 6e 67 0a 2a 2a 20 6e 65 77 20 70 72 69 6d 61  ing.** new prima
3290: 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ry journal files
32a0: 2e 20 20 42 79 20 64 65 66 61 75 6c 74 20 77 65  .  By default we
32b0: 20 61 6c 77 61 79 73 20 75 73 65 20 66 6f 72 6d   always use form
32c0: 61 74 20 33 2e 0a 2a 2a 20 57 68 65 6e 20 74 65  at 3..** When te
32d0: 73 74 69 6e 67 2c 20 77 65 20 63 61 6e 20 73 65  sting, we can se
32e0: 74 20 74 68 69 73 20 76 61 6c 75 65 20 74 6f 20  t this value to 
32f0: 6f 6c 64 65 72 20 6a 6f 75 72 6e 61 6c 20 66 6f  older journal fo
3300: 72 6d 61 74 73 20 69 6e 20 6f 72 64 65 72 20 74  rmats in order t
3310: 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75 72 65 20 74  o.** make sure t
3320: 68 61 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f  hat newer versio
3330: 6e 73 20 6f 66 20 74 68 65 20 6c 69 62 72 61 72  ns of the librar
3340: 79 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f  y are able to ro
3350: 6c 6c 62 61 63 6b 20 6f 6c 64 65 72 0a 2a 2a 20  llback older.** 
3360: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
3370: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 73  *.** Note that s
3380: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
3390: 73 20 61 6c 77 61 79 73 20 75 73 65 20 66 6f 72  s always use for
33a0: 6d 61 74 20 32 20 61 6e 64 20 6f 6d 69 74 20 74  mat 2 and omit t
33b0: 68 65 20 68 65 61 64 65 72 2e 0a 2a 2f 0a 23 69  he header..*/.#i
33c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
33d0: 0a 69 6e 74 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72  .int journal_for
33e0: 6d 61 74 20 3d 20 33 3b 0a 23 65 6c 73 65 0a 23  mat = 3;.#else.#
33f0: 20 64 65 66 69 6e 65 20 6a 6f 75 72 6e 61 6c 5f   define journal_
3400: 66 6f 72 6d 61 74 20 33 0a 23 65 6e 64 69 66 0a  format 3.#endif.
3410: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20  ./*.** The size 
3420: 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 61 6e  of the header an
3430: 64 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 69  d of each page i
3440: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 76 61  n the journal va
3450: 72 69 65 73 20 61 63 63 6f 72 64 69 6e 67 0a 2a  ries according.*
3460: 2a 20 74 6f 20 77 68 69 63 68 20 6a 6f 75 72 6e  * to which journ
3470: 61 6c 20 66 6f 72 6d 61 74 20 69 73 20 62 65 69  al format is bei
3480: 6e 67 20 75 73 65 64 2e 20 20 54 68 65 20 66 6f  ng used.  The fo
3490: 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 20 66  llowing macros f
34a0: 69 67 75 72 65 20 6f 75 74 0a 2a 2a 20 74 68 65  igure out.** the
34b0: 20 73 69 7a 65 73 20 62 61 73 65 64 20 6f 6e 20   sizes based on 
34c0: 66 6f 72 6d 61 74 20 6e 75 6d 62 65 72 73 2e 0a  format numbers..
34d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
34e0: 41 4c 5f 48 44 52 5f 53 5a 28 58 29 20 5c 0a 20  AL_HDR_SZ(X) \. 
34f0: 20 20 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e    (sizeof(aJourn
3500: 61 6c 4d 61 67 69 63 31 29 20 2b 20 73 69 7a 65  alMagic1) + size
3510: 6f 66 28 50 67 6e 6f 29 20 2b 20 28 28 58 29 3e  of(Pgno) + ((X)>
3520: 3d 33 29 2a 32 2a 73 69 7a 65 6f 66 28 75 33 32  =3)*2*sizeof(u32
3530: 29 29 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  )).#define JOURN
3540: 41 4c 5f 50 47 5f 53 5a 28 58 29 20 5c 0a 20 20  AL_PG_SZ(X) \.  
3550: 20 28 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49   (SQLITE_PAGE_SI
3560: 5a 45 20 2b 20 73 69 7a 65 6f 66 28 50 67 6e 6f  ZE + sizeof(Pgno
3570: 29 20 2b 20 28 28 58 29 3e 3d 33 29 2a 73 69 7a  ) + ((X)>=3)*siz
3580: 65 6f 66 28 75 33 32 29 29 0a 0a 2f 2a 0a 2a 2a  eof(u32))../*.**
3590: 20 45 6e 61 62 6c 65 20 72 65 66 65 72 65 6e 63   Enable referenc
35a0: 65 20 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67  e count tracking
35b0: 20 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66   here:.*/.#ifdef
35c0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
35d0: 6e 74 20 70 61 67 65 72 33 5f 72 65 66 69 6e 66  nt pager3_refinf
35e0: 6f 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20 20  o_enable = 0;.  
35f0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
3600: 72 5f 72 65 66 69 6e 66 6f 28 50 67 48 64 72 20  r_refinfo(PgHdr 
3610: 2a 70 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  *p){.    static 
3620: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
3630: 20 69 66 28 20 21 70 61 67 65 72 33 5f 72 65 66   if( !pager3_ref
3640: 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72 65  info_enable ) re
3650: 74 75 72 6e 3b 0a 20 20 20 20 70 72 69 6e 74 66  turn;.    printf
3660: 28 0a 20 20 20 20 20 20 20 22 52 45 46 43 4e 54  (.       "REFCNT
3670: 3a 20 25 34 64 20 61 64 64 72 3d 30 78 25 30 38  : %4d addr=0x%08
3680: 78 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 0a 20 20  x nRef=%d\n",.  
3690: 20 20 20 20 20 70 2d 3e 70 67 6e 6f 2c 20 28 69       p->pgno, (i
36a0: 6e 74 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  nt)PGHDR_TO_DATA
36b0: 28 70 29 2c 20 70 2d 3e 6e 52 65 66 0a 20 20 20  (p), p->nRef.   
36c0: 20 29 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 20 20   );.    cnt++;  
36d0: 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67 20 74 6f   /* Something to
36e0: 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e   set a breakpoin
36f0: 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64 65  t on */.  }.# de
3700: 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 20  fine REFINFO(X) 
3710: 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 58   pager_refinfo(X
3720: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
3730: 20 52 45 46 49 4e 46 4f 28 58 29 0a 23 65 6e 64   REFINFO(X).#end
3740: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  if../*.** Read a
3750: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
3760: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66  from the given f
3770: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
3780: 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67   Store the integ
3790: 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65  er.** that is re
37a0: 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65  ad in *pRes.  Re
37b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
37c0: 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
37d0: 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72  ked, or an.** er
37e0: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
37f0: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
3800: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
3810: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 69 73  ournal format is
3820: 20 32 20 6f 72 20 33 2c 20 72 65 61 64 20 61 20   2 or 3, read a 
3830: 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
3840: 65 72 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 6a  er.  If the.** j
3850: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 69 73  ournal format is
3860: 20 31 2c 20 72 65 61 64 20 61 6e 20 69 6e 74 65   1, read an inte
3870: 67 65 72 20 69 6e 20 74 68 65 20 6e 61 74 69 76  ger in the nativ
3880: 65 20 62 79 74 65 2d 6f 72 64 65 72 20 6f 66 20  e byte-order of 
3890: 74 68 65 0a 2a 2a 20 68 6f 73 74 20 6d 61 63 68  the.** host mach
38a0: 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ine..*/.static i
38b0: 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 69 6e  nt read32bits(in
38c0: 74 20 66 6f 72 6d 61 74 2c 20 4f 73 46 69 6c 65  t format, OsFile
38d0: 20 2a 66 64 2c 20 75 33 32 20 2a 70 52 65 73 29   *fd, u32 *pRes)
38e0: 7b 0a 20 20 75 33 32 20 72 65 73 3b 0a 20 20 69  {.  u32 res;.  i
38f0: 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  nt rc;.  rc = sq
3900: 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20  lite3OsRead(fd, 
3910: 26 72 65 73 2c 20 73 69 7a 65 6f 66 28 72 65 73  &res, sizeof(res
3920: 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ));.  if( rc==SQ
3930: 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 72 6d 61  LITE_OK && forma
3940: 74 3e 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54  t>JOURNAL_FORMAT
3950: 5f 31 20 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e  _1 ){.    unsign
3960: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
3970: 20 20 20 6d 65 6d 63 70 79 28 61 63 2c 20 26 72     memcpy(ac, &r
3980: 65 73 2c 20 34 29 3b 0a 20 20 20 20 72 65 73 20  es, 4);.    res 
3990: 3d 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20  = (ac[0]<<24) | 
39a0: 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61  (ac[1]<<16) | (a
39b0: 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d  c[2]<<8) | ac[3]
39c0: 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20  ;.  }.  *pRes = 
39d0: 72 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  res;.  return rc
39e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
39f0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
3a00: 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e  r into the given
3a10: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
3a20: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
3a30: 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
3a40: 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
3a50: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
3a60: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a  goes wrong..**.*
3a70: 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
3a80: 20 66 6f 72 6d 61 74 20 69 73 20 32 20 6f 72 20   format is 2 or 
3a90: 33 2c 20 77 72 69 74 65 20 74 68 65 20 69 6e 74  3, write the int
3aa0: 65 67 65 72 20 61 73 20 34 20 62 69 67 2d 65 6e  eger as 4 big-en
3ab0: 64 69 61 6e 0a 2a 2a 20 62 79 74 65 73 2e 20 20  dian.** bytes.  
3ac0: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
3ad0: 6f 72 6d 61 74 20 69 73 20 31 2c 20 77 72 69 74  ormat is 1, writ
3ae0: 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 69 6e  e the integer in
3af0: 20 74 68 65 20 6e 61 74 69 76 65 0a 2a 2a 20 62   the native.** b
3b00: 79 74 65 20 6f 72 64 65 72 2e 20 20 49 6e 20 6e  yte order.  In n
3b10: 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 2c  ormal operation,
3b20: 20 6f 6e 6c 79 20 66 6f 72 6d 61 74 73 20 32 20   only formats 2 
3b30: 61 6e 64 20 33 20 61 72 65 20 75 73 65 64 2e 0a  and 3 are used..
3b40: 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ** Journal forma
3b50: 74 20 31 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  t 1 is only used
3b60: 20 66 6f 72 20 74 65 73 74 69 6e 67 2e 0a 2a 2f   for testing..*/
3b70: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
3b80: 65 33 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a  e32bits(OsFile *
3b90: 66 64 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20  fd, u32 val){.  
3ba0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63  unsigned char ac
3bb0: 5b 34 5d 3b 0a 20 20 69 66 28 20 6a 6f 75 72 6e  [4];.  if( journ
3bc0: 61 6c 5f 66 6f 72 6d 61 74 3c 3d 31 20 29 7b 0a  al_format<=1 ){.
3bd0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
3be0: 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 26 76  e3OsWrite(fd, &v
3bf0: 61 6c 2c 20 34 29 3b 0a 20 20 7d 0a 20 20 61 63  al, 4);.  }.  ac
3c00: 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34 29 20  [0] = (val>>24) 
3c10: 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 31 5d 20  & 0xff;.  ac[1] 
3c20: 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26 20 30 78  = (val>>16) & 0x
3c30: 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d 20 28 76  ff;.  ac[2] = (v
3c40: 61 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b 0a 20  al>>8) & 0xff;. 
3c50: 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26 20 30   ac[3] = val & 0
3c60: 78 66 66 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  xff;.  return sq
3c70: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c  lite3OsWrite(fd,
3c80: 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   ac, 4);.}../*.*
3c90: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
3ca0: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20   integer into a 
3cb0: 70 61 67 65 20 68 65 61 64 65 72 20 72 69 67 68  page header righ
3cc0: 74 20 62 65 66 6f 72 65 20 74 68 65 0a 2a 2a 20  t before the.** 
3cd0: 70 61 67 65 20 64 61 74 61 2e 20 20 54 68 69 73  page data.  This
3ce0: 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20   will overwrite 
3cf0: 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79  the PgHdr.pDirty
3d00: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
3d10: 54 68 65 20 69 6e 74 65 67 65 72 20 69 73 20 62  The integer is b
3d20: 69 67 2d 65 6e 64 69 61 6e 20 66 6f 72 20 66 6f  ig-endian for fo
3d30: 72 6d 61 74 73 20 32 20 61 6e 64 20 33 20 61 6e  rmats 2 and 3 an
3d40: 64 20 6e 61 74 69 76 65 20 62 79 74 65 20 6f 72  d native byte or
3d50: 64 65 72 0a 2a 2a 20 66 6f 72 20 6a 6f 75 72 6e  der.** for journ
3d60: 61 6c 20 66 6f 72 6d 61 74 20 31 2e 0a 2a 2f 0a  al format 1..*/.
3d70: 73 74 61 74 69 63 20 76 6f 69 64 20 73 74 6f 72  static void stor
3d80: 65 33 32 62 69 74 73 28 75 33 32 20 76 61 6c 2c  e32bits(u32 val,
3d90: 20 50 67 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f   PgHdr *p, int o
3da0: 66 66 73 65 74 29 7b 0a 20 20 75 6e 73 69 67 6e  ffset){.  unsign
3db0: 65 64 20 63 68 61 72 20 2a 61 63 3b 0a 20 20 61  ed char *ac;.  a
3dc0: 63 20 3d 20 26 28 28 75 6e 73 69 67 6e 65 64 20  c = &((unsigned 
3dd0: 63 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44  char*)PGHDR_TO_D
3de0: 41 54 41 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b  ATA(p))[offset];
3df0: 0a 20 20 69 66 28 20 6a 6f 75 72 6e 61 6c 5f 66  .  if( journal_f
3e00: 6f 72 6d 61 74 3c 3d 31 20 29 7b 0a 20 20 20 20  ormat<=1 ){.    
3e10: 6d 65 6d 63 70 79 28 61 63 2c 20 26 76 61 6c 2c  memcpy(ac, &val,
3e20: 20 34 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   4);.  }else{.  
3e30: 20 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e    ac[0] = (val>>
3e40: 32 34 29 20 26 20 30 78 66 66 3b 0a 20 20 20 20  24) & 0xff;.    
3e50: 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36  ac[1] = (val>>16
3e60: 29 20 26 20 30 78 66 66 3b 0a 20 20 20 20 61 63  ) & 0xff;.    ac
3e70: 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26  [2] = (val>>8) &
3e80: 20 30 78 66 66 3b 0a 20 20 20 20 61 63 5b 33 5d   0xff;.    ac[3]
3e90: 20 3d 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 20   = val & 0xff;. 
3ea0: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e   }.}.../*.** Con
3eb0: 76 65 72 74 20 74 68 65 20 62 69 74 73 20 69 6e  vert the bits in
3ec0: 20 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72   the pPager->err
3ed0: 4d 61 73 6b 20 69 6e 74 6f 20 61 6e 20 61 70 70  Mask into an app
3ee0: 72 6f 70 72 61 74 65 0a 2a 2a 20 72 65 74 75 72  roprate.** retur
3ef0: 6e 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  n code..*/.stati
3f00: 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 63  c int pager_errc
3f10: 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ode(Pager *pPage
3f20: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
3f30: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
3f40: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
3f50: 26 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b  & PAGER_ERR_LOCK
3f60: 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54   )    rc = SQLIT
3f70: 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 69 66  E_PROTOCOL;.  if
3f80: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
3f90: 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 44 49  k & PAGER_ERR_DI
3fa0: 53 4b 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c  SK )    rc = SQL
3fb0: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 69 66 28  ITE_IOERR;.  if(
3fc0: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
3fd0: 20 26 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c   & PAGER_ERR_FUL
3fe0: 4c 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49  L )    rc = SQLI
3ff0: 54 45 5f 46 55 4c 4c 3b 0a 20 20 69 66 28 20 70  TE_FULL;.  if( p
4000: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26  Pager->errMask &
4010: 20 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20 29   PAGER_ERR_MEM )
4020: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
4030: 5f 4e 4f 4d 45 4d 3b 0a 20 20 69 66 28 20 70 50  _NOMEM;.  if( pP
4040: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
4050: 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50  PAGER_ERR_CORRUP
4060: 54 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  T ) rc = SQLITE_
4070: 43 4f 52 52 55 50 54 3b 0a 20 20 72 65 74 75 72  CORRUPT;.  retur
4080: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
4090: 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20 70  dd or remove a p
40a0: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73  age from the lis
40b0: 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 74  t of all pages t
40c0: 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 0a 2a  hat are in the.*
40d0: 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  * statement jour
40e0: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  nal..**.** The P
40f0: 61 67 65 72 20 6b 65 65 70 73 20 61 20 73 65 70  ager keeps a sep
4100: 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20 70 61  arate list of pa
4110: 67 65 73 20 74 68 61 74 20 61 72 65 20 63 75 72  ges that are cur
4120: 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65  rently in.** the
4130: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
4140: 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20  al.  This helps 
4150: 74 68 65 20 73 71 6c 69 74 65 33 70 61 67 65 72  the sqlite3pager
4160: 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 29 0a 2a  _stmt_commit().*
4170: 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55  * routine run MU
4180: 43 48 20 66 61 73 74 65 72 20 66 6f 72 20 74 68  CH faster for th
4190: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
41a0: 65 72 65 20 74 68 65 72 65 20 61 72 65 20 6d 61  ere there are ma
41b0: 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d  ny.** pages in m
41c0: 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20 61  emory but only a
41d0: 20 66 65 77 20 61 72 65 20 69 6e 20 74 68 65 20   few are in the 
41e0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
41f0: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
4200: 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74  d page_add_to_st
4210: 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70  mt_list(PgHdr *p
4220: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
4230: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
4240: 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69  er;.  if( pPg->i
4250: 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a  nStmt ) return;.
4260: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
4270: 50 72 65 76 53 74 6d 74 3d 3d 30 20 26 26 20 70  PrevStmt==0 && p
4280: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 30  Pg->pNextStmt==0
4290: 20 29 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76   );.  pPg->pPrev
42a0: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  Stmt = 0;.  if( 
42b0: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 29 7b  pPager->pStmt ){
42c0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
42d0: 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  mt->pPrevStmt = 
42e0: 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  pPg;.  }.  pPg->
42f0: 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 61 67  pNextStmt = pPag
4300: 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 70 50 61  er->pStmt;.  pPa
4310: 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67  ger->pStmt = pPg
4320: 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20  ;.  pPg->inStmt 
4330: 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  = 1;.}.static vo
4340: 69 64 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66  id page_remove_f
4350: 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67  rom_stmt_list(Pg
4360: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  Hdr *pPg){.  if(
4370: 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20   !pPg->inStmt ) 
4380: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
4390: 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 29 7b 0a  g->pPrevStmt ){.
43a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
43b0: 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78  >pPrevStmt->pNex
43c0: 74 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20  tStmt==pPg );.  
43d0: 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74    pPg->pPrevStmt
43e0: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50  ->pNextStmt = pP
43f0: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20  g->pNextStmt;.  
4400: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
4410: 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  t( pPg->pPager->
4420: 70 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20  pStmt==pPg );.  
4430: 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
4440: 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Stmt = pPg->pNex
4450: 74 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 69 66 28  tStmt;.  }.  if(
4460: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20   pPg->pNextStmt 
4470: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
4480: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70  Pg->pNextStmt->p
4490: 50 72 65 76 53 74 6d 74 3d 3d 70 50 67 20 29 3b  PrevStmt==pPg );
44a0: 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 53  .    pPg->pNextS
44b0: 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  tmt->pPrevStmt =
44c0: 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 3b   pPg->pPrevStmt;
44d0: 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78  .  }.  pPg->pNex
44e0: 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67  tStmt = 0;.  pPg
44f0: 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30 3b  ->pPrevStmt = 0;
4500: 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d  .  pPg->inStmt =
4510: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   0;.}../*.** Fin
4520: 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
4530: 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e  hash table given
4540: 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72   its page number
4550: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70  .  Return.** a p
4560: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
4570: 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f  ge or NULL if no
4580: 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  t found..*/.stat
4590: 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
45a0: 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  lookup(Pager *pP
45b0: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
45c0: 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70  {.  PgHdr *p = p
45d0: 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 61 67  Pager->aHash[pag
45e0: 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 5d 3b 0a  er_hash(pgno)];.
45f0: 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
4600: 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20  >pgno!=pgno ){. 
4610: 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48     p = p->pNextH
4620: 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ash;.  }.  retur
4630: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  n p;.}../*.** Un
4640: 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
4650: 65 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65 20  e and clear the 
4660: 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
4670: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
4680: 2a 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65  * sets the state
4690: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 62 61   of the pager ba
46a0: 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77 61  ck to what it wa
46b0: 73 20 77 68 65 6e 20 69 74 20 77 61 73 20 66 69  s when it was fi
46c0: 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20  rst.** opened.  
46d0: 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  Any outstanding 
46e0: 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
46f0: 64 61 74 65 64 20 61 6e 64 20 73 75 62 73 65 71  dated and subseq
4700: 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a  uent attempts.**
4710: 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65   to access those
4720: 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65   pages will like
4730: 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ly result in a c
4740: 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74  oredump..*/.stat
4750: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65  ic void pager_re
4760: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
4770: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
4780: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28  , *pNext;.  for(
4790: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
47a0: 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74  ; pPg; pPg=pNext
47b0: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
47c0: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
47d0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67    sqliteFree(pPg
47e0: 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  );.  }.  pPager-
47f0: 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 70  >pFirst = 0;.  p
4800: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
4810: 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ced = 0;.  pPage
4820: 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20  r->pLast = 0;.  
4830: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30  pPager->pAll = 0
4840: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65  ;.  memset(pPage
4850: 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
4860: 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
4870: 68 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  h));.  pPager->n
4880: 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Page = 0;.  if( 
4890: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53  pPager->state>=S
48a0: 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20  QLITE_WRITELOCK 
48b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61  ){.    sqlite3pa
48c0: 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
48d0: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
48e0: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61  te3OsUnlock(&pPa
48f0: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 70 50 61 67  ger->fd);.  pPag
4900: 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49  er->state = SQLI
4910: 54 45 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61  TE_UNLOCK;.  pPa
4920: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
4930: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  ;.  pPager->nRef
4940: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
4950: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
4960: 70 65 6e 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a  pen==0 );.}../*.
4970: 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75  ** When this rou
4980: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
4990: 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68  the pager has th
49a0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
49b0: 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 77 72 69  pen and.** a wri
49c0: 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
49d0: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72  atabase.  This r
49e0: 6f 75 74 69 6e 65 20 72 65 6c 65 61 73 65 73 20  outine releases 
49f0: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
4a00: 77 72 69 74 65 20 6c 6f 63 6b 20 61 6e 64 20 61  write lock and a
4a10: 63 71 75 69 72 65 73 20 61 20 72 65 61 64 20 6c  cquires a read l
4a20: 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c 61 63 65  ock in its place
4a30: 2e 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  .  The journal f
4a40: 69 6c 65 0a 2a 2a 20 69 73 20 64 65 6c 65 74 65  ile.** is delete
4a50: 64 20 61 6e 64 20 63 6c 6f 73 65 64 2e 0a 2a 2a  d and closed..**
4a60: 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73 69 64  .** TODO: Consid
4a70: 65 72 20 6b 65 65 70 69 6e 67 20 74 68 65 20 6a  er keeping the j
4a80: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e  ournal file open
4a90: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64   for temporary d
4aa0: 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20 54 68 69  atabases..** Thi
4ab0: 73 20 6d 69 67 68 74 20 67 69 76 65 20 61 20 70  s might give a p
4ac0: 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f  erformance impro
4ad0: 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e 64 6f 77  vement on window
4ae0: 73 20 77 68 65 72 65 20 6f 70 65 6e 69 6e 67 0a  s where opening.
4af0: 2a 2a 20 61 20 66 69 6c 65 20 69 73 20 61 6e 20  ** a file is an 
4b00: 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74  expensive operat
4b10: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
4b20: 6e 74 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65  nt pager_unwrite
4b30: 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
4b40: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
4b50: 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69   PgHdr *pPg;.  i
4b60: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
4b70: 3c 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43  <SQLITE_WRITELOC
4b80: 4b 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  K ) return SQLIT
4b90: 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 70  E_OK;.  sqlite3p
4ba0: 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74  ager_stmt_commit
4bb0: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
4bc0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
4bd0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
4be0: 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  sClose(&pPager->
4bf0: 73 74 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65  stfd);.    pPage
4c00: 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b  r->stmtOpen = 0;
4c10: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
4c20: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
4c30: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
4c40: 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  lose(&pPager->jf
4c50: 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  d);.    pPager->
4c60: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b  journalOpen = 0;
4c70: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65  .    sqlite3OsDe
4c80: 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  lete(pPager->zJo
4c90: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69  urnal);.    sqli
4ca0: 74 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e  teFree( pPager->
4cb0: 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  aInJournal );.  
4cc0: 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
4cd0: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f  rnal = 0;.    fo
4ce0: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
4cf0: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
4d00: 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
4d10: 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
4d20: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  l = 0;.      pPg
4d30: 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
4d40: 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
4d50: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 0;.    }.  }e
4d60: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
4d70: 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 46 69   pPager->dirtyFi
4d80: 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  le==0 || pPager-
4d90: 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >useJournal==0 )
4da0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
4db0: 69 74 65 33 4f 73 52 65 61 64 4c 6f 63 6b 28 26  ite3OsReadLock(&
4dc0: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 69  pPager->fd);.  i
4dd0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4de0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
4df0: 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 52  state = SQLITE_R
4e00: 45 41 44 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65  EADLOCK;.  }else
4e10: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  {.    /* This ca
4e20: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
4e30: 20 61 20 70 72 6f 63 65 73 73 20 64 6f 65 73 20   a process does 
4e40: 61 20 42 45 47 49 4e 2c 20 74 68 65 6e 20 66 6f  a BEGIN, then fo
4e50: 72 6b 73 20 61 6e 64 20 74 68 65 0a 20 20 20 20  rks and the.    
4e60: 2a 2a 20 63 68 69 6c 64 20 70 72 6f 63 65 73 73  ** child process
4e70: 20 64 6f 65 73 20 74 68 65 20 43 4f 4d 4d 49 54   does the COMMIT
4e80: 2e 20 20 42 65 63 61 75 73 65 20 6f 66 20 74 68  .  Because of th
4e90: 65 20 73 65 6d 61 6e 74 69 63 73 20 6f 66 20 75  e semantics of u
4ea0: 6e 69 78 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nix.    ** file 
4eb0: 6c 6f 63 6b 69 6e 67 2c 20 74 68 65 20 75 6e 6c  locking, the unl
4ec0: 6f 63 6b 20 77 69 6c 6c 20 66 61 69 6c 2e 0a 20  ock will fail.. 
4ed0: 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
4ee0: 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45  ->state = SQLITE
4ef0: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 72  _UNLOCK;.  }.  r
4f00: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
4f10: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72  ** Compute and r
4f20: 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d  eturn a checksum
4f30: 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66   for the page of
4f40: 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   data..**.** Thi
4f50: 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20  s is not a real 
4f60: 63 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73  checksum.  It is
4f70: 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65   really just the
4f80: 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20   sum of the .** 
4f90: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76  random initial v
4fa0: 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61 67  alue and the pag
4fb0: 65 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 63 6f  e number.  We co
4fc0: 6e 73 69 64 65 72 65 64 20 64 6f 20 61 20 63 68  nsidered do a ch
4fd0: 65 63 6b 73 75 6d 0a 2a 2a 20 6f 66 20 74 68 65  ecksum.** of the
4fe0: 20 64 61 74 61 62 61 73 65 2c 20 62 75 74 20 74   database, but t
4ff0: 68 61 74 20 77 61 73 20 66 6f 75 6e 64 20 74 6f  hat was found to
5000: 20 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2f   be too slow..*/
5010: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
5020: 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70  r_cksum(Pager *p
5030: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
5040: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 44  , const char *aD
5050: 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75  ata){.  u32 cksu
5060: 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
5070: 6d 49 6e 69 74 20 2b 20 70 67 6e 6f 3b 0a 20 20  mInit + pgno;.  
5080: 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a  return cksum;.}.
5090: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69  ./*.** Read a si
50a0: 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 74  ngle page from t
50b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
50c0: 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64  opened on file d
50d0: 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64  escriptor.** jfd
50e0: 2e 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69 73  .  Playback this
50f0: 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   one page..**.**
5100: 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65   There are three
5110: 20 64 69 66 66 65 72 65 6e 74 20 6a 6f 75 72 6e   different journ
5120: 61 6c 20 66 6f 72 6d 61 74 73 2e 20 20 54 68 65  al formats.  The
5130: 20 66 6f 72 6d 61 74 20 70 61 72 61 6d 65 74 65   format paramete
5140: 72 20 64 65 74 65 72 6d 69 6e 65 73 0a 2a 2a 20  r determines.** 
5150: 77 68 69 63 68 20 66 6f 72 6d 61 74 20 69 73 20  which format is 
5160: 75 73 65 64 20 62 79 20 74 68 65 20 6a 6f 75 72  used by the jour
5170: 6e 61 6c 20 74 68 61 74 20 69 73 20 70 6c 61 79  nal that is play
5180: 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  ed back..*/.stat
5190: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
51a0: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 50  yback_one_page(P
51b0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 4f 73  ager *pPager, Os
51c0: 46 69 6c 65 20 2a 6a 66 64 2c 20 69 6e 74 20 66  File *jfd, int f
51d0: 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 72 63  ormat){.  int rc
51e0: 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20  ;.  PgHdr *pPg; 
51f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5200: 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65  An existing page
5210: 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f   in the cache */
5220: 0a 20 20 50 61 67 65 52 65 63 6f 72 64 20 70 67  .  PageRecord pg
5230: 52 65 63 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d  Rec;.  u32 cksum
5240: 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  ;..  rc = read32
5250: 62 69 74 73 28 66 6f 72 6d 61 74 2c 20 6a 66 64  bits(format, jfd
5260: 2c 20 26 70 67 52 65 63 2e 70 67 6e 6f 29 3b 0a  , &pgRec.pgno);.
5270: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5280: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
5290: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
52a0: 73 52 65 61 64 28 6a 66 64 2c 20 26 70 67 52 65  sRead(jfd, &pgRe
52b0: 63 2e 61 44 61 74 61 2c 20 73 69 7a 65 6f 66 28  c.aData, sizeof(
52c0: 70 67 52 65 63 2e 61 44 61 74 61 29 29 3b 0a 20  pgRec.aData));. 
52d0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
52e0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
52f0: 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
5300: 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67  cking on the pag
5310: 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65  e.  This is more
5320: 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
5330: 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a  I originally.  *
5340: 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61  * thought.  If a
5350: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
5360: 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20  ccurs while the 
5370: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
5380: 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69   written,.  ** i
5390: 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e  t could cause in
53a0: 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65  valid data to be
53b0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
53c0: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e  e journal.  We n
53d0: 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65  eed to.  ** dete
53e0: 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20  ct this invalid 
53f0: 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20  data (with high 
5400: 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64  probability) and
5410: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f   ignore it..  */
5420: 0a 20 20 69 66 28 20 70 67 52 65 63 2e 70 67 6e  .  if( pgRec.pgn
5430: 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  o==0 ){.    retu
5440: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
5450: 20 20 7d 0a 20 20 69 66 28 20 70 67 52 65 63 2e    }.  if( pgRec.
5460: 70 67 6e 6f 3e 28 75 6e 73 69 67 6e 65 64 29 70  pgno>(unsigned)p
5470: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
5480: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5490: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
54a0: 20 66 6f 72 6d 61 74 3e 3d 4a 4f 55 52 4e 41 4c   format>=JOURNAL
54b0: 5f 46 4f 52 4d 41 54 5f 33 20 29 7b 0a 20 20 20  _FORMAT_3 ){.   
54c0: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
54d0: 28 66 6f 72 6d 61 74 2c 20 6a 66 64 2c 20 26 63  (format, jfd, &c
54e0: 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72  ksum);.    if( r
54f0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
5500: 20 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73     if( pager_cks
5510: 75 6d 28 70 50 61 67 65 72 2c 20 70 67 52 65 63  um(pPager, pgRec
5520: 2e 70 67 6e 6f 2c 20 70 67 52 65 63 2e 61 44 61  .pgno, pgRec.aDa
5530: 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20  ta)!=cksum ){.  
5540: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5550: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
5560: 7d 0a 0a 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b  }..  /* Playback
5570: 20 74 68 65 20 70 61 67 65 2e 20 20 55 70 64 61   the page.  Upda
5580: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
5590: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 61 67   copy of the pag
55a0: 65 0a 20 20 2a 2a 20 61 74 20 74 68 65 20 73 61  e.  ** at the sa
55b0: 6d 65 20 74 69 6d 65 2c 20 69 66 20 74 68 65 72  me time, if ther
55c0: 65 20 69 73 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20  e is one..  */. 
55d0: 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
55e0: 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 52 65  kup(pPager, pgRe
55f0: 63 2e 70 67 6e 6f 29 3b 0a 20 20 54 52 41 43 45  c.pgno);.  TRACE
5600: 32 28 22 50 4c 41 59 42 41 43 4b 20 25 64 5c 6e  2("PLAYBACK %d\n
5610: 22 2c 20 70 67 52 65 63 2e 70 67 6e 6f 29 3b 0a  ", pgRec.pgno);.
5620: 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
5630: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67  &pPager->fd, (pg
5640: 52 65 63 2e 70 67 6e 6f 2d 31 29 2a 28 6f 66 66  Rec.pgno-1)*(off
5650: 5f 74 29 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  _t)SQLITE_PAGE_S
5660: 49 5a 45 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  IZE);.  rc = sql
5670: 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61  ite3OsWrite(&pPa
5680: 67 65 72 2d 3e 66 64 2c 20 70 67 52 65 63 2e 61  ger->fd, pgRec.a
5690: 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 50 41 47  Data, SQLITE_PAG
56a0: 45 5f 53 49 5a 45 29 3b 0a 20 20 69 66 28 20 70  E_SIZE);.  if( p
56b0: 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  Pg ){.    /* No 
56c0: 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72  page should ever
56d0: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
56e0: 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20  that is in use, 
56f0: 65 78 63 65 70 74 20 66 6f 72 20 70 61 67 65 0a  except for page.
5700: 20 20 20 20 2a 2a 20 31 20 77 68 69 63 68 20 69      ** 1 which i
5710: 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e  s held in use in
5720: 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
5730: 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  he lock on the d
5740: 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 61  atabase.    ** a
5750: 63 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ctive..    */.  
5760: 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20    void *pData;. 
5770: 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
5780: 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e  nRef==0 || pPg->
5790: 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 70  pgno==1 );.    p
57a0: 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Data = PGHDR_TO_
57b0: 44 41 54 41 28 70 50 67 29 3b 0a 20 20 20 20 6d  DATA(pPg);.    m
57c0: 65 6d 63 70 79 28 70 44 61 74 61 2c 20 70 67 52  emcpy(pData, pgR
57d0: 65 63 2e 61 44 61 74 61 2c 20 70 50 61 67 65 72  ec.aData, pPager
57e0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
57f0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65   if( pPager->xDe
5800: 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20  structor ){.    
5810: 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72    pPager->xDestr
5820: 75 63 74 6f 72 28 70 44 61 74 61 2c 20 70 50 61  uctor(pData, pPa
5830: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
5840: 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 64      }.    pPg->d
5850: 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  irty = 0;.    pP
5860: 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
5870: 0a 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65  .    CODEC(pPage
5880: 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
5890: 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 72  gno, 3);.  }.  r
58a0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
58b0: 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  ** Playback the 
58c0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73  journal and thus
58d0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
58e0: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a  abase file to.**
58f0: 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61   the state it wa
5900: 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73  s in before we s
5910: 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68  tarted making ch
5920: 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  anges.  .**.** T
5930: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5940: 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c  format is as fol
5950: 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 20  lows: .**.**    
5960: 2a 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78  *  8 byte prefix
5970: 2e 20 20 4f 6e 65 20 6f 66 20 74 68 65 20 61 4a  .  One of the aJ
5980: 6f 75 72 6e 61 6c 4d 61 67 69 63 31 32 33 20 76  ournalMagic123 v
5990: 65 63 74 6f 72 73 20 64 65 66 69 6e 65 64 0a 2a  ectors defined.*
59a0: 2a 20 20 20 20 20 20 20 61 62 6f 76 65 2e 20 20  *       above.  
59b0: 54 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 74 68  The format of th
59c0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
59d0: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
59e0: 77 68 69 63 68 0a 2a 2a 20 20 20 20 20 20 20 6f  which.**       o
59f0: 66 20 74 68 65 20 74 68 72 65 65 20 70 72 65 66  f the three pref
5a00: 69 78 20 76 65 63 74 6f 72 73 20 69 73 20 73 65  ix vectors is se
5a10: 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20 20 34 20 62  en..**    *  4 b
5a20: 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
5a30: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
5a40: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61  the number of va
5a50: 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73  lid page records
5a60: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65  .**       in the
5a70: 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68   journal.  If th
5a80: 69 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  is value is 0xff
5a90: 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d  ffffff, then com
5aa0: 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  pute the.**     
5ab0: 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65    number of page
5ac0: 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68   records from th
5ad0: 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 20  e journal size. 
5ae0: 20 54 68 69 73 20 66 69 65 6c 64 20 61 70 70 65   This field appe
5af0: 61 72 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20  ars.**       in 
5b00: 66 6f 72 6d 61 74 20 33 20 6f 6e 6c 79 2e 0a 2a  format 3 only..*
5b10: 2a 20 20 20 20 2a 20 20 34 20 62 79 74 65 20 62  *    *  4 byte b
5b20: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
5b30: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  r which is the i
5b40: 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72  nitial value for
5b50: 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73   the .**       s
5b60: 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 20  anity checksum. 
5b70: 20 54 68 69 73 20 66 69 65 6c 64 20 61 70 70 65   This field appe
5b80: 61 72 73 20 69 6e 20 66 6f 72 6d 61 74 20 33 20  ars in format 3 
5b90: 6f 6e 6c 79 2e 0a 2a 2a 20 20 20 20 2a 20 20 34  only..**    *  4
5ba0: 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68   byte integer wh
5bb0: 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
5bc0: 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72  r of pages to tr
5bd0: 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20  uncate the.**   
5be0: 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20      database to 
5bf0: 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
5c00: 6b 2e 0a 2a 2a 20 20 20 20 2a 20 20 5a 65 72 6f  k..**    *  Zero
5c10: 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69   or more pages i
5c20: 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61  nstances, each a
5c30: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20  s follows:.**   
5c40: 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70       +  4 byte p
5c50: 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20  age number..**  
5c60: 20 20 20 20 20 20 2b 20 20 53 51 4c 49 54 45 5f        +  SQLITE_
5c70: 50 41 47 45 5f 53 49 5a 45 20 62 79 74 65 73 20  PAGE_SIZE bytes 
5c80: 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20  of data..**     
5c90: 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65     +  4 byte che
5ca0: 63 6b 73 75 6d 20 28 66 6f 72 6d 61 74 20 33 20  cksum (format 3 
5cb0: 6f 6e 6c 79 29 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  only).**.** When
5cc0: 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65   we speak of the
5cd0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c   journal header,
5ce0: 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72   we mean the fir
5cf0: 73 74 20 34 20 62 75 6c 6c 65 74 73 20 61 62 6f  st 4 bullets abo
5d00: 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72  ve..** Each entr
5d10: 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
5d20: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
5d30: 6f 66 20 74 68 65 20 35 74 68 20 62 75 6c 6c 65  of the 5th bulle
5d40: 74 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 2a 2a  t.  Note that.**
5d50: 20 62 75 6c 6c 65 74 73 20 32 20 61 6e 64 20 33   bullets 2 and 3
5d60: 20 6f 6e 6c 79 20 61 70 70 65 61 72 20 69 6e 20   only appear in 
5d70: 66 6f 72 6d 61 74 2d 33 20 6a 6f 75 72 6e 61 6c  format-3 journal
5d80: 73 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  s..**.** Call th
5d90: 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65  e value from the
5da0: 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22   second bullet "
5db0: 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20  nRec".  nRec is 
5dc0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
5dd0: 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72   valid page entr
5de0: 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ies in the journ
5df0: 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73  al.  In most cas
5e00: 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70  es, you can comp
5e10: 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65  ute the.** value
5e20: 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68   of nRec from th
5e30: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
5e40: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74  urnal file.  But
5e50: 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66   if a power.** f
5e60: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20  ailure occurred 
5e70: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
5e80: 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74  l was being writ
5e90: 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65  ten, it could be
5ea0: 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61   the.** case tha
5eb0: 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
5ec0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
5ed0: 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ad already been 
5ee0: 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a  increased but.**
5ef0: 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69   the extra entri
5f00: 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d  es had not yet m
5f10: 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f  ade it safely to
5f20: 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20   disk.  In such 
5f30: 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76  a case,.** the v
5f40: 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d  alue of nRec com
5f50: 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  puted from the f
5f60: 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62  ile size would b
5f70: 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f  e too large.  Fo
5f80: 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e  r.** that reason
5f90: 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  , we always use 
5fa0: 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
5fb0: 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a  n the header..**
5fc0: 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20  .** If the nRec 
5fd0: 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
5fe0: 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61  fff it means tha
5ff0: 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65  t nRec should be
6000: 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f   computed.** fro
6010: 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e  m the file size.
6020: 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20    This value is 
6030: 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73  used when the us
6040: 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a  er selects the.*
6050: 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e  * no-sync option
6060: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
6070: 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75  .  A power failu
6080: 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f  re could lead to
6090: 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69   corruption.** i
60a0: 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75  n this case.  Bu
60b0: 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b  t for things lik
60c0: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
60d0: 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65  e (which will be
60e0: 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e  .** deleted when
60f0: 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65   the power is re
6100: 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74  stored) we don't
6110: 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 4a   care.  .**.** J
6120: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 73 20 31  ournal formats 1
6130: 20 61 6e 64 20 32 20 64 6f 20 6e 6f 74 20 68 61   and 2 do not ha
6140: 76 65 20 61 6e 20 6e 52 65 63 20 76 61 6c 75 65  ve an nRec value
6150: 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 73   in the header s
6160: 6f 20 77 65 0a 2a 2a 20 68 61 76 65 20 74 6f 20  o we.** have to 
6170: 63 6f 6d 70 75 74 65 20 6e 52 65 63 20 66 72 6f  compute nRec fro
6180: 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e  m the file size.
6190: 20 20 54 68 69 73 20 68 61 73 20 72 69 73 6b 73    This has risks
61a0: 20 28 61 73 20 64 65 73 63 72 69 62 65 64 0a 2a   (as described.*
61b0: 2a 20 61 62 6f 76 65 29 20 77 68 69 63 68 20 69  * above) which i
61c0: 73 20 77 68 79 20 61 6c 6c 20 70 65 72 73 69 73  s why all persis
61d0: 74 65 6e 74 20 74 61 62 6c 65 73 20 68 61 76 65  tent tables have
61e0: 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20 74 6f   been changed to
61f0: 20 75 73 65 0a 2a 2a 20 66 6f 72 6d 61 74 20 33   use.** format 3
6200: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
6210: 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68  ile opened as th
6220: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
6230: 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
6240: 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  med.** journal f
6250: 69 6c 65 20 74 68 65 6e 20 74 68 65 20 64 61 74  ile then the dat
6260: 61 62 61 73 65 20 77 69 6c 6c 20 6c 69 6b 65 6c  abase will likel
6270: 79 20 61 6c 72 65 61 64 79 20 62 65 0a 2a 2a 20  y already be.** 
6280: 63 6f 72 72 75 70 74 65 64 2c 20 73 6f 20 74 68  corrupted, so th
6290: 65 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52  e PAGER_ERR_CORR
62a0: 55 50 54 20 62 69 74 20 69 73 20 73 65 74 20 69  UPT bit is set i
62b0: 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  n pPager->errMas
62c0: 6b 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f  k.** and SQLITE_
62d0: 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72  CORRUPT is retur
62e0: 6e 65 64 2e 20 20 49 66 20 69 74 20 61 6c 6c 20  ned.  If it all 
62f0: 77 6f 72 6b 73 2c 20 74 68 65 6e 20 74 68 69 73  works, then this
6300: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
6310: 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  rns SQLITE_OK..*
6320: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
6330: 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65  er_playback(Page
6340: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 75  r *pPager, int u
6350: 73 65 4a 6f 75 72 6e 61 6c 53 69 7a 65 29 7b 0a  seJournalSize){.
6360: 20 20 6f 66 66 5f 74 20 73 7a 4a 3b 20 20 20 20    off_t szJ;    
6370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
6380: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
6390: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
63a0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
63b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
63c0: 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
63d0: 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ds in the journa
63e0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  l */.  int i;   
63f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6400: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
6410: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d  */.  Pgno mxPg =
6420: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
6430: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69   Size of the ori
6440: 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61  ginal file in pa
6450: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 66 6f 72  ges */.  int for
6460: 6d 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  mat;            
6470: 20 20 2f 2a 20 46 6f 72 6d 61 74 20 6f 66 20 74    /* Format of t
6480: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
6490: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
64a0: 68 61 72 20 61 4d 61 67 69 63 5b 73 69 7a 65 6f  har aMagic[sizeo
64b0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 31  f(aJournalMagic1
64c0: 29 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  )];.  int rc;.. 
64d0: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
64e0: 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
64f0: 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  are in the journ
6500: 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79  al.  Abort early
6510: 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   if.  ** the jou
6520: 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20  rnal is empty.. 
6530: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
6540: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
6550: 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  n );.  sqlite3Os
6560: 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66  Seek(&pPager->jf
6570: 64 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71  d, 0);.  rc = sq
6580: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
6590: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73  &pPager->jfd, &s
65a0: 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  zJ);.  if( rc!=S
65b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
65c0: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
65d0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  k;.  }..  /* If 
65e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
65f0: 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 74 6f   is too small to
6600: 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f 6d 70 6c   contain a compl
6610: 65 74 65 20 68 65 61 64 65 72 2c 0a 20 20 2a 2a  ete header,.  **
6620: 20 69 74 20 6d 75 73 74 20 6d 65 61 6e 20 74 68   it must mean th
6630: 61 74 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  at the process t
6640: 68 61 74 20 63 72 65 61 74 65 64 20 74 68 65 20  hat created the 
6650: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74  journal was just
6660: 0a 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20  .  ** beginning 
6670: 74 6f 20 77 72 69 74 65 20 74 68 65 20 6a 6f 75  to write the jou
6680: 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69  rnal file when i
6690: 74 20 64 69 65 64 2e 20 20 49 6e 20 74 68 61 74  t died.  In that
66a0: 20 63 61 73 65 2c 0a 20 20 2a 2a 20 74 68 65 20   case,.  ** the 
66b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68  database file sh
66c0: 6f 75 6c 64 20 68 61 76 65 20 73 74 69 6c 6c 20  ould have still 
66d0: 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 20  been completely 
66e0: 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 20  unchanged..  ** 
66f0: 4e 6f 74 68 69 6e 67 20 6e 65 65 64 73 20 74 6f  Nothing needs to
6700: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
6710: 20 20 57 65 20 63 61 6e 20 73 61 66 65 6c 79 20    We can safely 
6720: 69 67 6e 6f 72 65 20 74 68 69 73 20 6a 6f 75 72  ignore this jour
6730: 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nal..  */.  if( 
6740: 73 7a 4a 20 3c 20 73 69 7a 65 6f 66 28 61 4d 61  szJ < sizeof(aMa
6750: 67 69 63 29 2b 73 69 7a 65 6f 66 28 50 67 6e 6f  gic)+sizeof(Pgno
6760: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  ) ){.    goto en
6770: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
6780: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 62  .  /* Read the b
6790: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
67a0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 72 75 6e  journal and trun
67b0: 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 64 61  cate the.  ** da
67c0: 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b  tabase file back
67d0: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
67e0: 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63   size..  */.  rc
67f0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
6800: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  (&pPager->jfd, a
6810: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
6820: 61 67 69 63 29 29 3b 0a 20 20 69 66 28 20 72 63  agic));.  if( rc
6830: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
6840: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50     rc = SQLITE_P
6850: 52 4f 54 4f 43 4f 4c 3b 0a 20 20 20 20 67 6f 74  ROTOCOL;.    got
6860: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
6870: 20 20 7d 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70    }.  if( memcmp
6880: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
6890: 6c 4d 61 67 69 63 33 2c 20 73 69 7a 65 6f 66 28  lMagic3, sizeof(
68a0: 61 4d 61 67 69 63 29 29 3d 3d 30 20 29 7b 0a 20  aMagic))==0 ){. 
68b0: 20 20 20 66 6f 72 6d 61 74 20 3d 20 4a 4f 55 52     format = JOUR
68c0: 4e 41 4c 5f 46 4f 52 4d 41 54 5f 33 3b 0a 20 20  NAL_FORMAT_3;.  
68d0: 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 63 6d 70  }else if( memcmp
68e0: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
68f0: 6c 4d 61 67 69 63 32 2c 20 73 69 7a 65 6f 66 28  lMagic2, sizeof(
6900: 61 4d 61 67 69 63 29 29 3d 3d 30 20 29 7b 0a 20  aMagic))==0 ){. 
6910: 20 20 20 66 6f 72 6d 61 74 20 3d 20 4a 4f 55 52     format = JOUR
6920: 4e 41 4c 5f 46 4f 52 4d 41 54 5f 32 3b 0a 20 20  NAL_FORMAT_2;.  
6930: 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 63 6d 70  }else if( memcmp
6940: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
6950: 6c 4d 61 67 69 63 31 2c 20 73 69 7a 65 6f 66 28  lMagic1, sizeof(
6960: 61 4d 61 67 69 63 29 29 3d 3d 30 20 29 7b 0a 20  aMagic))==0 ){. 
6970: 20 20 20 66 6f 72 6d 61 74 20 3d 20 4a 4f 55 52     format = JOUR
6980: 4e 41 4c 5f 46 4f 52 4d 41 54 5f 31 3b 0a 20 20  NAL_FORMAT_1;.  
6990: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
69a0: 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b  SQLITE_PROTOCOL;
69b0: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
69c0: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 69 66  ayback;.  }.  if
69d0: 28 20 66 6f 72 6d 61 74 3e 3d 4a 4f 55 52 4e 41  ( format>=JOURNA
69e0: 4c 5f 46 4f 52 4d 41 54 5f 33 20 29 7b 0a 20 20  L_FORMAT_3 ){.  
69f0: 20 20 69 66 28 20 73 7a 4a 20 3c 20 73 69 7a 65    if( szJ < size
6a00: 6f 66 28 61 4d 61 67 69 63 29 20 2b 20 33 2a 73  of(aMagic) + 3*s
6a10: 69 7a 65 6f 66 28 75 33 32 29 20 29 7b 0a 20 20  izeof(u32) ){.  
6a20: 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68      /* Ignore th
6a30: 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20  e journal if it 
6a40: 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 74 6f 20  is too small to 
6a50: 63 6f 6e 74 61 69 6e 20 61 20 63 6f 6d 70 6c 65  contain a comple
6a60: 74 65 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 64  te.      ** head
6a70: 65 72 2e 20 20 57 65 20 61 6c 72 65 61 64 79 20  er.  We already 
6a80: 64 69 64 20 74 68 69 73 20 74 65 73 74 20 6f 6e  did this test on
6a90: 63 65 20 61 62 6f 76 65 2c 20 62 75 74 20 61 74  ce above, but at
6aa0: 20 74 68 65 20 70 72 69 6f 72 0a 20 20 20 20 20   the prior.     
6ab0: 20 2a 2a 20 74 65 73 74 2c 20 77 65 20 64 69 64   ** test, we did
6ac0: 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 65 20 6a 6f   not know the jo
6ad0: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 61 6e 64  urnal format and
6ae0: 20 73 6f 20 77 65 20 68 61 64 20 74 6f 20 61 73   so we had to as
6af0: 73 75 6d 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  sume.      ** th
6b00: 65 20 73 6d 61 6c 6c 65 73 74 20 70 6f 73 73 69  e smallest possi
6b10: 62 6c 65 20 68 65 61 64 65 72 2e 20 20 4e 6f 77  ble header.  Now
6b20: 20 77 65 20 6b 6e 6f 77 20 74 68 65 20 68 65 61   we know the hea
6b30: 64 65 72 20 69 73 20 62 69 67 67 65 72 0a 20 20  der is bigger.  
6b40: 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20      ** than the 
6b50: 6d 69 6e 69 6d 75 6d 20 73 6f 20 77 65 20 74 65  minimum so we te
6b60: 73 74 20 61 67 61 69 6e 2e 0a 20 20 20 20 20 20  st again..      
6b70: 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  */.      goto en
6b80: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
6b90: 7d 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33  }.    rc = read3
6ba0: 32 62 69 74 73 28 66 6f 72 6d 61 74 2c 20 26 70  2bits(format, &p
6bb0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 75 33 32  Pager->jfd, (u32
6bc0: 2a 29 26 6e 52 65 63 29 3b 0a 20 20 20 20 69 66  *)&nRec);.    if
6bd0: 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
6be0: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 72 63  playback;.    rc
6bf0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 66 6f   = read32bits(fo
6c00: 72 6d 61 74 2c 20 26 70 50 61 67 65 72 2d 3e 6a  rmat, &pPager->j
6c10: 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  fd, &pPager->cks
6c20: 75 6d 49 6e 69 74 29 3b 0a 20 20 20 20 69 66 28  umInit);.    if(
6c30: 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70   rc ) goto end_p
6c40: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 69 66 28  layback;.    if(
6c50: 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66   nRec==0xfffffff
6c60: 66 20 7c 7c 20 75 73 65 4a 6f 75 72 6e 61 6c 53  f || useJournalS
6c70: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  ize ){.      nRe
6c80: 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e  c = (szJ - JOURN
6c90: 41 4c 5f 48 44 52 5f 53 5a 28 33 29 29 2f 4a 4f  AL_HDR_SZ(3))/JO
6ca0: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 33 29 3b 0a  URNAL_PG_SZ(3);.
6cb0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
6cc0: 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d     nRec = (szJ -
6cd0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
6ce0: 32 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  2))/JOURNAL_PG_S
6cf0: 5a 28 32 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Z(2);.    assert
6d00: 28 20 6e 52 65 63 2a 4a 4f 55 52 4e 41 4c 5f 50  ( nRec*JOURNAL_P
6d10: 47 5f 53 5a 28 32 29 2b 4a 4f 55 52 4e 41 4c 5f  G_SZ(2)+JOURNAL_
6d20: 48 44 52 5f 53 5a 28 32 29 3d 3d 73 7a 4a 20 29  HDR_SZ(2)==szJ )
6d30: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 72 65 61  ;.  }.  rc = rea
6d40: 64 33 32 62 69 74 73 28 66 6f 72 6d 61 74 2c 20  d32bits(format, 
6d50: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6d  &pPager->jfd, &m
6d60: 78 50 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  xPg);.  if( rc!=
6d70: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6d80: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
6d90: 63 6b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ck;.  }.  assert
6da0: 28 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  ( pPager->origDb
6db0: 53 69 7a 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  Size==0 || pPage
6dc0: 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 6d  r->origDbSize==m
6dd0: 78 50 67 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  xPg );.  rc = sq
6de0: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
6df0: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  &pPager->fd, SQL
6e00: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2a 28 6f  ITE_PAGE_SIZE*(o
6e10: 66 66 5f 74 29 6d 78 50 67 29 3b 0a 20 20 69 66  ff_t)mxPg);.  if
6e20: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6e30: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
6e40: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20  playback;.  }.  
6e50: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
6e60: 20 6d 78 50 67 3b 0a 20 20 0a 20 20 2f 2a 20 43   mxPg;.  .  /* C
6e70: 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
6e80: 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f  es out of the jo
6e90: 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
6ea0: 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
6eb0: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f   file..  */.  fo
6ec0: 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69  r(i=0; i<nRec; i
6ed0: 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  ++){.    rc = pa
6ee0: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
6ef0: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70  _page(pPager, &p
6f00: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6f 72 6d  Pager->jfd, form
6f10: 61 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  at);.    if( rc!
6f20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6f30: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
6f40: 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
6f50: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
6f60: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
6f70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6f80: 7d 0a 0a 20 20 2f 2a 20 50 61 67 65 73 20 74 68  }..  /* Pages th
6f90: 61 74 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  at have been wri
6fa0: 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
6fb0: 6e 61 6c 20 62 75 74 20 6e 65 76 65 72 20 73 79  nal but never sy
6fc0: 6e 63 65 64 0a 20 20 2a 2a 20 77 68 65 72 65 20  nced.  ** where 
6fd0: 6e 6f 74 20 72 65 73 74 6f 72 65 64 20 62 79 20  not restored by 
6fe0: 74 68 65 20 6c 6f 6f 70 20 61 62 6f 76 65 2e 20  the loop above. 
6ff0: 20 57 65 20 68 61 76 65 20 74 6f 20 72 65 73 74   We have to rest
7000: 6f 72 65 20 74 68 6f 73 65 0a 20 20 2a 2a 20 70  ore those.  ** p
7010: 61 67 65 73 20 62 79 20 72 65 61 64 69 6e 67 20  ages by reading 
7020: 74 68 65 6d 20 62 61 63 6b 20 66 72 6f 6d 20 74  them back from t
7030: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
7040: 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  base..  */.  if(
7050: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
7060: 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
7070: 3b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  ;.    for(pPg=pP
7080: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
7090: 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
70a0: 6c 6c 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ll){.      char 
70b0: 7a 42 75 66 5b 53 51 4c 49 54 45 5f 50 41 47 45  zBuf[SQLITE_PAGE
70c0: 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 20 20 69 66  _SIZE];.      if
70d0: 28 20 21 70 50 67 2d 3e 64 69 72 74 79 20 29 20  ( !pPg->dirty ) 
70e0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
70f0: 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67  if( (int)pPg->pg
7100: 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72  no <= pPager->or
7110: 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
7120: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65      sqlite3OsSee
7130: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  k(&pPager->fd, S
7140: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2a  QLITE_PAGE_SIZE*
7150: 28 6f 66 66 5f 74 29 28 70 50 67 2d 3e 70 67 6e  (off_t)(pPg->pgn
7160: 6f 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 72  o-1));.        r
7170: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
7180: 64 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a  d(&pPager->fd, z
7190: 42 75 66 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  Buf, SQLITE_PAGE
71a0: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20  _SIZE);.        
71b0: 54 52 41 43 45 32 28 22 52 45 46 45 54 43 48 20  TRACE2("REFETCH 
71c0: 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f  %d\n", pPg->pgno
71d0: 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43  );.        CODEC
71e0: 28 70 50 61 67 65 72 2c 20 7a 42 75 66 2c 20 70  (pPager, zBuf, p
71f0: 50 67 2d 3e 70 67 6e 6f 2c 20 32 29 3b 0a 20 20  Pg->pgno, 2);.  
7200: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62        if( rc ) b
7210: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
7220: 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e{.        memse
7230: 74 28 7a 42 75 66 2c 20 30 2c 20 53 51 4c 49 54  t(zBuf, 0, SQLIT
7240: 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  E_PAGE_SIZE);.  
7250: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
7260: 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20  pPg->nRef==0 || 
7270: 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20 50 47 48  memcmp(zBuf, PGH
7280: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
7290: 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
72a0: 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  E) ){.        me
72b0: 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41  mcpy(PGHDR_TO_DA
72c0: 54 41 28 70 50 67 29 2c 20 7a 42 75 66 2c 20 53  TA(pPg), zBuf, S
72d0: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
72e0: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
72f0: 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28  (PGHDR_TO_EXTRA(
7300: 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  pPg), 0, pPager-
7310: 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20  >nExtra);.      
7320: 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  }.      pPg->nee
7330: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20  dSync = 0;.     
7340: 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
7350: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 65 6e 64 5f  .    }.  }..end_
7360: 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20  playback:.  if( 
7370: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
7380: 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 77 72 69  .    pager_unwri
7390: 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
73a0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
73b0: 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
73c0: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72 63  _CORRUPT;.    rc
73d0: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
73e0: 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
73f0: 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
7400: 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
7410: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
7420: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
7430: 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ck the statement
7440: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
7450: 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20  This is similar 
7460: 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  to playing back 
7470: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
7480: 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68  journal but with
7490: 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61 20  .** a few extra 
74a0: 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  twists..**.**   
74b0: 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72   (1)  The number
74c0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
74d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
74e0: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
74f0: 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 73 74  *         the st
7500: 61 74 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65  atement is store
7510: 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d  d in pPager->stm
7520: 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68  tSize, not in th
7530: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75  e.**         jou
7540: 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66  rnal file itself
7550: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
7560: 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70  In addition to p
7570: 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
7580: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
7590: 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20  l, also.**      
75a0: 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20     playback all 
75b0: 70 61 67 65 73 20 6f 66 20 74 68 65 20 74 72 61  pages of the tra
75c0: 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
75d0: 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20   beginning.**   
75e0: 20 20 20 20 20 20 61 74 20 6f 66 66 73 65 74 20        at offset 
75f0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
7600: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
7610: 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79   pager_stmt_play
7620: 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
7630: 65 72 29 7b 0a 20 20 6f 66 66 5f 74 20 73 7a 4a  er){.  off_t szJ
7640: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7650: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66  /* Size of the f
7660: 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ull journal */. 
7670: 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20   int nRec;      
7680: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7690: 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a  ber of Records *
76a0: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
76b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
76c0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
76d0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
76e0: 54 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  Truncate the dat
76f0: 61 62 61 73 65 20 62 61 63 6b 20 74 6f 20 69 74  abase back to it
7700: 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e  s original size.
7710: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
7720: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 26  ite3OsTruncate(&
7730: 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
7740: 54 45 5f 50 41 47 45 5f 53 49 5a 45 2a 28 6f 66  TE_PAGE_SIZE*(of
7750: 66 5f 74 29 70 50 61 67 65 72 2d 3e 73 74 6d 74  f_t)pPager->stmt
7760: 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d  Size);.  pPager-
7770: 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
7780: 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 0a 20 20 2f  ->stmtSize;..  /
7790: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
77a0: 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
77b0: 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  e in the stateme
77c0: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  nt journal..  */
77d0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
77e0: 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20  r->stmtInUse && 
77f0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
7800: 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  pen );.  sqlite3
7810: 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
7820: 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52 65 63  stfd, 0);.  nRec
7830: 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e   = pPager->stmtN
7840: 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70  Rec;.  .  /* Cop
7850: 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  y original pages
7860: 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74 61 74   out of the stat
7870: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e  ement journal an
7880: 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a  d back into the.
7890: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
78a0: 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74  le.  Note that t
78b0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
78c0: 72 6e 61 6c 20 61 6c 77 61 79 73 20 75 73 65 73  rnal always uses
78d0: 20 66 6f 72 6d 61 74 0a 20 20 2a 2a 20 32 20 69   format.  ** 2 i
78e0: 6e 73 74 65 61 64 20 6f 66 20 66 6f 72 6d 61 74  nstead of format
78f0: 20 33 20 73 69 6e 63 65 20 69 74 20 64 6f 65 73   3 since it does
7900: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
7910: 63 6f 6e 63 65 72 6e 65 64 20 77 69 74 68 0a 20  concerned with. 
7920: 20 2a 2a 20 70 6f 77 65 72 20 66 61 69 6c 75 72   ** power failur
7930: 65 73 20 63 6f 72 72 75 70 74 69 6e 67 20 74 68  es corrupting th
7940: 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 63 61  e journal and ca
7950: 6e 20 74 68 75 73 20 6f 6d 69 74 20 74 68 65 20  n thus omit the 
7960: 63 68 65 63 6b 73 75 6d 73 2e 0a 20 20 2a 2f 0a  checksums..  */.
7970: 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20    for(i=nRec-1; 
7980: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
7990: 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
79a0: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
79b0: 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 73 74  ger, &pPager->st
79c0: 66 64 2c 20 32 29 3b 0a 20 20 20 20 61 73 73 65  fd, 2);.    asse
79d0: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
79e0: 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72  ONE );.    if( r
79f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
7a00: 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
7a10: 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  yback;.  }..  /*
7a20: 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
7a30: 6d 61 6e 79 20 70 61 67 65 73 20 6e 65 65 64 20  many pages need 
7a40: 74 6f 20 62 65 20 63 6f 70 69 65 64 20 6f 75 74  to be copied out
7a50: 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
7a60: 69 6f 6e 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ion.  ** journal
7a70: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
7a80: 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
7a90: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
7aa0: 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20  ->stmtJSize);.  
7ab0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
7ac0: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
7ad0: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
7ae0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
7af0: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70  te3OsFileSize(&p
7b00: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a  Pager->jfd, &szJ
7b10: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
7b20: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
7b30: 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
7b40: 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 6e 52 65 63  back;.  }.  nRec
7b50: 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72   = (szJ - pPager
7b60: 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 2f 4a 4f 55  ->stmtJSize)/JOU
7b70: 52 4e 41 4c 5f 50 47 5f 53 5a 28 6a 6f 75 72 6e  RNAL_PG_SZ(journ
7b80: 61 6c 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 66 6f  al_format);.  fo
7b90: 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30  r(i=nRec-1; i>=0
7ba0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d  ; i--){.    rc =
7bb0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
7bc0: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
7bd0: 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a   &pPager->jfd, j
7be0: 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 29 3b 0a  ournal_format);.
7bf0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
7c00: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
7c10: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
7c20: 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20  E_DONE );.      
7c30: 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
7c40: 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  ayback;.    }.  
7c50: 7d 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c  }.  .end_stmt_pl
7c60: 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63  ayback:.  if( rc
7c70: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
7c80: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61     pPager->errMa
7c90: 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f  sk |= PAGER_ERR_
7ca0: 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20  CORRUPT;.    rc 
7cb0: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
7cc0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
7cd0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
7ce0: 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ge the maximum n
7cf0: 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
7d00: 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ry pages that ar
7d10: 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 0a 2a 2a  e allowed..**.**
7d20: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   The maximum num
7d30: 62 65 72 20 69 73 20 74 68 65 20 61 62 73 6f 6c  ber is the absol
7d40: 75 74 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  ute value of the
7d50: 20 6d 78 50 61 67 65 20 70 61 72 61 6d 65 74 65   mxPage paramete
7d60: 72 2e 0a 2a 2a 20 49 66 20 6d 78 50 61 67 65 20  r..** If mxPage 
7d70: 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
7d80: 20 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69 73 20   noSync flag is 
7d90: 61 6c 73 6f 20 73 65 74 2e 20 20 6e 6f 53 79 6e  also set.  noSyn
7da0: 63 20 62 79 70 61 73 73 65 73 0a 2a 2a 20 63 61  c bypasses.** ca
7db0: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73  lls to sqlite3Os
7dc0: 53 79 6e 63 28 29 2e 20 20 54 68 65 20 70 61 67  Sync().  The pag
7dd0: 65 72 20 72 75 6e 73 20 6d 75 63 68 20 66 61 73  er runs much fas
7de0: 74 65 72 20 77 69 74 68 20 6e 6f 53 79 6e 63 20  ter with noSync 
7df0: 6f 6e 2c 0a 2a 2a 20 62 75 74 20 69 66 20 74 68  on,.** but if th
7e00: 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
7e10: 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74 68  em crashes or th
7e20: 65 72 65 20 69 73 20 61 6e 20 61 62 72 75 70 74  ere is an abrupt
7e30: 20 70 6f 77 65 72 20 0a 2a 2a 20 66 61 69 6c 75   power .** failu
7e40: 72 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  re, the database
7e50: 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c   file might be l
7e60: 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73  eft in an incons
7e70: 69 73 74 65 6e 74 20 61 6e 64 0a 2a 2a 20 75 6e  istent and.** un
7e80: 72 65 70 61 69 72 61 62 6c 65 20 73 74 61 74 65  repairable state
7e90: 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  .  .*/.void sqli
7ea0: 74 65 33 70 61 67 65 72 5f 73 65 74 5f 63 61 63  te3pager_set_cac
7eb0: 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  hesize(Pager *pP
7ec0: 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
7ed0: 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  ){.  if( mxPage>
7ee0: 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  =0 ){.    pPager
7ef0: 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65  ->noSync = pPage
7f00: 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20  r->tempFile;.   
7f10: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
7f20: 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65  ync ) pPager->ne
7f30: 65 64 53 79 6e 63 20 3d 20 30 3b 20 0a 20 20 7d  edSync = 0; .  }
7f40: 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
7f50: 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31 3b 0a 20 20  ->noSync = 1;.  
7f60: 20 20 6d 78 50 61 67 65 20 3d 20 2d 6d 78 50 61    mxPage = -mxPa
7f70: 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 78  ge;.  }.  if( mx
7f80: 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20 20 70  Page>10 ){.    p
7f90: 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20  Pager->mxPage = 
7fa0: 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f  mxPage;.  }.}../
7fb0: 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20  *.** Adjust the 
7fc0: 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68  robustness of th
7fd0: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61  e database to da
7fe0: 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
7ff0: 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77  rashes.** or pow
8000: 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 20 63  er failures by c
8010: 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62  hanging the numb
8020: 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77  er of syncs()s w
8030: 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  hen writing.** t
8040: 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
8050: 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20  nal.  There are 
8060: 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a  three levels:.**
8070: 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20  .**    OFF      
8080: 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29   sqlite3OsSync()
8090: 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
80a0: 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64  .  This is the d
80b0: 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  efault.**       
80c0: 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f         for tempo
80d0: 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65  rary and transie
80e0: 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  nt files..**.** 
80f0: 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65     NORMAL    The
8100: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
8110: 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77  ed once before w
8120: 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
8130: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
8140: 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68     database.  Th
8150: 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61  is is normally a
8160: 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69  dequate protecti
8170: 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20  on, but.**      
8180: 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68          it is th
8190: 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73  eoretically poss
81a0: 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72  ible, though ver
81b0: 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20  y unlikely,.**  
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74              that
81d0: 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70   an inopertune p
81e0: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
81f0: 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75  ld leave the jou
8200: 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  rnal.**         
8210: 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20       in a state 
8220: 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73  which would caus
8230: 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  e damage to the 
8240: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
8250: 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74           when it
8260: 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
8270: 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20  .**.**    FULL  
8280: 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
8290: 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20  is synced twice 
82a0: 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
82b0: 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
82c0: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
82d0: 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61  ase (with some a
82e0: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
82f0: 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63  ation - the nRec
8300: 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20   field.**       
8310: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f         of the jo
8320: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62  urnal header - b
8330: 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20  eing written in 
8340: 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a  between the two.
8350: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
8360: 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61  syncs).  If we a
8370: 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69  ssume that writi
8380: 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  ng a.**         
8390: 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b       single disk
83a0: 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69   sector is atomi
83b0: 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64  c, then this mod
83c0: 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20  e provides.**   
83d0: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72             assur
83e0: 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f  ance that the jo
83f0: 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62  urnal will not b
8400: 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74  e corrupted to t
8410: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
8420: 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73     point of caus
8430: 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68  ing damage to th
8440: 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e  e database durin
8450: 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  g rollback..**.*
8460: 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73  * Numeric values
8470: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
8480: 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72   these states ar
8490: 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c  e OFF==1, NORMAL
84a0: 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d  =2,.** and FULL=
84b0: 33 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  3..*/.void sqlit
84c0: 65 33 70 61 67 65 72 5f 73 65 74 5f 73 61 66 65  e3pager_set_safe
84d0: 74 79 5f 6c 65 76 65 6c 28 50 61 67 65 72 20 2a  ty_level(Pager *
84e0: 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65  pPager, int leve
84f0: 6c 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f  l){.  pPager->no
8500: 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31  Sync =  level==1
8510: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
8520: 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
8530: 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c  fullSync = level
8540: 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ==3 && !pPager->
8550: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28 20  tempFile;.  if( 
8560: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
8570: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
8580: 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c = 0;.}../*.** 
8590: 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  Open a temporary
85a0: 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68   file.  Write th
85b0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
85c0: 6c 65 20 69 6e 74 6f 20 7a 4e 61 6d 65 0a 2a 2a  le into zName.**
85d0: 20 28 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20   (zName must be 
85e0: 61 74 20 6c 65 61 73 74 20 53 51 4c 49 54 45 5f  at least SQLITE_
85f0: 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20 62 79  TEMPNAME_SIZE by
8600: 74 65 73 20 6c 6f 6e 67 2e 29 20 20 57 72 69 74  tes long.)  Writ
8610: 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65  e.** the file de
8620: 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66  scriptor into *f
8630: 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  d.  Return SQLIT
8640: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
8650: 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72  or some.** other
8660: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
8670: 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  e fail..**.** Th
8680: 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61  e OS will automa
8690: 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74  tically delete t
86a0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
86b0: 65 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  e when it is.** 
86c0: 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  closed..*/.stati
86d0: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  c int sqlite3pag
86e0: 65 72 5f 6f 70 65 6e 74 65 6d 70 28 63 68 61 72  er_opentemp(char
86f0: 20 2a 7a 46 69 6c 65 2c 20 4f 73 46 69 6c 65 20   *zFile, OsFile 
8700: 2a 66 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20  *fd){.  int cnt 
8710: 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 8;.  int rc;. 
8720: 20 64 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a   do{.    cnt--;.
8730: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 54 65 6d      sqlite3OsTem
8740: 70 46 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29  pFileName(zFile)
8750: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
8760: 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76  e3OsOpenExclusiv
8770: 65 28 7a 46 69 6c 65 2c 20 66 64 2c 20 31 29 3b  e(zFile, fd, 1);
8780: 0a 20 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30  .  }while( cnt>0
8790: 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f   && rc!=SQLITE_O
87a0: 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  K );.  return rc
87b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
87c0: 65 20 61 20 6e 65 77 20 70 61 67 65 20 63 61 63  e a new page cac
87d0: 68 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69  he and put a poi
87e0: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
87f0: 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67   cache in *ppPag
8800: 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20  er..** The file 
8810: 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65 65  to be cached nee
8820: 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68  d not exist.  Th
8830: 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f  e file is not lo
8840: 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68  cked until.** th
8850: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
8860: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
8870: 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68  () and is only h
8880: 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74  eld open until t
8890: 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20  he.** last page 
88a0: 69 73 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  is released usin
88b0: 67 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75  g sqlite3pager_u
88c0: 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  nref()..**.** If
88d0: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
88e0: 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d  LL then a random
88f0: 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61  ly-named tempora
8900: 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  ry file is creat
8910: 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61  ed.** and used a
8920: 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  s the file to be
8930: 20 63 61 63 68 65 64 2e 20 20 54 68 65 20 66 69   cached.  The fi
8940: 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74  le will be delet
8950: 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  ed.** automatica
8960: 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20 63  lly when it is c
8970: 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  losed..*/.int sq
8980: 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 28  lite3pager_open(
8990: 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67  .  Pager **ppPag
89a0: 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  er,         /* R
89b0: 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20  eturn the Pager 
89c0: 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
89d0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
89e0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20  zFilename,   /* 
89f0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
8a00: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
8a10: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67  n */.  int mxPag
8a20: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
8a30: 2f 2a 20 4d 61 78 20 6e 75 6d 62 65 72 20 6f 66  /* Max number of
8a40: 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
8a50: 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
8a60: 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20  nExtra,         
8a70: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79       /* Extra by
8a80: 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61  tes append to ea
8a90: 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
8aa0: 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f  e */.  int useJo
8ab0: 75 72 6e 61 6c 20 20 20 20 20 20 20 20 20 20 20  urnal           
8ac0: 2f 2a 20 54 52 55 45 20 74 6f 20 75 73 65 20 61  /* TRUE to use a
8ad0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
8ae0: 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  l on this file *
8af0: 2f 0a 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  /.){.  Pager *pP
8b00: 61 67 65 72 3b 0a 20 20 63 68 61 72 20 2a 7a 46  ager;.  char *zF
8b10: 75 6c 6c 50 61 74 68 6e 61 6d 65 3b 0a 20 20 69  ullPathname;.  i
8b20: 6e 74 20 6e 61 6d 65 4c 65 6e 3b 0a 20 20 4f 73  nt nameLen;.  Os
8b30: 46 69 6c 65 20 66 64 3b 0a 20 20 69 6e 74 20 72  File fd;.  int r
8b40: 63 2c 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70  c, i;.  int temp
8b50: 46 69 6c 65 3b 0a 20 20 69 6e 74 20 6d 65 6d 44  File;.  int memD
8b60: 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61  b = 0;.  int rea
8b70: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 63 68 61  dOnly = 0;.  cha
8b80: 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54  r zTemp[SQLITE_T
8b90: 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a  EMPNAME_SIZE];..
8ba0: 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a    *ppPager = 0;.
8bb0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d 61    if( sqlite3_ma
8bc0: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20  lloc_failed ){. 
8bd0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8be0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
8bf0: 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
8c00: 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
8c10: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46     if( strcmp(zF
8c20: 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79  ilename,":memory
8c30: 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  :")==0 ){.      
8c40: 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20  memDb = 1;.     
8c50: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d   zFullPathname =
8c60: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 34 29   sqliteMalloc(4)
8c70: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c  ;.      if( zFul
8c80: 6c 50 61 74 68 6e 61 6d 65 20 29 20 73 74 72 63  lPathname ) strc
8c90: 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  py(zFullPathname
8ca0: 2c 20 22 6e 69 6c 22 29 3b 0a 20 20 20 20 20 20  , "nil");.      
8cb0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
8cc0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8cd0: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d   zFullPathname =
8ce0: 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
8cf0: 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65  thname(zFilename
8d00: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
8d10: 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57  lite3OsOpenReadW
8d20: 72 69 74 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  rite(zFullPathna
8d30: 6d 65 2c 20 26 66 64 2c 20 26 72 65 61 64 4f 6e  me, &fd, &readOn
8d40: 6c 79 29 3b 0a 20 20 20 20 20 20 74 65 6d 70 46  ly);.      tempF
8d50: 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ile = 0;.    }. 
8d60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
8d70: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70   sqlite3pager_op
8d80: 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26 66  entemp(zTemp, &f
8d90: 64 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d  d);.    zFilenam
8da0: 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a  e = zTemp;.    z
8db0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
8dc0: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
8dd0: 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
8de0: 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20  .    tempFile = 
8df0: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  1;.  }.  if( sql
8e00: 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
8e10: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
8e20: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
8e30: 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
8e40: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
8e50: 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61  liteFree(zFullPa
8e60: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  thname);.    ret
8e70: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
8e80: 50 45 4e 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 4c  PEN;.  }.  nameL
8e90: 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6c  en = strlen(zFul
8ea0: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 70 50  lPathname);.  pP
8eb0: 61 67 65 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c  ager = sqliteMal
8ec0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 61  loc( sizeof(*pPa
8ed0: 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a 33  ger) + nameLen*3
8ee0: 20 2b 20 33 30 20 29 3b 0a 20 20 69 66 28 20 70   + 30 );.  if( p
8ef0: 50 61 67 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Pager==0 ){.    
8f00: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
8f10: 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  fd);.    sqliteF
8f20: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
8f30: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
8f40: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
8f50: 0a 20 20 53 45 54 5f 50 41 47 45 52 28 70 50 61  .  SET_PAGER(pPa
8f60: 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ger);.  pPager->
8f70: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61  zFilename = (cha
8f80: 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20  r*)&pPager[1];. 
8f90: 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
8fa0: 6f 72 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  ory = &pPager->z
8fb0: 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e  Filename[nameLen
8fc0: 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  +1];.  pPager->z
8fd0: 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65  Journal = &pPage
8fe0: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 61  r->zDirectory[na
8ff0: 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74 72 63  meLen+1];.  strc
9000: 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  py(pPager->zFile
9010: 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  name, zFullPathn
9020: 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28 70  ame);.  strcpy(p
9030: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
9040: 79 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  y, zFullPathname
9050: 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 61 6d 65 4c  );.  for(i=nameL
9060: 65 6e 3b 20 69 3e 30 20 26 26 20 70 50 61 67 65  en; i>0 && pPage
9070: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d  r->zDirectory[i-
9080: 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a  1]!='/'; i--){}.
9090: 20 20 69 66 28 20 69 3e 30 20 29 20 70 50 61 67    if( i>0 ) pPag
90a0: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69  er->zDirectory[i
90b0: 2d 31 5d 20 3d 20 30 3b 0a 20 20 73 74 72 63 70  -1] = 0;.  strcp
90c0: 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
90d0: 61 6c 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  al, zFullPathnam
90e0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  e);.  sqliteFree
90f0: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
9100: 0a 20 20 73 74 72 63 70 79 28 26 70 50 61 67 65  .  strcpy(&pPage
9110: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65  r->zJournal[name
9120: 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22  Len], "-journal"
9130: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20  );.  pPager->fd 
9140: 3d 20 66 64 3b 0a 20 20 70 50 61 67 65 72 2d 3e  = fd;.  pPager->
9150: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b  journalOpen = 0;
9160: 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  .  pPager->useJo
9170: 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e  urnal = useJourn
9180: 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20  al && !memDb;.  
9190: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
91a0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
91b0: 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20  stmtInUse = 0;. 
91c0: 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20   pPager->nRef = 
91d0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  0;.  pPager->dbS
91e0: 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20  ize = memDb-1;. 
91f0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
9200: 65 20 3d 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  e = SQLITE_PAGE_
9210: 53 49 5a 45 3b 0a 20 20 70 50 61 67 65 72 2d 3e  SIZE;.  pPager->
9220: 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 0a 20 20  stmtSize = 0;.  
9230: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
9240: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
9250: 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 50  >nPage = 0;.  pP
9260: 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d  ager->mxPage = m
9270: 78 50 61 67 65 3e 35 20 3f 20 6d 78 50 61 67 65  xPage>5 ? mxPage
9280: 20 3a 20 31 30 3b 0a 20 20 70 50 61 67 65 72 2d   : 10;.  pPager-
9290: 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f  >state = SQLITE_
92a0: 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72  UNLOCK;.  pPager
92b0: 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 0a 20  ->errMask = 0;. 
92c0: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
92d0: 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20  e = tempFile;.  
92e0: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20  pPager->memDb = 
92f0: 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
9300: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64  >readOnly = read
9310: 4f 6e 6c 79 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Only;.  pPager->
9320: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
9330: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
9340: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
9350: 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c  e || !useJournal
9360: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72  ;.  pPager->pFir
9370: 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  st = 0;.  pPager
9380: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
9390: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c   0;.  pPager->pL
93a0: 61 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ast = 0;.  pPage
93b0: 72 2d 3e 6e 45 78 74 72 61 20 3d 20 6e 45 78 74  r->nExtra = nExt
93c0: 72 61 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61  ra;.  memset(pPa
93d0: 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73  ger->aHash, 0, s
93e0: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48  izeof(pPager->aH
93f0: 61 73 68 29 29 3b 0a 20 20 2a 70 70 50 61 67 65  ash));.  *ppPage
9400: 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65  r = pPager;.  re
9410: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
9420: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
9430: 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   destructor for 
9440: 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20  this pager.  If 
9450: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65  not NULL, the de
9460: 73 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c 6c  structor is call
9470: 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 72  ed.** when the r
9480: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
9490: 6e 20 65 61 63 68 20 70 61 67 65 20 72 65 61 63  n each page reac
94a0: 68 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 64  hes zero.  The d
94b0: 65 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a  estructor can.**
94c0: 20 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65 61   be used to clea
94d0: 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  n up information
94e0: 20 69 6e 20 74 68 65 20 65 78 74 72 61 20 73 65   in the extra se
94f0: 67 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74  gment appended t
9500: 6f 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a  o each page..**.
9510: 2a 2a 20 54 68 65 20 64 65 73 74 72 75 63 74 6f  ** The destructo
9520: 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20  r is not called 
9530: 61 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c 69  as a result sqli
9540: 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29  te3pager_close()
9550: 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f  .  .** Destructo
9560: 72 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c  rs are only call
9570: 65 64 20 62 79 20 73 71 6c 69 74 65 33 70 61 67  ed by sqlite3pag
9580: 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76  er_unref()..*/.v
9590: 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
95a0: 5f 73 65 74 5f 64 65 73 74 72 75 63 74 6f 72 28  _set_destructor(
95b0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76  Pager *pPager, v
95c0: 6f 69 64 20 28 2a 78 44 65 73 63 29 28 76 6f 69  oid (*xDesc)(voi
95d0: 64 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67  d*,int)){.  pPag
95e0: 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20  er->xDestructor 
95f0: 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  = xDesc;.}../*.*
9600: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74  * Return the tot
9610: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
9620: 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66  es in the disk f
9630: 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ile associated w
9640: 69 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e 0a 2a  ith.** pPager..*
9650: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
9660: 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 50 61 67  er_pagecount(Pag
9670: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 6f  er *pPager){.  o
9680: 66 66 5f 74 20 6e 3b 0a 20 20 61 73 73 65 72 74  ff_t n;.  assert
9690: 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
96a0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
96b0: 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 72 65  ize>=0 ){.    re
96c0: 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 64 62 53  turn pPager->dbS
96d0: 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  ize;.  }.  if( s
96e0: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
96f0: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e  (&pPager->fd, &n
9700: 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
9710: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
9720: 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
9730: 5f 44 49 53 4b 3b 0a 20 20 20 20 72 65 74 75 72  _DISK;.    retur
9740: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 20 2f 3d 20  n 0;.  }.  n /= 
9750: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
9760: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
9770: 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 55 4e  state!=SQLITE_UN
9780: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  LOCK ){.    pPag
9790: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a  er->dbSize = n;.
97a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a    }.  return n;.
97b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64  }../*.** Forward
97c0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a   declaration.*/.
97d0: 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
97e0: 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a  ournal(Pager*);.
97f0: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61  ../*.** Unlink a
9800: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
9810: 72 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c 69  ree list (the li
9820: 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20  st of all pages 
9830: 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a  where nRef==0).*
9840: 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20 68  * and from its h
9850: 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68  ash collision ch
9860: 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ain..*/.static v
9870: 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50  oid unlinkPage(P
9880: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
9890: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
98a0: 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a  g->pPager;..  /*
98b0: 20 4b 65 65 70 20 74 68 65 20 70 46 69 72 73 74   Keep the pFirst
98c0: 53 79 6e 63 65 64 20 70 6f 69 6e 74 65 72 20 70  Synced pointer p
98d0: 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 66  ointing at the f
98e0: 69 72 73 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65  irst synchronize
98f0: 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20  d page */.  if( 
9900: 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69  pPg==pPager->pFi
9910: 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20  rstSynced ){.   
9920: 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d   PgHdr *p = pPg-
9930: 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
9940: 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e  while( p && p->n
9950: 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70  eedSync ){ p = p
9960: 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20  ->pNextFree; }. 
9970: 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
9980: 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d  tSynced = p;.  }
9990: 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72  ..  /* Unlink fr
99a0: 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  om the freelist 
99b0: 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50  */.  if( pPg->pP
99c0: 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 70  revFree ){.    p
99d0: 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70  Pg->pPrevFree->p
99e0: 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e  NextFree = pPg->
99f0: 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 65 6c  pNextFree;.  }el
9a00: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
9a10: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d  pPager->pFirst==
9a20: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65  pPg );.    pPage
9a30: 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d  r->pFirst = pPg-
9a40: 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 0a  >pNextFree;.  }.
9a50: 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
9a60: 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d  Free ){.    pPg-
9a70: 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65  >pNextFree->pPre
9a80: 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72  vFree = pPg->pPr
9a90: 65 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b  evFree;.  }else{
9aa0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
9ab0: 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20  ger->pLast==pPg 
9ac0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
9ad0: 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65  Last = pPg->pPre
9ae0: 76 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70 50 67  vFree;.  }.  pPg
9af0: 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50  ->pNextFree = pP
9b00: 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 30  g->pPrevFree = 0
9b10: 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66  ;..  /* Unlink f
9b20: 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68 61 73  rom the pgno has
9b30: 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28  h table */.  if(
9b40: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
9b50: 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  ){.    pPg->pNex
9b60: 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
9b70: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73   = pPg->pPrevHas
9b80: 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  h;.  }.  if( pPg
9b90: 2d 3e 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20  ->pPrevHash ){. 
9ba0: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73     pPg->pPrevHas
9bb0: 68 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  h->pNextHash = p
9bc0: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20  Pg->pNextHash;. 
9bd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
9be0: 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70  h = pager_hash(p
9bf0: 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61  Pg->pgno);.    a
9c00: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
9c10: 48 61 73 68 5b 68 5d 3d 3d 70 50 67 20 29 3b 0a  Hash[h]==pPg );.
9c20: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73      pPager->aHas
9c30: 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78  h[h] = pPg->pNex
9c40: 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 70 50 67  tHash;.  }.  pPg
9c50: 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
9c60: 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30  g->pPrevHash = 0
9c70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
9c80: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
9c90: 74 6f 20 74 72 75 6e 63 61 74 65 20 61 6e 20 69  to truncate an i
9ca0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
9cb0: 65 2e 20 20 44 65 6c 65 74 65 0a 2a 2a 20 65 76  e.  Delete.** ev
9cc0: 65 72 79 20 70 61 67 65 73 20 77 68 6f 73 65 20  ery pages whose 
9cd0: 70 67 6e 6f 20 69 73 20 6c 61 72 67 65 72 20 74  pgno is larger t
9ce0: 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69  han pPager->dbSi
9cf0: 7a 65 20 61 6e 64 20 69 73 20 75 6e 72 65 66 65  ze and is unrefe
9d00: 72 65 6e 63 65 64 2e 0a 2a 2a 20 52 65 66 65 72  renced..** Refer
9d10: 65 6e 63 65 64 20 70 61 67 65 73 20 6c 61 72 67  enced pages larg
9d20: 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e  er than pPager->
9d30: 64 62 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65  dbSize are zeroe
9d40: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
9d50: 64 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65  d memoryTruncate
9d60: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
9d70: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
9d80: 20 50 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20   PgHdr **ppPg;. 
9d90: 20 69 6e 74 20 64 62 53 69 7a 65 20 3d 20 70 50   int dbSize = pP
9da0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20  ager->dbSize;.. 
9db0: 20 70 70 50 67 20 3d 20 26 70 50 61 67 65 72 2d   ppPg = &pPager-
9dc0: 3e 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20  >pAll;.  while( 
9dd0: 28 70 50 67 20 3d 20 2a 70 70 50 67 29 21 3d 30  (pPg = *ppPg)!=0
9de0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d   ){.    if( pPg-
9df0: 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b  >pgno<=dbSize ){
9e00: 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70  .      ppPg = &p
9e10: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
9e20: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 67 2d    }else if( pPg-
9e30: 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 20  >nRef>0 ){.     
9e40: 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
9e50: 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70  _DATA(pPg), 0, p
9e60: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
9e70: 3b 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26  ;.      ppPg = &
9e80: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
9e90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9ea0: 2a 70 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65  *ppPg = pPg->pNe
9eb0: 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 75 6e 6c  xtAll;.      unl
9ec0: 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20  inkPage(pPg);.  
9ed0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
9ee0: 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  Pg);.      pPage
9ef0: 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20  r->nPage--;.    
9f00: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
9f10: 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65  runcate the file
9f20: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
9f30: 66 20 70 61 67 65 73 20 73 70 65 63 69 66 69 65  f pages specifie
9f40: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
9f50: 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28  3pager_truncate(
9f60: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
9f70: 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  gno nPage){.  in
9f80: 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67  t rc;.  if( pPag
9f90: 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20 29 7b 0a  er->dbSize<0 ){.
9fa0: 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
9fb0: 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  _pagecount(pPage
9fc0: 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  r);.  }.  if( pP
9fd0: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30  ager->errMask!=0
9fe0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
9ff0: 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65  er_errcode(pPage
a000: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
a010: 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61  c;.  }.  if( nPa
a020: 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29 70 50  ge>=(unsigned)pP
a030: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
a040: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a050: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
a060: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
a070: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
a080: 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
a090: 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28   memoryTruncate(
a0a0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
a0b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
a0c0: 20 7d 0a 20 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   }.  syncJournal
a0d0: 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d  (pPager);.  rc =
a0e0: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
a0f0: 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  te(&pPager->fd, 
a100: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
a110: 2a 28 6f 66 66 5f 74 29 6e 50 61 67 65 29 3b 0a  *(off_t)nPage);.
a120: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
a130: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
a140: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
a150: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
a160: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75  rc;.}../*.** Shu
a170: 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63  tdown the page c
a180: 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20  ache.  Free all 
a190: 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65  memory and close
a1a0: 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a   all files..**.*
a1b0: 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
a1c0: 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65  on was in progre
a1d0: 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ss when this rou
a1e0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
a1f0: 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  that.** transact
a200: 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
a210: 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e  ck.  All outstan
a220: 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
a230: 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e  nvalidated.** an
a240: 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69  d their memory i
a250: 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74  s freed.  Any at
a260: 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70  tempt to use a p
a270: 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  age associated.*
a280: 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  * with this page
a290: 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
a2a0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
a2b0: 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  ns will likely.*
a2c0: 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  * result in a co
a2d0: 72 65 64 75 6d 70 2e 0a 2a 2f 0a 69 6e 74 20 73  redump..*/.int s
a2e0: 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73  qlite3pager_clos
a2f0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
a300: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20  {.  PgHdr *pPg, 
a310: 2a 70 4e 65 78 74 3b 0a 20 20 73 77 69 74 63 68  *pNext;.  switch
a320: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  ( pPager->state 
a330: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
a340: 54 45 5f 57 52 49 54 45 4c 4f 43 4b 3a 20 7b 0a  TE_WRITELOCK: {.
a350: 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67        sqlite3pag
a360: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
a370: 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  er);.      if( !
a380: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
a390: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a3a0: 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72  OsUnlock(&pPager
a3b0: 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ->fd);.      }. 
a3c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a3d0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
a3e0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
a3f0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
a400: 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f  se SQLITE_READLO
a410: 43 4b 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  CK: {.      if( 
a420: 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29  !pPager->memDb )
a430: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
a440: 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  3OsUnlock(&pPage
a450: 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 7d 0a  r->fd);.      }.
a460: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a470: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
a480: 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
a490: 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62  thing */.      b
a4a0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
a4b0: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
a4c0: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
a4d0: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
a4e0: 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  xt = pPg->pNextA
a4f0: 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  ll;.    sqliteFr
a500: 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69  ee(pPg);.  }.  i
a510: 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44  f( !pPager->memD
a520: 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
a530: 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d  OsClose(&pPager-
a540: 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  >fd);.  }.  asse
a550: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
a560: 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20  nalOpen==0 );.  
a570: 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72  /* Temp files ar
a580: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
a590: 64 65 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f  deleted by the O
a5a0: 53 0a 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65  S.  ** if( pPage
a5b0: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
a5c0: 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f 73 44   **   sqlite3OsD
a5d0: 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46  elete(pPager->zF
a5e0: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d  ilename);.  ** }
a5f0: 0a 20 20 2a 2f 0a 20 20 43 4c 52 5f 50 41 47 45  .  */.  CLR_PAGE
a600: 52 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  R(pPager);.  if(
a610: 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
a620: 6d 65 21 3d 28 63 68 61 72 2a 29 26 70 50 61 67  me!=(char*)&pPag
a630: 65 72 5b 31 5d 20 29 7b 0a 20 20 20 20 61 73 73  er[1] ){.    ass
a640: 65 72 74 28 20 30 20 29 3b 20 20 2f 2a 20 43 61  ert( 0 );  /* Ca
a650: 6e 6e 6f 74 20 68 61 70 70 65 6e 20 2a 2f 0a 20  nnot happen */. 
a660: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
a670: 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
a680: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
a690: 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
a6a0: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  l);.    sqliteFr
a6b0: 65 65 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  ee(pPager->zDire
a6c0: 63 74 6f 72 79 29 3b 0a 20 20 7d 0a 20 20 73 71  ctory);.  }.  sq
a6d0: 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 29  liteFree(pPager)
a6e0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
a6f0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
a700: 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e  eturn the page n
a710: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67 69  umber for the gi
a720: 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  ven page data..*
a730: 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 70 61  /.Pgno sqlite3pa
a740: 67 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28 76  ger_pagenumber(v
a750: 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
a760: 67 48 64 72 20 2a 70 20 3d 20 44 41 54 41 5f 54  gHdr *p = DATA_T
a770: 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
a780: 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f    return p->pgno
a790: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  ;.}../*.** The p
a7a0: 61 67 65 5f 72 65 66 28 29 20 66 75 6e 63 74 69  age_ref() functi
a7b0: 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68  on increments th
a7c0: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
a7d0: 74 20 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a  t for a page..**
a7e0: 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
a7f0: 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65  currently on the
a800: 20 66 72 65 65 6c 69 73 74 20 28 74 68 65 20 72   freelist (the r
a810: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69  eference count i
a820: 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20  s zero) then.** 
a830: 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74  remove it from t
a840: 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a  he freelist..**.
a850: 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20  ** For non-test 
a860: 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65  systems, page_re
a870: 66 28 29 20 69 73 20 61 20 6d 61 63 72 6f 20 74  f() is a macro t
a880: 68 61 74 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f  hat calls _page_
a890: 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20  ref().** online 
a8a0: 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  of the reference
a8b0: 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20   count is zero. 
a8c0: 20 46 6f 72 20 74 65 73 74 20 73 79 73 74 65 6d   For test system
a8d0: 73 2c 20 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a  s, page_ref().**
a8e0: 20 69 73 20 61 20 72 65 61 6c 20 66 75 6e 63 74   is a real funct
a8f0: 69 6f 6e 20 73 6f 20 74 68 61 74 20 77 65 20 63  ion so that we c
a900: 61 6e 20 73 65 74 20 62 72 65 61 6b 70 6f 69 6e  an set breakpoin
a910: 74 73 20 61 6e 64 20 74 72 61 63 65 20 69 74 2e  ts and trace it.
a920: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a930: 5f 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20  _page_ref(PgHdr 
a940: 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
a950: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
a960: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73 20   /* The page is 
a970: 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65  currently on the
a980: 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f   freelist.  Remo
a990: 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66  ve it. */.    if
a9a0: 28 20 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61 67  ( pPg==pPg->pPag
a9b0: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
a9c0: 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20   ){.      PgHdr 
a9d0: 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  *p = pPg->pNextF
a9e0: 72 65 65 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  ree;.      while
a9f0: 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79  ( p && p->needSy
aa00: 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65  nc ){ p = p->pNe
aa10: 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 20 20  xtFree; }.      
aa20: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69  pPg->pPager->pFi
aa30: 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20  rstSynced = p;. 
aa40: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67     }.    if( pPg
aa50: 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20  ->pPrevFree ){. 
aa60: 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46       pPg->pPrevF
aa70: 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  ree->pNextFree =
aa80: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
aa90: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
aaa0: 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
aab0: 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65  First = pPg->pNe
aac0: 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20  xtFree;.    }.  
aad0: 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
aae0: 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
aaf0: 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50  g->pNextFree->pP
ab00: 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  revFree = pPg->p
ab10: 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 65  PrevFree;.    }e
ab20: 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
ab30: 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
ab40: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a  pPg->pPrevFree;.
ab50: 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70      }.    pPg->p
ab60: 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  Pager->nRef++;. 
ab70: 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b   }.  pPg->nRef++
ab80: 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29  ;.  REFINFO(pPg)
ab90: 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ;.}.#ifdef SQLIT
aba0: 45 5f 54 45 53 54 0a 20 20 73 74 61 74 69 63 20  E_TEST.  static 
abb0: 76 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50 67  void page_ref(Pg
abc0: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69  Hdr *pPg){.    i
abd0: 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
abe0: 29 7b 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72  ){.      _page_r
abf0: 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c  ef(pPg);.    }el
ac00: 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  se{.      pPg->n
ac10: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46  Ref++;.      REF
ac20: 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d  INFO(pPg);.    }
ac30: 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  .  }.#else.# def
ac40: 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29 20  ine page_ref(P) 
ac50: 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f    ((P)->nRef==0?
ac60: 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f  _page_ref(P):(vo
ac70: 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a  id)(P)->nRef++).
ac80: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
ac90: 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
aca0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
acb0: 61 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70  a page.  The inp
acc0: 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a  ut pointer is.**
acd0: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
ace0: 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  the page data..*
acf0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
ad00: 65 72 5f 72 65 66 28 76 6f 69 64 20 2a 70 44 61  er_ref(void *pDa
ad10: 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
ad20: 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
ad30: 52 28 70 44 61 74 61 29 3b 0a 20 20 70 61 67 65  R(pData);.  page
ad40: 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74  _ref(pPg);.  ret
ad50: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
ad60: 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
ad70: 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74   journal.  In ot
ad80: 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20  her words, make 
ad90: 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67  sure all the pag
ada0: 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  es that have.** 
adb0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
adc0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65  the journal have
add0: 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65   actually reache
ade0: 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66  d the surface of
adf0: 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49   the.** disk.  I
ae00: 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f  t is not safe to
ae10: 20 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67   modify the orig
ae20: 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
ae30: 6c 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a  le until after.*
ae40: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  * the journal ha
ae50: 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20  s been synced.  
ae60: 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  If the original 
ae70: 64 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69  database is modi
ae80: 66 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74  fied before.** t
ae90: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
aea0: 6e 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72  nced and a power
aeb0: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c   failure occurs,
aec0: 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f   the unsynced jo
aed0: 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f  urnal.** data wo
aee0: 75 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20  uld be lost and 
aef0: 77 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62  we would be unab
af00: 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79  le to completely
af10: 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a   rollback the.**
af20: 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   database change
af30: 73 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72  s.  Database cor
af40: 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63  ruption would oc
af50: 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73  cur..** .** This
af60: 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70   routine also up
af70: 64 61 74 65 73 20 74 68 65 20 6e 52 65 63 20 66  dates the nRec f
af80: 69 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64  ield in the head
af90: 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  er of the journa
afa0: 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65  l..** (See comme
afb0: 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72  nts on the pager
afc0: 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74  _playback() rout
afd0: 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ine for addition
afe0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29  al information.)
aff0: 0a 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20  .** If the sync 
b000: 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77  mode is FULL, tw
b010: 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63  o syncs will occ
b020: 75 72 2e 20 20 46 69 72 73 74 20 74 68 65 20 77  ur.  First the w
b030: 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  hole journal.** 
b040: 69 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20  is synced, then 
b050: 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
b060: 73 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20  s updated, then 
b070: 61 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63  a second sync oc
b080: 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  curs..**.** For 
b090: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
b0a0: 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63  ses, we do not c
b0b0: 61 72 65 20 69 66 20 77 65 20 61 72 65 20 61 62  are if we are ab
b0c0: 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a  le to rollback.*
b0d0: 2a 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 20  * after a power 
b0e0: 66 61 69 6c 75 72 65 2c 20 73 6f 20 73 79 6e 63  failure, so sync
b0f0: 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54   occurs..**.** T
b100: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61  his routine clea
b110: 72 73 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20  rs the needSync 
b120: 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20 70  field of every p
b130: 61 67 65 20 63 75 72 72 65 6e 74 20 68 65 6c 64  age current held
b140: 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a   in.** memory..*
b150: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
b160: 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  cJournal(Pager *
b170: 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
b180: 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20   *pPg;.  int rc 
b190: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
b1a0: 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  /* Sync the jour
b1b0: 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69 66  nal before modif
b1c0: 79 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61  ying the main da
b1d0: 74 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73 73  tabase.  ** (ass
b1e0: 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20 61  uming there is a
b1f0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74 20   journal and it 
b200: 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
b210: 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ed.).  */.  if( 
b220: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
b230: 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61   ){.    if( !pPa
b240: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
b250: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
b260: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
b270: 65 6e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 61  en );.      /* a
b280: 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
b290: 6e 6f 53 79 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53  noSync ); // noS
b2a0: 79 6e 63 20 6d 69 67 68 74 20 62 65 20 73 65 74  ync might be set
b2b0: 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a   if synchronous.
b2c0: 20 20 20 20 20 20 2a 2a 20 77 61 73 20 74 75 72        ** was tur
b2d0: 6e 65 64 20 6f 66 66 20 61 66 74 65 72 20 74 68  ned off after th
b2e0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
b2f0: 73 20 73 74 61 72 74 65 64 2e 20 20 54 69 63 6b  s started.  Tick
b300: 65 74 20 23 36 31 35 20 2a 2f 0a 23 69 66 6e 64  et #615 */.#ifnd
b310: 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 20 20  ef NDEBUG.      
b320: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b  {.        /* Mak
b330: 65 20 73 75 72 65 20 74 68 65 20 70 50 61 67 65  e sure the pPage
b340: 72 2d 3e 6e 52 65 63 20 63 6f 75 6e 74 65 72 20  r->nRec counter 
b350: 77 65 20 61 72 65 20 6b 65 65 70 69 6e 67 20 61  we are keeping a
b360: 67 72 65 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  grees.        **
b370: 20 77 69 74 68 20 74 68 65 20 6e 52 65 63 20 63   with the nRec c
b380: 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
b390: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
b3a0: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
b3b0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66     */.        of
b3c0: 66 5f 74 20 68 64 72 53 7a 2c 20 70 67 53 7a 2c  f_t hdrSz, pgSz,
b3d0: 20 6a 53 7a 3b 0a 20 20 20 20 20 20 20 20 68 64   jSz;.        hd
b3e0: 72 53 7a 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  rSz = JOURNAL_HD
b3f0: 52 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72  R_SZ(journal_for
b400: 6d 61 74 29 3b 0a 20 20 20 20 20 20 20 20 70 67  mat);.        pg
b410: 53 7a 20 3d 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  Sz = JOURNAL_PG_
b420: 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61  SZ(journal_forma
b430: 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  t);.        rc =
b440: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
b450: 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ze(&pPager->jfd,
b460: 20 26 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20 20   &jSz);.        
b470: 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
b480: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 61  rn rc;.        a
b490: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
b4a0: 52 65 63 2a 70 67 53 7a 2b 68 64 72 53 7a 3d 3d  Rec*pgSz+hdrSz==
b4b0: 6a 53 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23  jSz );.      }.#
b4c0: 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
b4d0: 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 3e 3d  journal_format>=
b4e0: 33 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  3 ){.        /* 
b4f0: 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76  Write the nRec v
b500: 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  alue into the jo
b510: 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65  urnal file heade
b520: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66  r */.        off
b530: 5f 74 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20  _t szJ;.        
b540: 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
b550: 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
b560: 20 20 54 52 41 43 45 31 28 22 53 59 4e 43 5c 6e    TRACE1("SYNC\n
b570: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ");.          rc
b580: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
b590: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  (&pPager->jfd);.
b5a0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
b5b0: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
b5c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b5d0: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b     sqlite3OsSeek
b5e0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 73  (&pPager->jfd, s
b5f0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
b600: 67 69 63 31 29 29 3b 0a 20 20 20 20 20 20 20 20  gic1));.        
b610: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
b620: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  (&pPager->jfd, p
b630: 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20  Pager->nRec);.  
b640: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
b650: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
b660: 20 20 73 7a 4a 20 3d 20 4a 4f 55 52 4e 41 4c 5f    szJ = JOURNAL_
b670: 48 44 52 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66  HDR_SZ(journal_f
b680: 6f 72 6d 61 74 29 20 2b 0a 20 20 20 20 20 20 20  ormat) +.       
b690: 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
b6a0: 2d 3e 6e 52 65 63 2a 4a 4f 55 52 4e 41 4c 5f 50  ->nRec*JOURNAL_P
b6b0: 47 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72  G_SZ(journal_for
b6c0: 6d 61 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  mat);.        sq
b6d0: 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
b6e0: 67 65 72 2d 3e 6a 66 64 2c 20 73 7a 4a 29 3b 0a  ger->jfd, szJ);.
b6f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52        }.      TR
b700: 41 43 45 31 28 22 53 59 4e 43 5c 6e 22 29 3b 0a  ACE1("SYNC\n");.
b710: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
b720: 65 33 4f 73 53 79 6e 63 28 26 70 50 61 67 65 72  e3OsSync(&pPager
b730: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66  ->jfd);.      if
b740: 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
b750: 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61 67 65   rc;.      pPage
b760: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
b770: 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  d = 1;.    }.   
b780: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
b790: 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45  c = 0;..    /* E
b7a0: 72 61 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e  rase the needSyn
b7b0: 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72  c flag from ever
b7c0: 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  y page..    */. 
b7d0: 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
b7e0: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
b7f0: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
b800: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  {.      pPg->nee
b810: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d  dSync = 0;.    }
b820: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69  .    pPager->pFi
b830: 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67  rstSynced = pPag
b840: 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a  er->pFirst;.  }.
b850: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
b860: 20 20 2f 2a 20 49 66 20 74 68 65 20 50 61 67 65    /* If the Page
b870: 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  r.needSync flag 
b880: 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 74 68  is clear then th
b890: 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
b8a0: 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20  .  ** flag must 
b8b0: 61 6c 73 6f 20 62 65 20 63 6c 65 61 72 20 66 6f  also be clear fo
b8c0: 72 20 61 6c 6c 20 70 61 67 65 73 2e 20 20 56 65  r all pages.  Ve
b8d0: 72 69 66 79 20 74 68 61 74 20 74 68 69 73 0a 20  rify that this. 
b8e0: 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20 69 73   ** invariant is
b8f0: 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c   true..  */.  el
b900: 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d  se{.    for(pPg=
b910: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
b920: 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
b930: 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73 73  tAll){.      ass
b940: 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79  ert( pPg->needSy
b950: 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  nc==0 );.    }. 
b960: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
b970: 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d  r->pFirstSynced=
b980: 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20  =pPager->pFirst 
b990: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
b9a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b9b0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69 73  *.** Given a lis
b9c0: 74 20 6f 66 20 70 61 67 65 73 20 28 63 6f 6e 6e  t of pages (conn
b9d0: 65 63 74 65 64 20 62 79 20 74 68 65 20 50 67 48  ected by the PgH
b9e0: 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65  dr.pDirty pointe
b9f0: 72 29 20 77 72 69 74 65 0a 2a 2a 20 65 76 65 72  r) write.** ever
ba00: 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70  y one of those p
ba10: 61 67 65 73 20 6f 75 74 20 74 6f 20 74 68 65 20  ages out to the 
ba20: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
ba30: 64 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a  d mark them all.
ba40: 2a 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a  ** as clean..*/.
ba50: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
ba60: 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
ba70: 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20  PgHdr *pList){. 
ba80: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
ba90: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
baa0: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
bab0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
bac0: 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e  pPager = pList->
bad0: 70 50 61 67 65 72 3b 0a 20 20 77 68 69 6c 65 28  pPager;.  while(
bae0: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 61 73   pList ){.    as
baf0: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 64 69 72  sert( pList->dir
bb00: 74 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ty );.    sqlite
bb10: 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
bb20: 3e 66 64 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e  >fd, (pList->pgn
bb30: 6f 2d 31 29 2a 28 6f 66 66 5f 74 29 53 51 4c 49  o-1)*(off_t)SQLI
bb40: 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  TE_PAGE_SIZE);. 
bb50: 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
bb60: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
bb70: 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67  List), pList->pg
bb80: 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 54 52 41 43  no, 6);.    TRAC
bb90: 45 32 28 22 53 54 4f 52 45 20 25 64 5c 6e 22 2c  E2("STORE %d\n",
bba0: 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20   pList->pgno);. 
bbb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
bbc0: 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
bbd0: 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  fd, PGHDR_TO_DAT
bbe0: 41 28 70 4c 69 73 74 29 2c 20 53 51 4c 49 54 45  A(pList), SQLITE
bbf0: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
bc00: 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 50   CODEC(pPager, P
bc10: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69  GHDR_TO_DATA(pLi
bc20: 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  st), pList->pgno
bc30: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
bc40: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
bc50: 20 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 3d    pList->dirty =
bc60: 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   0;.    pList = 
bc70: 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20  pList->pDirty;. 
bc80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
bc90: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
bca0: 43 6f 6c 6c 65 63 74 20 65 76 65 72 79 20 64 69  Collect every di
bcb0: 72 74 79 20 70 61 67 65 20 69 6e 74 6f 20 61 20  rty page into a 
bcc0: 64 69 72 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a  dirty list and.*
bcd0: 2a 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * return a point
bce0: 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f  er to the head o
bcf0: 66 20 74 68 61 74 20 6c 69 73 74 2e 20 20 41 6c  f that list.  Al
bd00: 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 63  l pages are.** c
bd10: 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66  ollected even if
bd20: 20 74 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20   they are still 
bd30: 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
bd40: 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 67  c PgHdr *pager_g
bd50: 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67  et_all_dirty_pag
bd60: 65 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  es(Pager *pPager
bd70: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 2c 20 2a  ){.  PgHdr *p, *
bd80: 70 4c 69 73 74 3b 0a 20 20 70 4c 69 73 74 20 3d  pList;.  pList =
bd90: 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 67   0;.  for(p=pPag
bda0: 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70  er->pAll; p; p=p
bdb0: 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
bdc0: 20 69 66 28 20 70 2d 3e 64 69 72 74 79 20 29 7b   if( p->dirty ){
bdd0: 0a 20 20 20 20 20 20 70 2d 3e 70 44 69 72 74 79  .      p->pDirty
bde0: 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20   = pList;.      
bdf0: 70 4c 69 73 74 20 3d 20 70 3b 0a 20 20 20 20 7d  pList = p;.    }
be00: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c  .  }.  return pL
be10: 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  ist;.}../*.** Ac
be20: 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a  quire a page..**
be30: 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20  .** A read lock 
be40: 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
be50: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65   is obtained whe
be60: 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  n the first page
be70: 20 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a   is acquired. .*
be80: 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b  * This read lock
be90: 20 69 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e   is dropped when
bea0: 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
beb0: 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  s released..**.*
bec0: 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b 73 20 66  * A _get works f
bed0: 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62  or any page numb
bee0: 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
bef0: 30 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  0.  If the datab
bf00: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73  ase.** file is s
bf10: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
bf20: 72 65 71 75 65 73 74 65 64 20 70 61 67 65 2c 20  requested page, 
bf30: 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64  then no actual d
bf40: 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75  isk.** read occu
bf50: 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72  rs and the memor
bf60: 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70  y image of the p
bf70: 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  age is initializ
bf80: 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72  ed to.** all zer
bf90: 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61 20 64  os.  The extra d
bfa0: 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ata appended to 
bfb0: 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73  a page is always
bfc0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20   initialized.** 
bfd0: 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72  to zeros the fir
bfe0: 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  st time a page i
bff0: 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65  s loaded into me
c000: 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  mory..**.** The 
c010: 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68  acquisition migh
c020: 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72  t fail for sever
c030: 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20  al reasons.  In 
c040: 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e  all cases,.** an
c050: 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
c060: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
c070: 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20  ned and *ppPage 
c080: 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
c090: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
c0a0: 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b  qlite3pager_look
c0b0: 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73  up().  Both this
c0c0: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f   routine and _lo
c0d0: 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a  okup() attempt.*
c0e0: 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  * to find a page
c0f0: 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
c100: 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20  y cache first.  
c110: 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  If the page is n
c120: 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
c130: 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f   memory, this ro
c140: 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69  utine goes to di
c150: 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e  sk to read it in
c160: 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70   whereas _lookup
c170: 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72  ().** just retur
c180: 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74  ns 0.  This rout
c190: 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72  ine acquires a r
c1a0: 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72  ead-lock the fir
c1b0: 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61  st time it.** ha
c1c0: 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c  s to go to disk,
c1d0: 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20   and could also 
c1e0: 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20  playback an old 
c1f0: 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73  journal if neces
c200: 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f  sary..** Since _
c210: 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67  lookup() never g
c220: 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20  oes to disk, it 
c230: 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61  never has to dea
c240: 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20  l with locks.** 
c250: 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  or journal files
c260: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
c270: 70 61 67 65 72 5f 67 65 74 28 50 61 67 65 72 20  pager_get(Pager 
c280: 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
c290: 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50 61 67  no, void **ppPag
c2a0: 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  e){.  PgHdr *pPg
c2b0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  ;.  int rc;..  /
c2c0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
c2d0: 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20  ave not hit any 
c2e0: 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e  critical errors.
c2f0: 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28  .  */ .  assert(
c300: 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
c310: 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
c320: 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30  );.  *ppPage = 0
c330: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
c340: 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45  errMask & ~(PAGE
c350: 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20  R_ERR_FULL) ){. 
c360: 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
c370: 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
c380: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
c390: 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
c3a0: 70 61 67 65 20 61 63 63 65 73 73 65 64 2c 20 74  page accessed, t
c3b0: 68 65 6e 20 67 65 74 20 61 20 72 65 61 64 20 6c  hen get a read l
c3c0: 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ock.  ** on the 
c3d0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
c3e0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
c3f0: 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21 70 50  ->nRef==0 && !pP
c400: 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
c410: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
c420: 73 52 65 61 64 4c 6f 63 6b 28 26 70 50 61 67 65  sReadLock(&pPage
c430: 72 2d 3e 66 64 29 3b 0a 20 20 20 20 69 66 28 20  r->fd);.    if( 
c440: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
c450: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
c460: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
c470: 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49  er->state = SQLI
c480: 54 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 0a 20 20  TE_READLOCK;..  
c490: 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61    /* If a journa
c4a0: 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74  l file exists, t
c4b0: 72 79 20 74 6f 20 70 6c 61 79 20 69 74 20 62 61  ry to play it ba
c4c0: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ck..    */.    i
c4d0: 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  f( pPager->useJo
c4e0: 75 72 6e 61 6c 20 26 26 20 73 71 6c 69 74 65 33  urnal && sqlite3
c4f0: 4f 73 46 69 6c 65 45 78 69 73 74 73 28 70 50 61  OsFileExists(pPa
c500: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20 29  ger->zJournal) )
c510: 7b 0a 20 20 20 20 20 20 20 69 6e 74 20 72 63 3b  {.       int rc;
c520: 0a 0a 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20  ..       /* Get 
c530: 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  a write lock on 
c540: 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
c550: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63      */.       rc
c560: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
c570: 65 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  eLock(&pPager->f
c580: 64 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72  d);.       if( r
c590: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
c5a0: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
c5b0: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50  ite3OsUnlock(&pP
c5c0: 61 67 65 72 2d 3e 66 64 29 21 3d 53 51 4c 49 54  ager->fd)!=SQLIT
c5d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
c5e0: 20 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c     /* This shoul
c5f0: 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 21 20  d never happen! 
c600: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 72 63  */.           rc
c610: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e   = SQLITE_INTERN
c620: 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 7d 0a 20  AL;.         }. 
c630: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
c640: 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20  c;.       }.    
c650: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
c660: 20 3d 20 53 51 4c 49 54 45 5f 57 52 49 54 45 4c   = SQLITE_WRITEL
c670: 4f 43 4b 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20  OCK;..       /* 
c680: 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
c690: 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c   for reading onl
c6a0: 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  y.  Return SQLIT
c6b0: 45 5f 42 55 53 59 20 69 66 0a 20 20 20 20 20 20  E_BUSY if.      
c6c0: 20 2a 2a 20 77 65 20 61 72 65 20 75 6e 61 62 6c   ** we are unabl
c6d0: 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f  e to open the jo
c6e0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20  urnal file. .   
c6f0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 2a 2a      **.       **
c700: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
c710: 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  e does not need 
c720: 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69 74 73  to be locked its
c730: 65 6c 66 2e 20 20 54 68 65 0a 20 20 20 20 20 20  elf.  The.      
c740: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
c750: 20 69 73 20 6e 65 76 65 72 20 6f 70 65 6e 20 75   is never open u
c760: 6e 6c 65 73 73 20 74 68 65 20 6d 61 69 6e 20 64  nless the main d
c770: 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c  atabase file hol
c780: 64 73 0a 20 20 20 20 20 20 20 2a 2a 20 61 20 77  ds.       ** a w
c790: 72 69 74 65 20 6c 6f 63 6b 2c 20 73 6f 20 74 68  rite lock, so th
c7a0: 65 72 65 20 69 73 20 6e 65 76 65 72 20 61 6e 79  ere is never any
c7b0: 20 63 68 61 6e 63 65 20 6f 66 20 74 77 6f 20 6f   chance of two o
c7c0: 72 20 6d 6f 72 65 0a 20 20 20 20 20 20 20 2a 2a  r more.       **
c7d0: 20 70 72 6f 63 65 73 73 65 73 20 6f 70 65 6e 69   processes openi
c7e0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  ng the journal a
c7f0: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
c800: 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  .       */.     
c810: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
c820: 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 70 50 61  OpenReadOnly(pPa
c830: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26  ger->zJournal, &
c840: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
c850: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
c860: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
c870: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
c880: 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d  sUnlock(&pPager-
c890: 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 61  >fd);.         a
c8a0: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
c8b0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  E_OK );.        
c8c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
c8d0: 55 53 59 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20  USY;.       }.  
c8e0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
c8f0: 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  rnalOpen = 1;.  
c900: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
c910: 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
c920: 0a 0a 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79  ..       /* Play
c930: 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20  back and delete 
c940: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72  the journal.  Dr
c950: 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  op the database 
c960: 77 72 69 74 65 0a 20 20 20 20 20 20 20 2a 2a 20  write.       ** 
c970: 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69  lock and reacqui
c980: 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  re the read lock
c990: 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ..       */.    
c9a0: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
c9b0: 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30  ayback(pPager, 0
c9c0: 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63  );.       if( rc
c9d0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
c9e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
c9f0: 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20  c;.       }.    
ca00: 7d 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20  }.    pPg = 0;. 
ca10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53   }else{.    /* S
ca20: 65 61 72 63 68 20 66 6f 72 20 70 61 67 65 20 69  earch for page i
ca30: 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 20 20 70  n cache */.    p
ca40: 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
ca50: 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
ca60: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
ca70: 3e 6d 65 6d 44 62 20 26 26 20 70 50 61 67 65 72  >memDb && pPager
ca80: 2d 3e 73 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f  ->state==SQLITE_
ca90: 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  UNLOCK ){.      
caa0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
cab0: 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3b  SQLITE_READLOCK;
cac0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
cad0: 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   pPg==0 ){.    /
cae0: 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
caf0: 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74  page is not in t
cb00: 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a  he page cache. *
cb10: 2f 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20  /.    int h;.   
cb20: 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 2b 2b   pPager->nMiss++
cb30: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
cb40: 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65 72 2d 3e  ->nPage<pPager->
cb50: 6d 78 50 61 67 65 20 7c 7c 20 70 50 61 67 65 72  mxPage || pPager
cb60: 2d 3e 70 46 69 72 73 74 3d 3d 30 20 7c 7c 20 70  ->pFirst==0 || p
cb70: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
cb80: 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20        /* Create 
cb90: 61 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a 20 20  a new page */.  
cba0: 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
cbb0: 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f  MallocRaw( sizeo
cbc0: 66 28 2a 70 50 67 29 20 2b 20 53 51 4c 49 54 45  f(*pPg) + SQLITE
cbd0: 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20  _PAGE_SIZE .    
cbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbf0: 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65            + size
cc00: 6f 66 28 75 33 32 29 20 2b 20 70 50 61 67 65 72  of(u32) + pPager
cc10: 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20  ->nExtra.       
cc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc30: 20 20 20 20 20 20 20 2b 20 70 50 61 67 65 72 2d         + pPager-
cc40: 3e 6d 65 6d 44 62 2a 73 69 7a 65 6f 66 28 50 67  >memDb*sizeof(Pg
cc50: 48 69 73 74 6f 72 79 29 20 29 3b 0a 20 20 20 20  History) );.    
cc60: 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a    if( pPg==0 ){.
cc70: 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e          pager_un
cc80: 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
cc90: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
cca0: 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41  r->errMask |= PA
ccb0: 47 45 52 5f 45 52 52 5f 4d 45 4d 3b 0a 20 20 20  GER_ERR_MEM;.   
ccc0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
ccd0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
cce0: 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  }.      memset(p
ccf0: 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  Pg, 0, sizeof(*p
cd00: 50 67 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Pg));.      if( 
cd10: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
cd20: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
cd30: 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
cd40: 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 73  g, pPager), 0, s
cd50: 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29  izeof(PgHistory)
cd60: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
cd70: 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70   pPg->pPager = p
cd80: 50 61 67 65 72 3b 0a 20 20 20 20 20 20 70 50 67  Pager;.      pPg
cd90: 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61  ->pNextAll = pPa
cda0: 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 20  ger->pAll;.     
cdb0: 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20   pPager->pAll = 
cdc0: 70 50 67 3b 0a 20 20 20 20 20 20 70 50 61 67 65  pPg;.      pPage
cdd0: 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20  r->nPage++;.    
cde0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
cdf0: 46 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72  Find a page to r
ce00: 65 63 79 63 6c 65 2e 20 20 54 72 79 20 74 6f 20  ecycle.  Try to 
ce10: 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 74 68  locate a page th
ce20: 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20  at does not.    
ce30: 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75 73 20    ** require us 
ce40: 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63 28 29  to do an fsync()
ce50: 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   on the journal.
ce60: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
ce70: 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  pPg = pPager->pF
ce80: 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20 20  irstSynced;..   
ce90: 20 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c     /* If we coul
cea0: 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67  d not find a pag
ceb0: 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
cec0: 72 65 71 75 69 72 65 20 61 6e 20 66 73 79 6e 63  require an fsync
ced0: 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  ().      ** on t
cee0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
cef0: 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20 6a  then fsync the j
cf00: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68  ournal file.  Th
cf10: 69 73 20 69 73 20 61 0a 20 20 20 20 20 20 2a 2a  is is a.      **
cf20: 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65 72 61   very slow opera
cf30: 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b  tion, so we work
cf40: 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64 20 69   hard to avoid i
cf50: 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69 6d 65  t.  But sometime
cf60: 73 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61  s.      ** it ca
cf70: 6e 27 74 20 62 65 20 68 65 6c 70 65 64 2e 0a 20  n't be helped.. 
cf80: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
cf90: 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
cfa0: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 79 6e      int rc = syn
cfb0: 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
cfc0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
cfd0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
cfe0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
cff0: 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
d000: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
d010: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
d020: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d030: 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70   pPg = pPager->p
d040: 46 69 72 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  First;.      }. 
d050: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
d060: 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20  ->nRef==0 );..  
d070: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
d080: 20 70 61 67 65 20 74 6f 20 74 68 65 20 64 61 74   page to the dat
d090: 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 69 74  abase file if it
d0a0: 20 69 73 20 64 69 72 74 79 2e 0a 20 20 20 20 20   is dirty..     
d0b0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
d0c0: 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  g->dirty ){.    
d0d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
d0e0: 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a  >needSync==0 );.
d0f0: 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 44 69          pPg->pDi
d100: 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rty = 0;.       
d110: 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
d120: 65 5f 70 61 67 65 6c 69 73 74 28 20 70 50 67 20  e_pagelist( pPg 
d130: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
d140: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
d150: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d160: 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
d170: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
d180: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d190: 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20  _IOERR;.        
d1a0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
d1b0: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72  assert( pPg->dir
d1c0: 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  ty==0 );..      
d1d0: 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 77  /* If the page w
d1e0: 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e 67 20  e are recycling 
d1f0: 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77  is marked as alw
d200: 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  aysRollback, the
d210: 6e 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74  n.      ** set t
d220: 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73  he global always
d230: 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74  Rollback flag, t
d240: 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20 74 68  hus disabling th
d250: 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  e.      ** sqlit
d260: 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  e_dont_rollback(
d270: 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66  ) optimization f
d280: 6f 72 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  or the rest of t
d290: 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  his transaction.
d2a0: 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20  .      ** It is 
d2b0: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 6f 20  necessary to do 
d2c0: 74 68 69 73 20 62 65 63 61 75 73 65 20 74 68 65  this because the
d2d0: 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77   page marked alw
d2e0: 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 20 20  aysRollback.    
d2f0: 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 72 65    ** might be re
d300: 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61 74 65  loaded at a late
d310: 72 20 74 69 6d 65 20 62 75 74 20 61 74 20 74 68  r time but at th
d320: 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e 27  at point we won'
d330: 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 20 20 20  t remember.     
d340: 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61 73 20   ** that is was 
d350: 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c  marked alwaysRol
d360: 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d 65 61  lback.  This mea
d370: 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  ns that all page
d380: 73 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20  s must.      ** 
d390: 62 65 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77  be marked as alw
d3a0: 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d  aysRollback from
d3b0: 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20   here on out..  
d3c0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
d3d0: 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c   pPg->alwaysRoll
d3e0: 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  back ){.        
d3f0: 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
d400: 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20  llback = 1;.    
d410: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55 6e    }..      /* Un
d420: 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67  link the old pag
d430: 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20  e from the free 
d440: 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68 61 73  list and the has
d450: 68 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2f  h table.      */
d460: 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67  .      unlinkPag
d470: 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50  e(pPg);.      pP
d480: 61 67 65 72 2d 3e 6e 4f 76 66 6c 2b 2b 3b 0a 20  ager->nOvfl++;. 
d490: 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 67     }.    pPg->pg
d4a0: 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 69  no = pgno;.    i
d4b0: 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  f( pPager->aInJo
d4c0: 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67  urnal && (int)pg
d4d0: 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67  no<=pPager->orig
d4e0: 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  DbSize ){.      
d4f0: 73 71 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f  sqlite3CheckMemo
d500: 72 79 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ry(pPager->aInJo
d510: 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a  urnal, pgno/8);.
d520: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
d530: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
d540: 6e 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  n );.      pPg->
d550: 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61  inJournal = (pPa
d560: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
d570: 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70  pgno/8] & (1<<(p
d580: 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20  gno&7)))!=0;.   
d590: 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
d5a0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
d5b0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
d5c0: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
d5d0: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
d5e0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
d5f0: 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
d600: 74 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d  t && (int)pgno<=
d610: 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
d620: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
d630: 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d   (pPager->aInStm
d640: 74 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c  t[pgno/8] & (1<<
d650: 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 20 29 7b  (pgno&7)))!=0 ){
d660: 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f  .      page_add_
d670: 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
d680: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
d690: 20 20 20 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f      page_remove_
d6a0: 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70  from_stmt_list(p
d6b0: 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  Pg);.    }.    p
d6c0: 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
d6d0: 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31     pPg->nRef = 1
d6e0: 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50  ;.    REFINFO(pP
d6f0: 67 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  g);.    pPager->
d700: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 68 20 3d 20  nRef++;.    h = 
d710: 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29  pager_hash(pgno)
d720: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
d730: 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61  Hash = pPager->a
d740: 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61  Hash[h];.    pPa
d750: 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20  ger->aHash[h] = 
d760: 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67  pPg;.    if( pPg
d770: 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20  ->pNextHash ){. 
d780: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
d790: 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
d7a0: 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
d7b0: 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
d7c0: 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  h->pPrevHash = p
d7d0: 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  Pg;.    }.    if
d7e0: 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  ( pPager->nExtra
d7f0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  >0 ){.      mems
d800: 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52  et(PGHDR_TO_EXTR
d810: 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65  A(pPg), 0, pPage
d820: 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  r->nExtra);.    
d830: 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
d840: 2d 3e 64 62 53 69 7a 65 3c 30 20 29 20 73 71 6c  ->dbSize<0 ) sql
d850: 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
d860: 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  unt(pPager);.   
d870: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
d880: 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20  Mask!=0 ){.     
d890: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
d8a0: 72 65 66 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  ref(PGHDR_TO_DAT
d8b0: 41 28 70 50 67 29 29 3b 0a 20 20 20 20 20 20 72  A(pPg));.      r
d8c0: 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64  c = pager_errcod
d8d0: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
d8e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
d8f0: 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
d900: 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 67  ->dbSize<(int)pg
d910: 6e 6f 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  no ){.      mems
d920: 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  et(PGHDR_TO_DATA
d930: 28 70 50 67 29 2c 20 30 2c 20 53 51 4c 49 54 45  (pPg), 0, SQLITE
d940: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
d950: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
d960: 74 20 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65  t rc;.      asse
d970: 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  rt( pPager->memD
d980: 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  b==0 );.      sq
d990: 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
d9a0: 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31  ger->fd, (pgno-1
d9b0: 29 2a 28 6f 66 66 5f 74 29 53 51 4c 49 54 45 5f  )*(off_t)SQLITE_
d9c0: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
d9d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
d9e0: 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e 66 64  Read(&pPager->fd
d9f0: 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
da00: 70 50 67 29 2c 20 53 51 4c 49 54 45 5f 50 41 47  pPg), SQLITE_PAG
da10: 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 54  E_SIZE);.      T
da20: 52 41 43 45 32 28 22 46 45 54 43 48 20 25 64 5c  RACE2("FETCH %d\
da30: 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  n", pPg->pgno);.
da40: 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
da50: 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  er, PGHDR_TO_DAT
da60: 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e  A(pPg), pPg->pgn
da70: 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20 69 66 28  o, 3);.      if(
da80: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
da90: 7b 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20  {.        off_t 
daa0: 66 69 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  fileSize;.      
dab0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46    if( sqlite3OsF
dac0: 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d  ileSize(&pPager-
dad0: 3e 66 64 2c 26 66 69 6c 65 53 69 7a 65 29 21 3d  >fd,&fileSize)!=
dae0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20  SQLITE_OK.      
daf0: 20 20 20 20 20 20 20 20 20 7c 7c 20 66 69 6c 65           || file
db00: 53 69 7a 65 3e 3d 70 67 6e 6f 2a 53 51 4c 49 54  Size>=pgno*SQLIT
db10: 45 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20  E_PAGE_SIZE ){. 
db20: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
db30: 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47 48 44  pager_unref(PGHD
db40: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29 3b  R_TO_DATA(pPg));
db50: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
db60: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 65  n rc;.        }e
db70: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  lse{.          m
db80: 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44  emset(PGHDR_TO_D
db90: 41 54 41 28 70 50 67 29 2c 20 30 2c 20 53 51 4c  ATA(pPg), 0, SQL
dba0: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
dbb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dbc0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
dbd0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
dbe0: 65 73 74 65 64 20 70 61 67 65 20 69 73 20 69 6e  ested page is in
dbf0: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
dc00: 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
dc10: 6e 48 69 74 2b 2b 3b 0a 20 20 20 20 70 61 67 65  nHit++;.    page
dc20: 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20  _ref(pPg);.  }. 
dc30: 20 2a 70 70 50 61 67 65 20 3d 20 50 47 48 44 52   *ppPage = PGHDR
dc40: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20  _TO_DATA(pPg);. 
dc50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
dc60: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  K;.}../*.** Acqu
dc70: 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74  ire a page if it
dc80: 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
dc90: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
dca0: 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72  he.  Do.** not r
dcb0: 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f  ead the page fro
dcc0: 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20  m disk.  Return 
dcd0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
dce0: 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69   page,.** or 0 i
dcf0: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
dd00: 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  t in cache..**.*
dd10: 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
dd20: 65 33 70 61 67 65 72 5f 67 65 74 28 29 2e 20 20  e3pager_get().  
dd30: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
dd40: 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
dd50: 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ine.** and sqlit
dd60: 65 33 70 61 67 65 72 5f 67 65 74 28 29 20 69 73  e3pager_get() is
dd70: 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c   that _get() wil
dd80: 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  l go to the disk
dd90: 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20   and read.** in 
dda0: 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20  the page if the 
ddb0: 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
ddc0: 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54  ady in cache.  T
ddd0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
dde0: 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74  eturns NULL if t
ddf0: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
de00: 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20  n cache or if a 
de10: 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a  disk I/O error .
de20: 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70  ** has ever happ
de30: 65 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ened..*/.void *s
de40: 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b  qlite3pager_look
de50: 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
de60: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
de70: 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61  PgHdr *pPg;..  a
de80: 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
de90: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
dea0: 6e 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  no!=0 );.  if( p
deb0: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26  Pager->errMask &
dec0: 20 7e 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c   ~(PAGER_ERR_FUL
ded0: 4c 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  L) ){.    return
dee0: 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20   0;.  }.  pPg = 
def0: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
df00: 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
df10: 28 20 70 50 67 3d 3d 30 20 29 20 72 65 74 75 72  ( pPg==0 ) retur
df20: 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72 65 66 28  n 0;.  page_ref(
df30: 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 50  pPg);.  return P
df40: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
df50: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  );.}../*.** Rele
df60: 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a  ase a page..**.*
df70: 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
df80: 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
df90: 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74   the page drop t
dfa0: 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  o zero, then the
dfb0: 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65  .** page is adde
dfc0: 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73  d to the LRU lis
dfd0: 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66  t.  When all ref
dfe0: 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70  erences to all p
dff0: 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65  ages.** are rele
e000: 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ased, a rollback
e010: 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
e020: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
e030: 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76  base is.** remov
e040: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
e050: 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 76 6f  e3pager_unref(vo
e060: 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67  id *pData){.  Pg
e070: 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20  Hdr *pPg;..  /* 
e080: 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Decrement the re
e090: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
e0a0: 72 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a 2f  r this page.  */
e0b0: 0a 20 20 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  .  pPg = DATA_TO
e0c0: 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
e0d0: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
e0e0: 65 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e  ef>0 );.  pPg->n
e0f0: 52 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f  Ref--;.  REFINFO
e100: 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65  (pPg);..  /* Whe
e110: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
e120: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 20  references to a 
e130: 70 61 67 65 20 72 65 61 63 68 20 30 2c 20 63 61  page reach 0, ca
e140: 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 74  ll the.  ** dest
e150: 72 75 63 74 6f 72 20 61 6e 64 20 61 64 64 20 74  ructor and add t
e160: 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 66  he page to the f
e170: 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  reelist..  */.  
e180: 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
e190: 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70   ){.    Pager *p
e1a0: 50 61 67 65 72 3b 0a 20 20 20 20 70 50 61 67 65  Pager;.    pPage
e1b0: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
e1c0: 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46  .    pPg->pNextF
e1d0: 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 67  ree = 0;.    pPg
e1e0: 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50  ->pPrevFree = pP
e1f0: 61 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20  ager->pLast;.   
e200: 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
e210: 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50   pPg;.    if( pP
e220: 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a  g->pPrevFree ){.
e230: 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
e240: 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20  Free->pNextFree 
e250: 3d 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65  = pPg;.    }else
e260: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
e270: 70 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20 20  pFirst = pPg;.  
e280: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
e290: 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 26 26 20  >needSync==0 && 
e2a0: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
e2b0: 6e 63 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nced==0 ){.     
e2c0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
e2d0: 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20 20 20  ynced = pPg;.   
e2e0: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
e2f0: 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29  r->xDestructor )
e300: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
e310: 78 44 65 73 74 72 75 63 74 6f 72 28 70 44 61 74  xDestructor(pDat
e320: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
e330: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  ize);.    }.  . 
e340: 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70     /* When all p
e350: 61 67 65 73 20 72 65 61 63 68 20 74 68 65 20 66  ages reach the f
e360: 72 65 65 6c 69 73 74 2c 20 64 72 6f 70 20 74 68  reelist, drop th
e370: 65 20 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d  e read lock from
e380: 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
e390: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
e3a0: 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  /.    pPager->nR
e3b0: 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74  ef--;.    assert
e3c0: 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d  ( pPager->nRef>=
e3d0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  0 );.    if( pPa
e3e0: 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20  ger->nRef==0 && 
e3f0: 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29  !pPager->memDb )
e400: 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65  {.      pager_re
e410: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
e420: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
e430: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
e440: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f 75  .** Create a jou
e450: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 50  rnal file for pP
e460: 61 67 65 72 2e 20 20 54 68 65 72 65 20 73 68 6f  ager.  There sho
e470: 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 61  uld already be a
e480: 20 77 72 69 74 65 0a 2a 2a 20 6c 6f 63 6b 20 6f   write.** lock o
e490: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
e4a0: 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ile when this ro
e4b0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
e4c0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
e4d0: 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
e4e0: 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 61  thing.  Return a
e4f0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  n error code and
e500: 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20   release the.** 
e510: 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e  write lock if an
e520: 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
e530: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
e540: 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
e550: 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
e560: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
e570: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
e580: 73 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 57 52  state==SQLITE_WR
e590: 49 54 45 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ITELOCK );.  ass
e5a0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
e5b0: 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20  rnalOpen==0 );. 
e5c0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
e5d0: 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
e5e0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
e5f0: 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
e600: 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  .  pPager->aInJo
e610: 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61  urnal = sqliteMa
e620: 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62  lloc( pPager->db
e630: 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20  Size/8 + 1 );.  
e640: 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  if( pPager->aInJ
e650: 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  ournal==0 ){.   
e660: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 4c 6f   sqlite3OsReadLo
e670: 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b  ck(&pPager->fd);
e680: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
e690: 74 65 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  te = SQLITE_READ
e6a0: 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e  LOCK;.    return
e6b0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
e6c0: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
e6d0: 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  3OsOpenExclusive
e6e0: 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
e6f0: 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  l, &pPager->jfd,
e700: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
e710: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
e720: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
e730: 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
e740: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >aInJournal);.  
e750: 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
e760: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71  rnal = 0;.    sq
e770: 6c 69 74 65 33 4f 73 52 65 61 64 4c 6f 63 6b 28  lite3OsReadLock(
e780: 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  &pPager->fd);.  
e790: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
e7a0: 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43  = SQLITE_READLOC
e7b0: 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  K;.    return SQ
e7c0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
e7d0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 4f 70   }.  sqlite3OsOp
e7e0: 65 6e 44 69 72 65 63 74 6f 72 79 28 70 50 61 67  enDirectory(pPag
e7f0: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20  er->zDirectory, 
e800: 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  &pPager->jfd);. 
e810: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e820: 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67  Open = 1;.  pPag
e830: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
e840: 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ed = 0;.  pPager
e850: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
e860: 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73    pPager->always
e870: 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20  Rollback = 0;.  
e880: 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
e890: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
e8a0: 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20  errMask!=0 ){.  
e8b0: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
e8c0: 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20  code(pPager);.  
e8d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
e8e0: 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  .  pPager->origD
e8f0: 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
e900: 64 62 53 69 7a 65 3b 0a 20 20 69 66 28 20 6a 6f  dbSize;.  if( jo
e910: 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 3d 3d 4a 4f  urnal_format==JO
e920: 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 33 20 29  URNAL_FORMAT_3 )
e930: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
e940: 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67 65  e3OsWrite(&pPage
e950: 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c  r->jfd, aJournal
e960: 4d 61 67 69 63 33 2c 20 73 69 7a 65 6f 66 28 61  Magic3, sizeof(a
e970: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 33 29 29 3b  JournalMagic3));
e980: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
e990: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
e9a0: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
e9b0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  (&pPager->jfd, p
e9c0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20  Pager->noSync ? 
e9d0: 30 78 66 66 66 66 66 66 66 66 20 3a 20 30 29 3b  0xffffffff : 0);
e9e0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
e9f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
ea00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 61 6e        sqlite3Ran
ea10: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70  domness(sizeof(p
ea20: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
ea30: 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  ), &pPager->cksu
ea40: 6d 49 6e 69 74 29 3b 0a 20 20 20 20 20 20 72 63  mInit);.      rc
ea50: 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26   = write32bits(&
ea60: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
ea70: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
ea80: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
ea90: 66 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61  f( journal_forma
eaa0: 74 3d 3d 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41  t==JOURNAL_FORMA
eab0: 54 5f 32 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  T_2 ){.    rc = 
eac0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26  sqlite3OsWrite(&
ead0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f  pPager->jfd, aJo
eae0: 75 72 6e 61 6c 4d 61 67 69 63 32 2c 20 73 69 7a  urnalMagic2, siz
eaf0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
eb00: 63 32 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  c2));.  }else{. 
eb10: 20 20 20 61 73 73 65 72 74 28 20 6a 6f 75 72 6e     assert( journ
eb20: 61 6c 5f 66 6f 72 6d 61 74 3d 3d 4a 4f 55 52 4e  al_format==JOURN
eb30: 41 4c 5f 46 4f 52 4d 41 54 5f 31 20 29 3b 0a 20  AL_FORMAT_1 );. 
eb40: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
eb50: 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
eb60: 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  jfd, aJournalMag
eb70: 69 63 31 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  ic1, sizeof(aJou
eb80: 72 6e 61 6c 4d 61 67 69 63 31 29 29 3b 0a 20 20  rnalMagic1));.  
eb90: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
eba0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
ebb0: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70  = write32bits(&p
ebc0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
ebd0: 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d  er->dbSize);.  }
ebe0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
ebf0: 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26 20 72  tmtAutoopen && r
ec00: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
ec10: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ec20: 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e  pager_stmt_begin
ec30: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
ec40: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
ec50: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
ec60: 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
ec70: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
ec80: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
ec90: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
eca0: 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a  ITE_FULL;.    }.
ecb0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
ecc0: 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75    .}../*.** Acqu
ecd0: 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ire a write-lock
ece0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
ecf0: 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72  .  The lock is r
ed00: 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74  emoved when.** t
ed10: 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  he any of the fo
ed20: 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a  llowing happen:.
ed30: 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  **.**   *  sqlit
ed40: 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29  e3pager_commit()
ed50: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
ed60: 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72   *  sqlite3pager
ed70: 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63  _rollback() is c
ed80: 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
ed90: 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73  qlite3pager_clos
eda0: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
edb0: 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61  *   *  sqlite3pa
edc0: 67 65 72 5f 75 6e 72 65 66 28 29 20 69 73 20 63  ger_unref() is c
edd0: 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65 72  alled to on ever
ede0: 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  y outstanding pa
edf0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ge..**.** The pa
ee00: 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20  rameter to this 
ee10: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69  routine is a poi
ee20: 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e  nter to any open
ee30: 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20   page of the.** 
ee40: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
ee50: 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20  Nothing changes 
ee60: 61 62 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d  about the page -
ee70: 20 69 74 20 69 73 20 75 73 65 64 20 6d 65 72 65   it is used mere
ee80: 6c 79 0a 2a 2a 20 74 6f 20 61 63 71 75 69 72 65  ly.** to acquire
ee90: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
eea0: 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
eeb0: 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74  e and as proof t
eec0: 68 61 74 20 74 68 65 72 65 0a 2a 2a 20 69 73 20  hat there.** is 
eed0: 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c  already a read-l
eee0: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
eef0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75  ase..**.** A jou
ef00: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
ef10: 6e 65 64 20 69 66 20 74 68 69 73 20 69 73 20 6e  ned if this is n
ef20: 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ot a temporary f
ef30: 69 6c 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 65 6d  ile.  For.** tem
ef40: 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68  porary files, th
ef50: 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68 65  e opening of the
ef60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
ef70: 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 0a   deferred until.
ef80: 2a 2a 20 74 68 65 72 65 20 69 73 20 61 6e 20 61  ** there is an a
ef90: 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 77 72  ctual need to wr
efa0: 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ite to the journ
efb0: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  al..**.** If the
efc0: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72   database is alr
efd0: 65 61 64 79 20 77 72 69 74 65 2d 6c 6f 63 6b 65  eady write-locke
efe0: 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
eff0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69  is a no-op..*/.i
f000: 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
f010: 62 65 67 69 6e 28 76 6f 69 64 20 2a 70 44 61 74  begin(void *pDat
f020: 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
f030: 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
f040: 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72  (pData);.  Pager
f050: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
f060: 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
f070: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
f080: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
f090: 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  f>0 );.  assert(
f0a0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
f0b0: 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20 29 3b  SQLITE_UNLOCK );
f0c0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
f0d0: 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 52 45 41  tate==SQLITE_REA
f0e0: 44 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73  DLOCK ){.    ass
f0f0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
f100: 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
f110: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65    if( pPager->me
f120: 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 70 50 61  mDb ){.      pPa
f130: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c  ger->state = SQL
f140: 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 3b 0a 20  ITE_WRITELOCK;. 
f150: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69       pPager->ori
f160: 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  gDbSize = pPager
f170: 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65  ->dbSize;.    }e
f180: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
f190: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 4c 6f  sqlite3OsWriteLo
f1a0: 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b  ck(&pPager->fd);
f1b0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
f1c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f1d0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
f1e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
f1f0: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c  ger->state = SQL
f200: 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 3b 0a 20  ITE_WRITELOCK;. 
f210: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72       pPager->dir
f220: 74 79 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20  tyFile = 0;.    
f230: 20 20 54 52 41 43 45 31 28 22 54 52 41 4e 53 41    TRACE1("TRANSA
f240: 43 54 49 4f 4e 5c 6e 22 29 3b 0a 20 20 20 20 20  CTION\n");.     
f250: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65   if( pPager->use
f260: 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50 61 67  Journal && !pPag
f270: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
f280: 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
f290: 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
f2a0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
f2b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
f2c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
f2d0: 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61 67   Mark a data pag
f2e0: 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20  e as writeable. 
f2f0: 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72 69   The page is wri
f300: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
f310: 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20  urnal .** if it 
f320: 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72  is not there alr
f330: 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f 75 74  eady.  This rout
f340: 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c  ine must be call
f350: 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67  ed before making
f360: 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 61  .** changes to a
f370: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
f380: 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73   first time this
f390: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
f3a0: 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 63 72  ed, the pager cr
f3b0: 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a  eates a new.** j
f3c0: 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71 75 69  ournal and acqui
f3d0: 72 65 73 20 61 20 77 72 69 74 65 20 6c 6f 63 6b  res a write lock
f3e0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
f3f0: 2e 20 20 49 66 20 74 68 65 20 77 72 69 74 65 0a  .  If the write.
f400: 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f  ** lock could no
f410: 74 20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74  t be acquired, t
f420: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
f430: 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  rns SQLITE_BUSY.
f440: 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
f450: 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68   routine must ch
f460: 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74  eck for that ret
f470: 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65  urn value and be
f480: 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a   careful not to.
f490: 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61  ** change any pa
f4a0: 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68  ge data until th
f4b0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
f4c0: 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
f4d0: 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
f4e0: 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f  al file could no
f4f0: 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 63  t be written bec
f500: 61 75 73 65 20 74 68 65 20 64 69 73 6b 20 69 73  ause the disk is
f510: 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74   full,.** then t
f520: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
f530: 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  rns SQLITE_FULL 
f540: 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65  and does an imme
f550: 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  diate rollback..
f560: 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e  ** All subsequen
f570: 74 20 77 72 69 74 65 20 61 74 74 65 6d 70 74 73  t write attempts
f580: 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c   also return SQL
f590: 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74  ITE_FULL until t
f5a0: 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c  here.** is a cal
f5b0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65  l to sqlite3page
f5c0: 72 5f 63 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71  r_commit() or sq
f5d0: 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
f5e0: 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65  ack() to.** rese
f5f0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
f600: 33 70 61 67 65 72 5f 77 72 69 74 65 28 76 6f 69  3pager_write(voi
f610: 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
f620: 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54  dr *pPg = DATA_T
f630: 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
f640: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
f650: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
f660: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
f670: 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  _OK;..  /* Check
f680: 20 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f   for errors.  */
f690: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
f6a0: 72 72 4d 61 73 6b 20 29 7b 20 0a 20 20 20 20 72  rrMask ){ .    r
f6b0: 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63  eturn pager_errc
f6c0: 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ode(pPager);.  }
f6d0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72  .  if( pPager->r
f6e0: 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72  eadOnly ){.    r
f6f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
f700: 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72  M;.  }..  /* Mar
f710: 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69  k the page as di
f720: 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67  rty.  If the pag
f730: 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
f740: 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20  en written.  ** 
f750: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  to the journal t
f760: 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72  hen we can retur
f770: 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  n right away..  
f780: 2a 2f 0a 20 20 70 50 67 2d 3e 64 69 72 74 79 20  */.  pPg->dirty 
f790: 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  = 1;.  if( pPg->
f7a0: 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50  inJournal && (pP
f7b0: 67 2d 3e 69 6e 53 74 6d 74 20 7c 7c 20 70 50 61  g->inStmt || pPa
f7c0: 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d  ger->stmtInUse==
f7d0: 30 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  0) ){.    pPager
f7e0: 2d 3e 64 69 72 74 79 46 69 6c 65 20 3d 20 31 3b  ->dirtyFile = 1;
f7f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f800: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
f810: 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20   If we get this 
f820: 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  far, it means th
f830: 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64  at the page need
f840: 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 77 72 69  s to be.  ** wri
f850: 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e  tten to the tran
f860: 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
f870: 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e  or the ckeckpoin
f880: 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 6f  t journal.  ** o
f890: 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a  r both..  **.  *
f8a0: 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f  * First check to
f8b0: 20 73 65 65 20 74 68 61 74 20 74 68 65 20 74 72   see that the tr
f8c0: 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
f8d0: 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20 2a  l exists and.  *
f8e0: 2a 20 63 72 65 61 74 65 20 69 74 20 69 66 20 69  * create it if i
f8f0: 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 2a 2f  t does not..  */
f900: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
f910: 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45  r->state!=SQLITE
f920: 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20  _UNLOCK );.  rc 
f930: 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 62  = sqlite3pager_b
f940: 65 67 69 6e 28 70 44 61 74 61 29 3b 0a 20 20 69  egin(pData);.  i
f950: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f960: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
f970: 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
f980: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
f990: 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b  SQLITE_WRITELOCK
f9a0: 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
f9b0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26  r->journalOpen &
f9c0: 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  & pPager->useJou
f9d0: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d  rnal ){.    rc =
f9e0: 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
f9f0: 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
fa00: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
fa10: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
fa20: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
fa30: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
fa40: 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75 73  n || !pPager->us
fa50: 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 70 50  eJournal );.  pP
fa60: 61 67 65 72 2d 3e 64 69 72 74 79 46 69 6c 65 20  ager->dirtyFile 
fa70: 3d 20 31 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74  = 1;..  /* The t
fa80: 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
fa90: 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e  al now exists an
faa0: 64 20 77 65 20 68 61 76 65 20 61 20 77 72 69 74  d we have a writ
fab0: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  e lock on the.  
fac0: 2a 2a 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  ** main database
fad0: 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68   file.  Write th
fae0: 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
faf0: 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
fb00: 6e 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  n .  ** journal 
fb10: 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
fb20: 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 2a 2f  re already..  */
fb30: 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a  .  if( !pPg->inJ
fb40: 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61 67 65  ournal && (pPage
fb50: 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c  r->useJournal ||
fb60: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 29 20   pPager->memDb) 
fb70: 29 7b 0a 20 20 20 20 69 66 28 20 28 69 6e 74 29  ){.    if( (int)
fb80: 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61  pPg->pgno <= pPa
fb90: 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
fba0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 50  ){.      int szP
fbb0: 67 3b 0a 20 20 20 20 20 20 75 33 32 20 73 61 76  g;.      u32 sav
fbc0: 65 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ed;.      if( pP
fbd0: 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
fbe0: 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79         PgHistory
fbf0: 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
fc00: 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
fc10: 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 54 52  ger);.        TR
fc20: 41 43 45 32 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE2("JOURNAL %d
fc30: 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  \n", pPg->pgno);
fc40: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
fc50: 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30   pHist->pOrig==0
fc60: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73   );.        pHis
fc70: 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69 74  t->pOrig = sqlit
fc80: 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67  eMallocRaw( pPag
fc90: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  er->pageSize );.
fca0: 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73          if( pHis
fcb0: 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20  t->pOrig ){.    
fcc0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69        memcpy(pHi
fcd0: 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44 52  st->pOrig, PGHDR
fce0: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
fcf0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
fd00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
fd10: 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
fd20: 61 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  al = 1;.      }e
fd30: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 69 66  lse {.        if
fd40: 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74  ( journal_format
fd50: 3e 3d 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54  >=JOURNAL_FORMAT
fd60: 5f 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  _3 ){.          
fd70: 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 61 67 65  u32 cksum = page
fd80: 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
fd90: 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 44 61 74 61  pPg->pgno, pData
fda0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 61 76  );.          sav
fdb0: 65 64 20 3d 20 2a 28 75 33 32 2a 29 50 47 48 44  ed = *(u32*)PGHD
fdc0: 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 29 3b  R_TO_EXTRA(pPg);
fdd0: 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65  .          store
fde0: 33 32 62 69 74 73 28 63 6b 73 75 6d 2c 20 70 50  32bits(cksum, pP
fdf0: 67 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  g, SQLITE_PAGE_S
fe00: 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 20 20  IZE);.          
fe10: 73 7a 50 67 20 3d 20 53 51 4c 49 54 45 5f 50 41  szPg = SQLITE_PA
fe20: 47 45 5f 53 49 5a 45 2b 38 3b 0a 20 20 20 20 20  GE_SIZE+8;.     
fe30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fe40: 20 20 20 20 73 7a 50 67 20 3d 20 53 51 4c 49 54      szPg = SQLIT
fe50: 45 5f 50 41 47 45 5f 53 49 5a 45 2b 34 3b 0a 20  E_PAGE_SIZE+4;. 
fe60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
fe70: 20 73 74 6f 72 65 33 32 62 69 74 73 28 70 50 67   store32bits(pPg
fe80: 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d 34 29  ->pgno, pPg, -4)
fe90: 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 28  ;.        CODEC(
fea0: 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
feb0: 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20  Pg->pgno, 7);.  
fec0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
fed0: 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67 65  e3OsWrite(&pPage
fee0: 72 2d 3e 6a 66 64 2c 20 26 28 28 63 68 61 72 2a  r->jfd, &((char*
fef0: 29 70 44 61 74 61 29 5b 2d 34 5d 2c 20 73 7a 50  )pData)[-4], szP
ff00: 67 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43  g);.        TRAC
ff10: 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 25  E3("JOURNAL %d %
ff20: 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
ff30: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b   pPg->needSync);
ff40: 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 28 70  .        CODEC(p
ff50: 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
ff60: 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20  g->pgno, 0);.   
ff70: 20 20 20 20 20 69 66 28 20 6a 6f 75 72 6e 61 6c       if( journal
ff80: 5f 66 6f 72 6d 61 74 3e 3d 4a 4f 55 52 4e 41 4c  _format>=JOURNAL
ff90: 5f 46 4f 52 4d 41 54 5f 33 20 29 7b 0a 20 20 20  _FORMAT_3 ){.   
ffa0: 20 20 20 20 20 20 20 2a 28 75 33 32 2a 29 50 47         *(u32*)PG
ffb0: 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67  HDR_TO_EXTRA(pPg
ffc0: 29 20 3d 20 73 61 76 65 64 3b 0a 20 20 20 20 20  ) = saved;.     
ffd0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
ffe0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
fff0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
10000 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
10010 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
10020 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
10030 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52  Mask |= PAGER_ER
10040 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20  R_FULL;.        
10050 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
10060 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
10070 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20  Pager->nRec++;. 
10080 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
10090 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
100a0 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  l!=0 );.        
100b0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
100c0 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  al[pPg->pgno/8] 
100d0 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
100e0 26 37 29 3b 0a 20 20 20 20 20 20 20 20 70 50 67  &7);.        pPg
100f0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50  ->needSync = !pP
10100 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20  ager->noSync;.  
10110 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
10120 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20  rnal = 1;.      
10130 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
10140 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20  mtInUse ){.     
10150 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
10160 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  Stmt[pPg->pgno/8
10170 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
10180 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20  no&7);.         
10190 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
101a0 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
101b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
101c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
101d0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
101e0 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
101f0 53 74 61 72 74 65 64 20 26 26 20 21 70 50 61 67  Started && !pPag
10200 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20  er->noSync;.    
10210 20 20 54 52 41 43 45 33 28 22 41 50 50 45 4e 44    TRACE3("APPEND
10220 20 25 64 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e   %d %d\n", pPg->
10230 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53  pgno, pPg->needS
10240 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ync);.    }.    
10250 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  if( pPg->needSyn
10260 63 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  c ){.      pPage
10270 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
10280 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
10290 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
102a0 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  t journal is ope
102b0 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  n and the page i
102c0 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 2a  s not in it,.  *
102d0 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65  * then write the
102e0 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
102f0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
10300 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68  ournal.  Note th
10310 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74  at.  ** the stat
10320 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6c  ement journal al
10330 77 61 79 73 20 75 73 65 73 20 74 68 65 20 73 69  ways uses the si
10340 6d 70 6c 69 65 72 20 66 6f 72 6d 61 74 20 32 20  mplier format 2 
10350 74 68 61 74 20 6c 61 63 6b 73 0a 20 20 2a 2a 20  that lacks.  ** 
10360 63 68 65 63 6b 73 75 6d 73 2e 20 20 54 68 65 20  checksums.  The 
10370 68 65 61 64 65 72 20 69 73 20 61 6c 73 6f 20 6f  header is also o
10380 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mitted from the 
10390 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
103a0 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  l..  */.  if( pP
103b0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
103c0 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20  && !pPg->inStmt 
103d0 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  && (int)pPg->pgn
103e0 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  o<=pPager->stmtS
103f0 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ize ){.    asser
10400 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  t( pPg->inJourna
10410 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70  l || (int)pPg->p
10420 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67  gno>pPager->orig
10430 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 69 66  DbSize );.    if
10440 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20  ( pPager->memDb 
10450 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  ){.      PgHisto
10460 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
10470 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
10480 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73  Pager);.      as
10490 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 53 74  sert( pHist->pSt
104a0 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  mt==0 );.      p
104b0 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71  Hist->pStmt = sq
104c0 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70  liteMallocRaw( p
104d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
104e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 69  );.      if( pHi
104f0 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20  st->pStmt ){.   
10500 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73       memcpy(pHis
10510 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44 52 5f  t->pStmt, PGHDR_
10520 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
10530 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
10540 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54  .      }.      T
10550 52 41 43 45 32 28 22 53 54 4d 54 2d 4a 4f 55 52  RACE2("STMT-JOUR
10560 4e 41 4c 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e  NAL %d\n", pPg->
10570 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pgno);.    }else
10580 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 33 32 62  {.      store32b
10590 69 74 73 28 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  its(pPg->pgno, p
105a0 50 67 2c 20 2d 34 29 3b 0a 20 20 20 20 20 20 43  Pg, -4);.      C
105b0 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61  ODEC(pPager, pDa
105c0 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
105d0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
105e0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50  lite3OsWrite(&pP
105f0 61 67 65 72 2d 3e 73 74 66 64 2c 20 28 28 63 68  ager->stfd, ((ch
10600 61 72 2a 29 70 44 61 74 61 29 2d 34 2c 20 53 51  ar*)pData)-4, SQ
10610 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2b 34  LITE_PAGE_SIZE+4
10620 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 32 28  );.      TRACE2(
10630 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64  "STMT-JOURNAL %d
10640 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  \n", pPg->pgno);
10650 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61  .      CODEC(pPa
10660 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
10670 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20  >pgno, 0);.     
10680 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10690 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
106a0 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
106b0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
106c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
106d0 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52  Mask |= PAGER_ER
106e0 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20  R_FULL;.        
106f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
10700 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
10710 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20  >stmtNRec++;.   
10720 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
10730 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b  r->aInStmt!=0 );
10740 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
10750 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
10760 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
10770 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 7d 0a 20  pgno&7);.    }. 
10780 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73     page_add_to_s
10790 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  tmt_list(pPg);. 
107a0 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20   }..  /* Update 
107b0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
107c0 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20  e and return..  
107d0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
107e0 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50 67  >dbSize<(int)pPg
107f0 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
10800 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
10810 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20  Pg->pgno;.  }.  
10820 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10830 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
10840 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65  if the page give
10850 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
10860 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
10870 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71   passed.** to sq
10880 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
10890 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ().  In other wo
108a0 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
108b0 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20   if it is ok.** 
108c0 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f  to change the co
108d0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
108e0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
108f0 33 70 61 67 65 72 5f 69 73 77 72 69 74 65 61 62  3pager_iswriteab
10900 6c 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  le(void *pData){
10910 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
10920 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
10930 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ata);.  return p
10940 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 0a 2f 2a  Pg->dirty;.}../*
10950 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20  .** Replace the 
10960 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73 69 6e  content of a sin
10970 67 6c 65 20 70 61 67 65 20 77 69 74 68 20 74 68  gle page with th
10980 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  e information in
10990 20 74 68 65 20 74 68 69 72 64 0a 2a 2a 20 61 72   the third.** ar
109a0 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
109b0 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 76 65 72  qlite3pager_over
109c0 77 72 69 74 65 28 50 61 67 65 72 20 2a 70 50 61  write(Pager *pPa
109d0 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  ger, Pgno pgno, 
109e0 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
109f0 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 69  void *pPage;.  i
10a00 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73  nt rc;..  rc = s
10a10 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
10a20 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70  pPager, pgno, &p
10a30 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  Page);.  if( rc=
10a40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10a50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
10a60 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29  ger_write(pPage)
10a70 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
10a80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10a90 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2c 20 70   memcpy(pPage, p
10aa0 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 50 41 47  Data, SQLITE_PAG
10ab0 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20  E_SIZE);.    }. 
10ac0 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
10ad0 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  unref(pPage);.  
10ae0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
10af0 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74  ../*.** A call t
10b00 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  o this routine t
10b10 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74  ells the pager t
10b20 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  hat it is not ne
10b30 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72  cessary to.** wr
10b40 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74  ite the informat
10b50 69 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70 67 6e  ion on page "pgn
10b60 6f 22 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  o" back to the d
10b70 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  isk, even though
10b80 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69  .** that page mi
10b90 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ght be marked as
10ba0 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   dirty..**.** Th
10bb0 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74  e overlying soft
10bc0 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73  ware layer calls
10bd0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
10be0 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61  en all of the da
10bf0 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76  ta.** on the giv
10c00 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65  en page is unuse
10c10 64 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d 61  d.  The pager ma
10c20 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20  rks the page as 
10c30 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74  clean so.** that
10c40 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74   it does not get
10c50 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
10c60 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68  ..**.** Tests sh
10c70 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74  ow that this opt
10c80 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74  imization, toget
10c90 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20  her with the.** 
10ca0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e  sqlite3pager_don
10cb0 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c  t_rollback() bel
10cc0 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f  ow, more than do
10cd0 75 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a  uble the speed.*
10ce0 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52  * of large INSER
10cf0 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64  T operations and
10d00 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73   quadruple the s
10d10 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45  peed of large DE
10d20 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  LETEs..**.** Whe
10d30 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
10d40 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68  s called, set th
10d50 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  e alwaysRollback
10d60 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a   flag to true..*
10d70 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * Subsequent cal
10d80 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67  ls to sqlite3pag
10d90 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  er_dont_rollback
10da0 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  () for the same 
10db0 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65  page.** will the
10dc0 72 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72  reafter be ignor
10dd0 65 64 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  ed.  This is nec
10de0 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20  essary to avoid 
10df0 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65  a problem.** whe
10e00 72 65 20 61 20 70 61 67 65 20 77 69 74 68 20 64  re a page with d
10e10 61 74 61 20 69 73 20 61 64 64 65 64 20 74 6f 20  ata is added to 
10e20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72  the freelist dur
10e30 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a  ing one part of.
10e40 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
10e50 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72   then removed fr
10e60 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  om the freelist 
10e70 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70  during a later p
10e80 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61  art.** of the sa
10e90 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  me transaction a
10ea0 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f  nd reused for so
10eb0 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
10ec0 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73  .  When it.** is
10ed0 20 66 69 72 73 74 20 61 64 64 65 64 20 74 6f 20   first added to 
10ee0 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68  the freelist, th
10ef0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
10f00 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73  lled.  When reus
10f10 65 64 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e 74 5f  ed,.** the dont_
10f20 72 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69  rollback() routi
10f30 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42  ne is called.  B
10f40 75 74 20 62 65 63 61 75 73 65 20 74 68 65 20 70  ut because the p
10f50 61 67 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  age contains.** 
10f60 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77  critical data, w
10f70 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20  e still need to 
10f80 62 65 20 73 75 72 65 20 69 74 20 67 65 74 73 20  be sure it gets 
10f90 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73  rolled back in s
10fa0 70 69 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64  pite.** of the d
10fb0 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 63  ont_rollback() c
10fc0 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  all..*/.void sql
10fd0 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 77  ite3pager_dont_w
10fe0 72 69 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  rite(Pager *pPag
10ff0 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
11000 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
11010 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
11020 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
11030 29 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79 73  );.  pPg->always
11040 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20  Rollback = 1;.  
11050 69 66 28 20 70 50 67 20 26 26 20 70 50 67 2d 3e  if( pPg && pPg->
11060 64 69 72 74 79 20 29 7b 0a 20 20 20 20 69 66 28  dirty ){.    if(
11070 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
11080 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20  =(int)pPg->pgno 
11090 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  && pPager->origD
110a0 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62  bSize<pPager->db
110b0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
110c0 20 49 66 20 74 68 69 73 20 70 61 67 65 73 20 69   If this pages i
110d0 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  s the last page 
110e0 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  in the file and 
110f0 74 68 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f  the file has gro
11100 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69  wn.      ** duri
11110 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ng the current t
11120 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
11130 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65   do NOT mark the
11140 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a   page as clean..
11150 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68        ** When th
11160 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
11170 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d  grows, we must m
11180 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
11190 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20  e last page.    
111a0 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65    ** gets writte
111b0 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20  n at least once 
111c0 73 6f 20 74 68 61 74 20 74 68 65 20 64 69 73 6b  so that the disk
111d0 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68   file will be th
111e0 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20  e correct.      
111f0 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20  ** size. If you 
11200 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69  do not write thi
11210 73 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 73  s page and the s
11220 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a  ize of the file.
11230 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
11240 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69  disk ends up bei
11250 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68  ng too small, th
11260 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64  at can lead to d
11270 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
11280 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69   corruption duri
11290 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e  ng the next tran
112a0 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
112b0 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /.    }else{.   
112c0 20 20 20 54 52 41 43 45 32 28 22 44 4f 4e 54 5f     TRACE2("DONT_
112d0 57 52 49 54 45 20 25 64 5c 6e 22 2c 20 70 67 6e  WRITE %d\n", pgn
112e0 6f 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64  o);.      pPg->d
112f0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  irty = 0;.    }.
11300 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63    }.}../*.** A c
11310 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
11320 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61  ine tells the pa
11330 67 65 72 20 74 68 61 74 20 69 66 20 61 20 72 6f  ger that if a ro
11340 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a 2a  llback occurs,.*
11350 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  * it is not nece
11360 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f 72 65  ssary to restore
11370 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68 65   the data on the
11380 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20 54 68   given page.  Th
11390 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74  is.** means that
113a0 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20   the pager does 
113b0 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65 63 6f  not have to reco
113c0 72 64 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  rd the given pag
113d0 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c  e in the.** roll
113e0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f  back journal..*/
113f0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
11400 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  er_dont_rollback
11410 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
11420 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41   PgHdr *pPg = DA
11430 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
11440 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  a);.  Pager *pPa
11450 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
11460 72 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  r;..  if( pPager
11470 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f  ->state!=SQLITE_
11480 57 52 49 54 45 4c 4f 43 4b 20 7c 7c 20 70 50 61  WRITELOCK || pPa
11490 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
114a0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
114b0 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52  if( pPg->alwaysR
114c0 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65  ollback || pPage
114d0 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
114e0 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6d 65 6d  k || pPager->mem
114f0 44 62 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  Db ) return;.  i
11500 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  f( !pPg->inJourn
11510 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  al && (int)pPg->
11520 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
11530 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
11540 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11550 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->aInJournal!=0 
11560 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
11570 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70  InJournal[pPg->p
11580 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
11590 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
115a0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
115b0 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   1;.    if( pPag
115c0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
115d0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
115e0 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
115f0 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
11600 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 70  pgno&7);.      p
11610 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
11620 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d  list(pPg);.    }
11630 0a 20 20 20 20 54 52 41 43 45 32 28 22 44 4f 4e  .    TRACE2("DON
11640 54 5f 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  T_ROLLBACK %d\n"
11650 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
11660 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
11670 73 74 6d 74 49 6e 55 73 65 20 26 26 20 21 70 50  stmtInUse && !pP
11680 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28 69 6e  g->inStmt && (in
11690 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61  t)pPg->pgno<=pPa
116a0 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 7b  ger->stmtSize ){
116b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
116c0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28  ->inJournal || (
116d0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50  int)pPg->pgno>pP
116e0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
116f0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
11700 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21  pPager->aInStmt!
11710 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
11720 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70  ->aInStmt[pPg->p
11730 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
11740 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
11750 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
11760 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 7d 0a  _list(pPg);.  }.
11770 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  }.../*.** Clear 
11780 61 20 50 67 48 69 73 74 6f 72 79 20 62 6c 6f 63  a PgHistory bloc
11790 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  k.*/.static void
117a0 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 67   clearHistory(Pg
117b0 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 29 7b  History *pHist){
117c0 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48  .  sqliteFree(pH
117d0 69 73 74 2d 3e 70 4f 72 69 67 29 3b 0a 20 20 73  ist->pOrig);.  s
117e0 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d  qliteFree(pHist-
117f0 3e 70 53 74 6d 74 29 3b 0a 20 20 70 48 69 73 74  >pStmt);.  pHist
11800 2d 3e 70 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70  ->pOrig = 0;.  p
11810 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Hist->pStmt = 0;
11820 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
11830 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20   all changes to 
11840 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
11850 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
11860 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  te lock..**.** I
11870 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69  f the commit fai
11880 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f  ls for any reaso
11890 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74  n, a rollback at
118a0 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a  tempt is made.**
118b0 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
118c0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
118d0 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77   If the commit w
118e0 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b  orked, SQLITE_OK
118f0 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
11900 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
11910 61 67 65 72 5f 63 6f 6d 6d 69 74 28 50 61 67 65  ager_commit(Page
11920 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
11930 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
11940 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  Pg;..  if( pPage
11950 72 2d 3e 65 72 72 4d 61 73 6b 3d 3d 50 41 47 45  r->errMask==PAGE
11960 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20  R_ERR_FULL ){.  
11970 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
11980 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
11990 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
119a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
119b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
119c0 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20  _FULL;.    }.   
119d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
119e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
119f0 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20  rMask!=0 ){.    
11a00 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f  rc = pager_errco
11a10 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  de(pPager);.    
11a20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
11a30 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
11a40 74 65 21 3d 53 51 4c 49 54 45 5f 57 52 49 54 45  te!=SQLITE_WRITE
11a50 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  LOCK ){.    retu
11a60 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
11a70 0a 20 20 7d 0a 20 20 54 52 41 43 45 31 28 22 43  .  }.  TRACE1("C
11a80 4f 4d 4d 49 54 5c 6e 22 29 3b 0a 20 20 69 66 28  OMMIT\n");.  if(
11a90 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29   pPager->memDb )
11aa0 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  {.    pPg = page
11ab0 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
11ac0 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20  pages(pPager);. 
11ad0 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b     while( pPg ){
11ae0 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74  .      clearHist
11af0 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53  ory(PGHDR_TO_HIS
11b00 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b  T(pPg, pPager));
11b10 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74  .      pPg->dirt
11b20 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  y = 0;.      pPg
11b30 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
11b40 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74  .      pPg->inSt
11b50 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  mt = 0;.      pP
11b60 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  g->pPrevStmt = p
11b70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  Pg->pNextStmt = 
11b80 30 3b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70  0;.      pPg = p
11b90 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  Pg->pDirty;.    
11ba0 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  }.    pPager->pS
11bb0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  tmt = 0;.    pPa
11bc0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c  ger->state = SQL
11bd0 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20 20  ITE_READLOCK;.  
11be0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11bf0 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  OK;.  }.  if( pP
11c00 61 67 65 72 2d 3e 64 69 72 74 79 46 69 6c 65 3d  ager->dirtyFile=
11c10 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 45 78 69  =0 ){.    /* Exi
11c20 74 20 65 61 72 6c 79 20 28 77 69 74 68 6f 75 74  t early (without
11c30 20 64 6f 69 6e 67 20 74 68 65 20 74 69 6d 65 2d   doing the time-
11c40 63 6f 6e 73 75 6d 69 6e 67 20 73 71 6c 69 74 65  consuming sqlite
11c50 33 4f 73 53 79 6e 63 28 29 20 63 61 6c 6c 73 29  3OsSync() calls)
11c60 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 72 65  .    ** if there
11c70 20 68 61 76 65 20 62 65 65 6e 20 6e 6f 20 63 68   have been no ch
11c80 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
11c90 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
11ca0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
11cb0 72 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29  r->needSync==0 )
11cc0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
11cd0 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
11ce0 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ger);.    pPager
11cf0 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20  ->dbSize = -1;. 
11d00 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11d10 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
11d20 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
11d30 29 3b 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f  );.  rc = syncJo
11d40 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
11d50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11d60 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63  OK ){.    goto c
11d70 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20 7d  ommit_abort;.  }
11d80 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67  .  pPg = pager_g
11d90 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67  et_all_dirty_pag
11da0 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  es(pPager);.  if
11db0 28 20 70 50 67 20 29 7b 0a 20 20 20 20 72 63 20  ( pPg ){.    rc 
11dc0 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
11dd0 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  gelist(pPg);.   
11de0 20 69 66 28 20 72 63 20 7c 7c 20 28 21 70 50 61   if( rc || (!pPa
11df0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 73  ger->noSync && s
11e00 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 26 70 50  qlite3OsSync(&pP
11e10 61 67 65 72 2d 3e 66 64 29 21 3d 53 51 4c 49 54  ager->fd)!=SQLIT
11e20 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 67  E_OK) ){.      g
11e30 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74  oto commit_abort
11e40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63  ;.    }.  }.  rc
11e50 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
11e60 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
11e70 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
11e80 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63   -1;.  return rc
11e90 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
11ea0 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
11eb0 65 73 20 77 72 6f 6e 67 20 64 75 72 69 6e 67 20  es wrong during 
11ec0 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  the commit proce
11ed0 73 73 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f  ss..  */.commit_
11ee0 61 62 6f 72 74 3a 0a 20 20 72 63 20 3d 20 73 71  abort:.  rc = sq
11ef0 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
11f00 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ack(pPager);.  i
11f10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11f20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
11f30 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20  ITE_FULL;.  }.  
11f40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11f50 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c  .** Rollback all
11f60 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64   changes.  The d
11f70 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61  atabase falls ba
11f80 63 6b 20 74 6f 20 72 65 61 64 2d 6f 6e 6c 79 20  ck to read-only 
11f90 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d  mode..** All in-
11fa0 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67  memory cache pag
11fb0 65 73 20 72 65 76 65 72 74 20 74 6f 20 74 68 65  es revert to the
11fc0 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  ir original data
11fd0 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68   contents..** Th
11fe0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c  e journal is del
11ff0 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  eted..**.** This
12000 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20   routine cannot 
12010 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65  fail unless some
12020 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
12030 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a  s not following.
12040 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c  ** the correct l
12050 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20  ocking protocol 
12060 28 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c  (SQLITE_PROTOCOL
12070 29 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65  ) or unless some
12080 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73   other.** proces
12090 73 20 69 73 20 77 72 69 74 69 6e 67 20 74 72 61  s is writing tra
120a0 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  sh into the jour
120b0 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45  nal file (SQLITE
120c0 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20  _CORRUPT) or.** 
120d0 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d  unless a prior m
120e0 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28  alloc() failed (
120f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20  SQLITE_NOMEM).  
12100 41 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  Appropriate erro
12110 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72  r.** codes are r
12120 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20  eturned for all 
12130 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e  these occasions.
12140 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20    Otherwise,.** 
12150 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
12160 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
12170 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
12180 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
12190 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
121a0 54 52 41 43 45 31 28 22 52 4f 4c 4c 42 41 43 4b  TRACE1("ROLLBACK
121b0 5c 6e 22 29 3b 0a 20 20 69 66 28 20 70 50 61 67  \n");.  if( pPag
121c0 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
121d0 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66   PgHdr *p;.    f
121e0 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c  or(p=pPager->pAl
121f0 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  l; p; p=p->pNext
12200 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69  All){.      PgHi
12210 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20  story *pHist;.  
12220 20 20 20 20 69 66 28 20 21 70 2d 3e 64 69 72 74      if( !p->dirt
12230 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  y ) continue;.  
12240 20 20 20 20 70 48 69 73 74 20 3d 20 50 47 48 44      pHist = PGHD
12250 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61  R_TO_HIST(p, pPa
12260 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
12270 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a  pHist->pOrig ){.
12280 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50          memcpy(P
12290 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c  GHDR_TO_DATA(p),
122a0 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70   pHist->pOrig, p
122b0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
122c0 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 32  ;.        TRACE2
122d0 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20  ("ROLLBACK-PAGE 
122e0 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 29 3b  %d\n", p->pgno);
122f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12300 20 20 20 20 20 20 54 52 41 43 45 32 28 22 50 41        TRACE2("PA
12310 47 45 20 25 64 20 69 73 20 63 6c 65 61 6e 5c 6e  GE %d is clean\n
12320 22 2c 20 70 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  ", p->pgno);.   
12330 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65 61 72     }.      clear
12340 48 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a  History(pHist);.
12350 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79 20 3d        p->dirty =
12360 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a   0;.      p->inJ
12370 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
12380 20 20 70 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b    p->inStmt = 0;
12390 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 53  .      p->pPrevS
123a0 74 6d 74 20 3d 20 70 2d 3e 70 4e 65 78 74 53 74  tmt = p->pNextSt
123b0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  mt = 0;.    }.  
123c0 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
123d0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
123e0 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
123f0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20  ->origDbSize;.  
12400 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65    memoryTruncate
12410 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
12420 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
12430 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
12440 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f  >state = SQLITE_
12450 52 45 41 44 4c 4f 43 4b 3b 0a 20 20 20 20 72 65  READLOCK;.    re
12460 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12470 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67    }..  if( !pPag
12480 65 72 2d 3e 64 69 72 74 79 46 69 6c 65 20 7c 7c  er->dirtyFile ||
12490 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
124a0 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  lOpen ){.    rc 
124b0 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
124c0 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
124d0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
124e0 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e  = -1;.    return
124f0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   rc;.  }..  if( 
12500 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21  pPager->errMask!
12510 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  =0 && pPager->er
12520 72 4d 61 73 6b 21 3d 50 41 47 45 52 5f 45 52 52  rMask!=PAGER_ERR
12530 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28  _FULL ){.    if(
12540 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
12550 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b  SQLITE_WRITELOCK
12560 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
12570 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
12580 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   1);.    }.    r
12590 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63  eturn pager_errc
125a0 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ode(pPager);.  }
125b0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
125c0 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 57 52 49  tate!=SQLITE_WRI
125d0 54 45 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  TELOCK ){.    re
125e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
125f0 20 20 7d 0a 20 20 72 63 20 3d 20 70 61 67 65 72    }.  rc = pager
12600 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
12610 2c 20 31 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 1);.  if( rc!=
12620 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12630 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
12640 52 55 50 54 3b 0a 20 20 20 20 70 50 61 67 65 72  RUPT;.    pPager
12650 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47  ->errMask |= PAG
12660 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a  ER_ERR_CORRUPT;.
12670 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62    }.  pPager->db
12680 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74  Size = -1;.  ret
12690 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
126a0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
126b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
126c0 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64  e is opened read
126d0 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46  -only.  Return F
126e0 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64  ALSE.** if the d
126f0 61 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74  atabase is (in t
12700 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e  heory) writable.
12710 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
12720 61 67 65 72 5f 69 73 72 65 61 64 6f 6e 6c 79 28  ager_isreadonly(
12730 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
12740 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
12750 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a  >readOnly;.}../*
12760 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
12770 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
12780 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
12790 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a  s only..*/.int *
127a0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 61  sqlite3pager_sta
127b0 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ts(Pager *pPager
127c0 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  ){.  static int 
127d0 61 5b 39 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70  a[9];.  a[0] = p
127e0 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61  Pager->nRef;.  a
127f0 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50  [1] = pPager->nP
12800 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50  age;.  a[2] = pP
12810 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20  ager->mxPage;.  
12820 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64  a[3] = pPager->d
12830 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20  bSize;.  a[4] = 
12840 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20  pPager->state;. 
12850 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[5] = pPager->
12860 65 72 72 4d 61 73 6b 3b 0a 20 20 61 5b 36 5d 20  errMask;.  a[6] 
12870 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a  = pPager->nHit;.
12880 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d    a[7] = pPager-
12890 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d  >nMiss;.  a[8] =
128a0 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a   pPager->nOvfl;.
128b0 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 0a 2f    return a;.}../
128c0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61  *.** Set the sta
128d0 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  tement rollback 
128e0 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  point..**.** Thi
128f0 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
12900 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20   be called with 
12910 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
12920 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a  journal already.
12930 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20  ** open.  A new 
12940 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
12950 6c 20 69 73 20 63 72 65 61 74 65 64 20 74 68 61  l is created tha
12960 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
12970 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61   rollback.** cha
12980 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  nges of a single
12990 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74   SQL command wit
129a0 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61  hin a larger tra
129b0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  nsaction..*/.int
129c0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
129d0 6d 74 5f 62 65 67 69 6e 28 50 61 67 65 72 20 2a  mt_begin(Pager *
129e0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
129f0 63 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b  c;.  char zTemp[
12a00 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
12a10 53 49 5a 45 5d 3b 0a 20 20 61 73 73 65 72 74 28  SIZE];.  assert(
12a20 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e   !pPager->stmtIn
12a30 55 73 65 20 29 3b 0a 20 20 54 52 41 43 45 31 28  Use );.  TRACE1(
12a40 22 53 54 4d 54 2d 42 45 47 49 4e 5c 6e 22 29 3b  "STMT-BEGIN\n");
12a50 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d  .  if( pPager->m
12a60 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67  emDb ){.    pPag
12a70 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
12a80 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  1;.    pPager->s
12a90 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72  tmtSize = pPager
12aa0 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 72 65  ->dbSize;.    re
12ab0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12ac0 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
12ad0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
12ae0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  {.    pPager->st
12af0 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a  mtAutoopen = 1;.
12b00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12b10 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  E_OK;.  }.  asse
12b20 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
12b30 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 50 61  nalOpen );.  pPa
12b40 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 73  ger->aInStmt = s
12b50 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61  qliteMalloc( pPa
12b60 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20  ger->dbSize/8 + 
12b70 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  1 );.  if( pPage
12b80 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20 29 7b  r->aInStmt==0 ){
12b90 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 52 65  .    sqlite3OsRe
12ba0 61 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  adLock(&pPager->
12bb0 66 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  fd);.    return 
12bc0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
12bd0 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
12be0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
12bf0 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65  sFileSize(&pPage
12c00 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d  r->jfd, &pPager-
12c10 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69  >stmtJSize);.  i
12c20 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d  f( rc ) goto stm
12c30 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a  t_begin_failed;.
12c40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
12c50 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 0a  ->stmtJSize == .
12c60 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
12c70 2a 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 6a  *JOURNAL_PG_SZ(j
12c80 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 29 2b 4a  ournal_format)+J
12c90 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 6a 6f  OURNAL_HDR_SZ(jo
12ca0 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 29 20 29 3b  urnal_format) );
12cb0 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65 72  .#endif.  pPager
12cc0 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50  ->stmtJSize = pP
12cd0 61 67 65 72 2d 3e 6e 52 65 63 2a 4a 4f 55 52 4e  ager->nRec*JOURN
12ce0 41 4c 5f 50 47 5f 53 5a 28 6a 6f 75 72 6e 61 6c  AL_PG_SZ(journal
12cf0 5f 66 6f 72 6d 61 74 29 0a 20 20 20 20 20 20 20  _format).       
12d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d10 20 20 2b 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f    + JOURNAL_HDR_
12d20 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61  SZ(journal_forma
12d30 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  t);.  pPager->st
12d40 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  mtSize = pPager-
12d50 3e 64 62 53 69 7a 65 3b 0a 20 20 69 66 28 20 21  >dbSize;.  if( !
12d60 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
12d70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
12d80 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65  ite3pager_opente
12d90 6d 70 28 7a 54 65 6d 70 2c 20 26 70 50 61 67 65  mp(zTemp, &pPage
12da0 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 69 66  r->stfd);.    if
12db0 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74  ( rc ) goto stmt
12dc0 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20  _begin_failed;. 
12dd0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f     pPager->stmtO
12de0 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  pen = 1;.    pPa
12df0 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20  ger->stmtNRec = 
12e00 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
12e10 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a  >stmtInUse = 1;.
12e20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12e30 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e  OK;. .stmt_begin
12e40 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70  _failed:.  if( p
12e50 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29  Pager->aInStmt )
12e60 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
12e70 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74  (pPager->aInStmt
12e80 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
12e90 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  InStmt = 0;.  }.
12ea0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12eb0 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73  /*.** Commit a s
12ec0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  tatement..*/.int
12ed0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
12ee0 6d 74 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20  mt_commit(Pager 
12ef0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
12f00 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
12f10 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  e ){.    PgHdr *
12f20 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20  pPg, *pNext;.   
12f30 20 54 52 41 43 45 31 28 22 53 54 4d 54 2d 43 4f   TRACE1("STMT-CO
12f40 4d 4d 49 54 5c 6e 22 29 3b 0a 20 20 20 20 69 66  MMIT\n");.    if
12f50 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  ( !pPager->memDb
12f60 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12f70 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
12f80 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 20  >stfd, 0);.     
12f90 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54 72 75   /* sqlite3OsTru
12fa0 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e 73  ncate(&pPager->s
12fb0 74 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20  tfd, 0); */.    
12fc0 20 20 73 71 6c 69 74 65 46 72 65 65 28 20 70 50    sqliteFree( pP
12fd0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 3b  ager->aInStmt );
12fe0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
12ff0 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  InStmt = 0;.    
13000 7d 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  }.    for(pPg=pP
13010 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67  ager->pStmt; pPg
13020 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20  ; pPg=pNext){.  
13030 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d      pNext = pPg-
13040 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20 20  >pNextStmt;.    
13050 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69    assert( pPg->i
13060 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70  nStmt );.      p
13070 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Pg->inStmt = 0;.
13080 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
13090 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Stmt = pPg->pNex
130a0 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  tStmt = 0;.     
130b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d   if( pPager->mem
130c0 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  Db ){.        Pg
130d0 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
130e0 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
130f0 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
13100 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
13110 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  pHist->pStmt);. 
13120 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53         pHist->pS
13130 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  tmt = 0;.      }
13140 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
13150 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b  r->stmtNRec = 0;
13160 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
13170 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20  tInUse = 0;.    
13180 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
13190 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
131a0 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
131b0 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  0;.  return SQLI
131c0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
131d0 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65  Rollback a state
131e0 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
131f0 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 72  ite3pager_stmt_r
13200 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
13210 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
13220 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
13230 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
13240 20 54 52 41 43 45 31 28 22 53 54 4d 54 2d 52 4f   TRACE1("STMT-RO
13250 4c 4c 42 41 43 4b 5c 6e 22 29 3b 0a 20 20 20 20  LLBACK\n");.    
13260 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  if( pPager->memD
13270 62 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  b ){.      PgHdr
13280 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 66 6f 72   *pPg;.      for
13290 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74  (pPg=pPager->pSt
132a0 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  mt; pPg; pPg=pPg
132b0 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20  ->pNextStmt){.  
132c0 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
132d0 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
132e0 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
132f0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
13300 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b   pHist->pStmt ){
13310 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
13320 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
13330 70 50 67 29 2c 20 70 48 69 73 74 2d 3e 70 53 74  pPg), pHist->pSt
13340 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  mt, pPager->page
13350 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Size);.         
13360 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73   sqliteFree(pHis
13370 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  t->pStmt);.     
13380 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
13390 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
133a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
133b0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
133c0 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
133d0 3b 0a 20 20 20 20 20 20 6d 65 6d 6f 72 79 54 72  ;.      memoryTr
133e0 75 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a  uncate(pPager);.
133f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
13400 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
13410 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
13420 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28  r_stmt_playback(
13430 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
13440 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
13450 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67  stmt_commit(pPag
13460 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
13470 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
13480 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
13490 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30  stmtAutoopen = 0
134a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
134b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
134c0 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
134d0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
134e0 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
134f0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67  char *sqlite3pag
13500 65 72 5f 66 69 6c 65 6e 61 6d 65 28 50 61 67 65  er_filename(Page
13510 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
13520 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69  turn pPager->zFi
13530 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
13540 20 53 65 74 20 74 68 65 20 63 6f 64 65 63 20 66   Set the codec f
13550 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f  or this pager.*/
13560 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
13570 65 72 5f 73 65 74 5f 63 6f 64 65 63 28 0a 20 20  er_set_codec(.  
13580 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20  Pager *pPager,. 
13590 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 29 28   void (*xCodec)(
135a0 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
135b0 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70  ,int),.  void *p
135c0 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50  CodecArg.){.  pP
135d0 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78  ager->xCodec = x
135e0 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d  Codec;.  pPager-
135f0 3e 70 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f  >pCodecArg = pCo
13600 64 65 63 41 72 67 3b 0a 7d 0a 0a 23 69 66 64 65  decArg;.}..#ifde
13610 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
13620 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74  .** Print a list
13630 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72  ing of all refer
13640 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64 20  enced pages and 
13650 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e  their ref count.
13660 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
13670 70 61 67 65 72 5f 72 65 66 64 75 6d 70 28 50 61  pager_refdump(Pa
13680 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
13690 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f  PgHdr *pPg;.  fo
136a0 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
136b0 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
136c0 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
136d0 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d   if( pPg->nRef<=
136e0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
136f0 20 20 70 72 69 6e 74 66 28 22 50 41 47 45 20 25    printf("PAGE %
13700 33 64 20 61 64 64 72 3d 30 78 25 30 38 78 20 6e  3d addr=0x%08x n
13710 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20  Ref=%d\n", .    
13720 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 69     pPg->pgno, (i
13730 6e 74 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  nt)PGHDR_TO_DATA
13740 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66  (pPg), pPg->nRef
13750 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.