/ Hex Artifact Content
Login

Artifact 444a49c2fa0a4d84d2877633865e1d5bc138ef57:


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 33 30  : pager.c,v 1.30
0350: 33 20 32 30 30 37 2f 30 33 2f 32 37 20 31 37 3a  3 2007/03/27 17:
0360: 33 37 3a 33 32 20 64 61 6e 69 65 6c 6b 31 39 37  37:32 danielk197
0370: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 66 6e 64  7 Exp $.*/.#ifnd
0380: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
0390: 49 53 4b 49 4f 0a 23 69 6e 63 6c 75 64 65 20 22  ISKIO.#include "
03a0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
03b0: 63 6c 75 64 65 20 22 6f 73 2e 68 22 0a 23 69 6e  clude "os.h".#in
03c0: 63 6c 75 64 65 20 22 70 61 67 65 72 2e 68 22 0a  clude "pager.h".
03d0: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
03e0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
03f0: 72 69 6e 67 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 4d  ring.h>../*.** M
0400: 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c  acros for troubl
0410: 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d  eshooting.  Norm
0420: 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a  ally turned off.
0430: 2a 2f 0a 23 69 66 20 30 0a 23 64 65 66 69 6e 65  */.#if 0.#define
0440: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
0450: 6e 74 66 20 70 72 69 6e 74 66 0a 23 64 65 66 69  ntf printf.#defi
0460: 6e 65 20 50 41 47 45 52 54 52 41 43 45 31 28 58  ne PAGERTRACE1(X
0470: 29 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  )       sqlite3D
0480: 65 62 75 67 50 72 69 6e 74 66 28 58 29 0a 23 64  ebugPrintf(X).#d
0490: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
04a0: 32 28 58 2c 59 29 20 20 20 20 20 73 71 6c 69 74  2(X,Y)     sqlit
04b0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c  e3DebugPrintf(X,
04c0: 59 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  Y).#define PAGER
04d0: 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 20 20 20  TRACE3(X,Y,Z)   
04e0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
04f0: 74 66 28 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e  tf(X,Y,Z).#defin
0500: 65 20 50 41 47 45 52 54 52 41 43 45 34 28 58 2c  e PAGERTRACE4(X,
0510: 59 2c 5a 2c 57 29 20 73 71 6c 69 74 65 33 44 65  Y,Z,W) sqlite3De
0520: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c  bugPrintf(X,Y,Z,
0530: 57 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  W).#define PAGER
0540: 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56  TRACE5(X,Y,Z,W,V
0550: 29 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72  ) sqlite3DebugPr
0560: 69 6e 74 66 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a  intf(X,Y,Z,W,V).
0570: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41  #else.#define PA
0580: 47 45 52 54 52 41 43 45 31 28 58 29 0a 23 64 65  GERTRACE1(X).#de
0590: 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45 32  fine PAGERTRACE2
05a0: 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20 50 41  (X,Y).#define PA
05b0: 47 45 52 54 52 41 43 45 33 28 58 2c 59 2c 5a 29  GERTRACE3(X,Y,Z)
05c0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
05d0: 41 43 45 34 28 58 2c 59 2c 5a 2c 57 29 0a 23 64  ACE4(X,Y,Z,W).#d
05e0: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
05f0: 35 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6e  5(X,Y,Z,W,V).#en
0600: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
0610: 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63  ollowing two mac
0620: 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69 74  ros are used wit
0630: 68 69 6e 20 74 68 65 20 50 41 47 45 52 54 52 41  hin the PAGERTRA
0640: 43 45 58 28 29 20 6d 61 63 72 6f 73 20 61 62 6f  CEX() macros abo
0650: 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f  ve.** to print o
0660: 75 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ut file-descript
0670: 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45  ors. .**.** PAGE
0680: 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f  RID() takes a po
0690: 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
06a0: 20 73 74 72 75 63 74 20 61 73 20 69 74 27 73 20   struct as it's 
06b0: 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a  argument. The.**
06c0: 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65   associated file
06d0: 2d 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72  -descriptor is r
06e0: 65 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e  eturned. FILEHAN
06f0: 44 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e  DLEID() takes an
0700: 20 4f 73 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63   OsFile.** struc
0710: 74 20 61 73 20 69 74 27 73 20 61 72 67 75 6d 65  t as it's argume
0720: 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  nt..*/.#define P
0730: 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74 29  AGERID(p) ((int)
0740: 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65  (p->fd)).#define
0750: 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64   FILEHANDLEID(fd
0760: 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a  ) ((int)fd)../*.
0770: 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63 68  ** The page cach
0780: 65 20 61 73 20 61 20 77 68 6f 6c 65 20 69 73 20  e as a whole is 
0790: 61 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f 66  always in one of
07a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
07b0: 2a 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  * states:.**.** 
07c0: 20 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20    PAGER_UNLOCK  
07d0: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
07e0: 61 63 68 65 20 69 73 20 6e 6f 74 20 63 75 72 72  ache is not curr
07f0: 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72  ently reading or
0800: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
0810: 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74 69             writi
0820: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
0830: 66 69 6c 65 2e 20 20 54 68 65 72 65 20 69 73 20  file.  There is 
0840: 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  no.**           
0850: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0860: 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 2e   held in memory.
0870: 20 20 54 68 69 73 20 69 73 20 74 68 65 20 69 6e    This is the in
0880: 69 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  itial.**        
0890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
08a0: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41  tate..**.**   PA
08b0: 47 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20  GER_SHARED      
08c0: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
08d0: 20 69 73 20 72 65 61 64 69 6e 67 20 74 68 65 20   is reading the 
08e0: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20  database..**    
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 20 20 57 72 69 74 69 6e 67 20 69 73 20 6e 6f     Writing is no
0910: 74 20 70 65 72 6d 69 74 74 65 64 2e 20 20 54 68  t permitted.  Th
0920: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20 20  ere can be.**   
0930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0940: 20 20 20 20 6d 75 6c 74 69 70 6c 65 20 72 65 61      multiple rea
0950: 64 65 72 73 20 61 63 63 65 73 73 69 6e 67 20 74  ders accessing t
0960: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
0970: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0980: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 61            file a
0990: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
09a0: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 52  .**.**   PAGER_R
09b0: 45 53 45 52 56 45 44 20 20 20 20 20 20 54 68 69  ESERVED      Thi
09c0: 73 20 70 72 6f 63 65 73 73 20 68 61 73 20 72 65  s process has re
09d0: 73 65 72 76 65 64 20 74 68 65 20 64 61 74 61 62  served the datab
09e0: 61 73 65 20 66 6f 72 20 77 72 69 74 69 6e 67 0a  ase for writing.
09f0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0a00: 20 20 20 20 20 20 20 20 20 62 75 74 20 68 61 73           but has
0a10: 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 61 6e   not yet made an
0a20: 79 20 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c 79  y changes.  Only
0a30: 20 6f 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a 20   one process.** 
0a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a50: 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65 20        at a time 
0a60: 63 61 6e 20 72 65 73 65 72 76 65 20 74 68 65 20  can reserve the 
0a70: 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6f  database.  The o
0a80: 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  riginal.**      
0a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0aa0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
0ab0: 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69  as not been modi
0ac0: 66 69 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a 2a  fied so other.**
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ae0: 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 65 73         processes
0af0: 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65   may still be re
0b00: 61 64 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69 73  ading the on-dis
0b10: 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  k.**            
0b20: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
0b30: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
0b40: 20 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56    PAGER_EXCLUSIV
0b50: 45 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63  E     The page c
0b60: 61 63 68 65 20 69 73 20 77 72 69 74 69 6e 67 20  ache is writing 
0b70: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b90: 20 20 20 20 20 20 20 41 63 63 65 73 73 20 69 73         Access is
0ba0: 20 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20   exclusive.  No 
0bb0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
0bc0: 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  or.**           
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72 65              thre
0be0: 61 64 73 20 63 61 6e 20 62 65 20 72 65 61 64 69  ads can be readi
0bf0: 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77 68  ng or writing wh
0c00: 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20  ile one.**      
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c20: 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74   process is writ
0c30: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ing..**.**   PAG
0c40: 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20 20  ER_SYNCED       
0c50: 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73   The pager moves
0c60: 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20 66   to this state f
0c70: 72 6f 6d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  rom PAGER_EXCLUS
0c80: 49 56 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  IVE.**          
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 66 74               aft
0ca0: 65 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  er all dirty pag
0cb0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
0cc0: 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20  tten to the.**  
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ce0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
0cf0: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  le and the file 
0d00: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
0d10: 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  to.**           
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 6b              disk
0d30: 2e 20 41 6c 6c 20 74 68 61 74 20 72 65 6d 61 69  . All that remai
0d40: 6e 73 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 72  ns to do is to r
0d50: 65 6d 6f 76 65 20 74 68 65 0a 2a 2a 20 20 20 20  emove the.**    
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d70: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
0d80: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
0d90: 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 20  ion will be.**  
0da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0db0: 20 20 20 20 20 63 6f 6d 6d 69 74 74 65 64 2e 0a       committed..
0dc0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63  **.** The page c
0dd0: 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69 6e  ache comes up in
0de0: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20   PAGER_UNLOCK.  
0df0: 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  The first time a
0e00: 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
0e10: 47 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74 68  Get() occurs, th
0e20: 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69  e state transiti
0e30: 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ons to PAGER_SHA
0e40: 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c  RED..** After al
0e50: 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65  l pages have bee
0e60: 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67  n released using
0e70: 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72   sqlite_page_unr
0e80: 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61  ef(),.** the sta
0e90: 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62  te transitions b
0ea0: 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e 4c  ack to PAGER_UNL
0eb0: 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20  OCK.  The first 
0ec0: 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c  time.** that sql
0ed0: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
0ee0: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
0ef0: 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e  state transition
0f00: 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52 45  s to.** PAGER_RE
0f10: 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20 74  SERVED.  (Note t
0f20: 68 61 74 20 73 71 6c 69 74 65 5f 70 61 67 65 5f  hat sqlite_page_
0f30: 77 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79  write() can only
0f40: 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e   be.** called on
0f50: 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   an outstanding 
0f60: 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e 73  page which means
0f70: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
0f80: 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50 41  must.** be in PA
0f90: 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f 72  GER_SHARED befor
0fa0: 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e 73  e it transitions
0fb0: 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52 56   to PAGER_RESERV
0fc0: 45 44 2e 29 0a 2a 2a 20 54 68 65 20 74 72 61 6e  ED.).** The tran
0fd0: 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52 5f  sition to PAGER_
0fe0: 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72 73  EXCLUSIVE occurs
0ff0: 20 77 68 65 6e 20 62 65 66 6f 72 65 20 61 6e 79   when before any
1000: 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20   changes.** are 
1010: 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
1020: 62 61 73 65 20 66 69 6c 65 2e 20 20 41 66 74 65  base file.  Afte
1030: 72 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65  r an sqlite3Page
1040: 72 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 6f  rRollback().** o
1050: 72 20 73 71 6c 69 74 65 5f 70 61 67 65 72 5f 63  r sqlite_pager_c
1060: 6f 6d 6d 69 74 28 29 2c 20 74 68 65 20 73 74 61  ommit(), the sta
1070: 74 65 20 67 6f 65 73 20 62 61 63 6b 20 74 6f 20  te goes back to 
1080: 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2f  PAGER_SHARED..*/
1090: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 55  .#define PAGER_U
10a0: 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23 64 65  NLOCK      0.#de
10b0: 66 69 6e 65 20 50 41 47 45 52 5f 53 48 41 52 45  fine PAGER_SHARE
10c0: 44 20 20 20 20 20 20 31 20 20 20 2f 2a 20 73 61  D      1   /* sa
10d0: 6d 65 20 61 73 20 53 48 41 52 45 44 5f 4c 4f 43  me as SHARED_LOC
10e0: 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  K */.#define PAG
10f0: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 32  ER_RESERVED    2
1100: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 52 45     /* same as RE
1110: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23  SERVED_LOCK */.#
1120: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 58 43  define PAGER_EXC
1130: 4c 55 53 49 56 45 20 20 20 34 20 20 20 2f 2a 20  LUSIVE   4   /* 
1140: 73 61 6d 65 20 61 73 20 45 58 43 4c 55 53 49 56  same as EXCLUSIV
1150: 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e  E_LOCK */.#defin
1160: 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20  e PAGER_SYNCED  
1170: 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20      5../*.** If 
1180: 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f  the SQLITE_BUSY_
1190: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6d 61  RESERVED_LOCK ma
11a0: 63 72 6f 20 69 73 20 73 65 74 20 74 6f 20 74 72  cro is set to tr
11b0: 75 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ue at compile-ti
11c0: 6d 65 2c 0a 2a 2a 20 74 68 65 6e 20 66 61 69 6c  me,.** then fail
11d0: 65 64 20 61 74 74 65 6d 70 74 73 20 74 6f 20 67  ed attempts to g
11e0: 65 74 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  et a reserved lo
11f0: 63 6b 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74  ck will invoke t
1200: 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
1210: 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 6f 66 66  ..** This is off
1220: 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20 54 6f   by default.  To
1230: 20 73 65 65 20 77 68 79 2c 20 63 6f 6e 73 69 64   see why, consid
1240: 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  er the following
1250: 20 73 63 65 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a   scenario:.** .*
1260: 2a 20 53 75 70 70 6f 73 65 20 74 68 72 65 61 64  * Suppose thread
1270: 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61   A already has a
1280: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64   shared lock and
1290: 20 77 61 6e 74 73 20 61 20 72 65 73 65 72 76 65   wants a reserve
12a0: 64 20 6c 6f 63 6b 2e 0a 2a 2a 20 54 68 72 65 61  d lock..** Threa
12b0: 64 20 42 20 61 6c 72 65 61 64 79 20 68 61 73 20  d B already has 
12c0: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  a reserved lock 
12d0: 61 6e 64 20 77 61 6e 74 73 20 61 6e 20 65 78 63  and wants an exc
12e0: 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49 66  lusive lock.  If
12f0: 0a 2a 2a 20 62 6f 74 68 20 74 68 72 65 61 64 73  .** both threads
1300: 20 61 72 65 20 75 73 69 6e 67 20 74 68 65 69 72   are using their
1310: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 73 2c   busy callbacks,
1320: 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 6c   it might be a l
1330: 6f 6e 67 20 74 69 6d 65 0a 2a 2a 20 62 65 20 66  ong time.** be f
1340: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 68  or one of the th
1350: 72 65 61 64 73 20 67 69 76 65 20 75 70 20 61 6e  reads give up an
1360: 64 20 61 6c 6c 6f 77 73 20 74 68 65 20 6f 74 68  d allows the oth
1370: 65 72 20 74 6f 20 70 72 6f 63 65 65 64 2e 0a 2a  er to proceed..*
1380: 2a 20 42 75 74 20 69 66 20 74 68 65 20 74 68 72  * But if the thr
1390: 65 61 64 20 74 72 79 69 6e 67 20 74 6f 20 67 65  ead trying to ge
13a0: 74 20 74 68 65 20 72 65 73 65 72 76 65 64 20 6c  t the reserved l
13b0: 6f 63 6b 20 67 69 76 65 73 20 75 70 20 71 75 69  ock gives up qui
13c0: 63 6b 6c 79 0a 2a 2a 20 28 69 66 20 69 74 20 6e  ckly.** (if it n
13d0: 65 76 65 72 20 69 6e 76 6f 6b 65 73 20 69 74 73  ever invokes its
13e0: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 29 20   busy callback) 
13f0: 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  then the content
1400: 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 72  ion will be.** r
1410: 65 73 6f 6c 76 65 64 20 71 75 69 63 6b 6c 79 2e  esolved quickly.
1420: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
1430: 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44  TE_BUSY_RESERVED
1440: 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20 53  _LOCK.# define S
1450: 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52  QLITE_BUSY_RESER
1460: 56 45 44 5f 4c 4f 43 4b 20 30 0a 23 65 6e 64 69  VED_LOCK 0.#endi
1470: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61  f../*.** This ma
1480: 63 72 6f 20 72 6f 75 6e 64 73 20 76 61 6c 75 65  cro rounds value
1490: 73 20 75 70 20 73 6f 20 74 68 61 74 20 69 66 20  s up so that if 
14a0: 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20  the value is an 
14b0: 61 64 64 72 65 73 73 20 69 74 0a 2a 2a 20 69 73  address it.** is
14c0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
14d0: 65 20 61 6e 20 61 64 64 72 65 73 73 20 74 68 61  e an address tha
14e0: 74 20 69 73 20 61 6c 69 67 6e 65 64 20 74 6f 20  t is aligned to 
14f0: 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61  an 8-byte bounda
1500: 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46  ry..*/.#define F
1510: 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 58  ORCE_ALIGNMENT(X
1520: 29 20 20 20 28 28 28 58 29 2b 37 29 26 7e 37 29  )   (((X)+7)&~7)
1530: 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 2d  ../*.** Each in-
1540: 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20  memory image of 
1550: 61 20 70 61 67 65 20 62 65 67 69 6e 73 20 77 69  a page begins wi
1560: 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
1570: 20 68 65 61 64 65 72 2e 0a 2a 2a 20 54 68 69 73   header..** This
1580: 20 68 65 61 64 65 72 20 69 73 20 6f 6e 6c 79 20   header is only 
1590: 76 69 73 69 62 6c 65 20 74 6f 20 74 68 69 73 20  visible to this 
15a0: 70 61 67 65 72 20 6d 6f 64 75 6c 65 2e 20 20 54  pager module.  T
15b0: 68 65 20 63 6c 69 65 6e 74 0a 2a 2a 20 63 6f 64  he client.** cod
15c0: 65 20 74 68 61 74 20 63 61 6c 6c 73 20 70 61 67  e that calls pag
15d0: 65 72 20 73 65 65 73 20 6f 6e 6c 79 20 74 68 65  er sees only the
15e0: 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f   data that follo
15f0: 77 73 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a  ws the header..*
1600: 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20 63 6f 64 65  *.** Client code
1610: 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 73 71 6c   should call sql
1620: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
1630: 20 6f 6e 20 61 20 70 61 67 65 20 70 72 69 6f 72   on a page prior
1640: 20 74 6f 20 6d 61 6b 69 6e 67 0a 2a 2a 20 61 6e   to making.** an
1650: 79 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20  y modifications 
1660: 74 6f 20 74 68 61 74 20 70 61 67 65 2e 20 20 54  to that page.  T
1670: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 73 71  he first time sq
1680: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1690: 29 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20  ).** is called, 
16a0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
16b0: 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 77  e contents are w
16c0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
16d0: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72  rollback.** jour
16e0: 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 69 6e  nal and PgHdr.in
16f0: 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48 64  Journal and PgHd
1700: 72 2e 6e 65 65 64 53 79 6e 63 20 61 72 65 20 73  r.needSync are s
1710: 65 74 2e 20 20 4c 61 74 65 72 2c 20 6f 6e 63 65  et.  Later, once
1720: 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
1730: 70 61 67 65 20 68 61 73 20 6d 61 64 65 20 69 74  page has made it
1740: 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 73   onto the disk s
1750: 75 72 66 61 63 65 2c 20 50 67 48 64 72 2e 6e 65  urface, PgHdr.ne
1760: 65 64 53 79 6e 63 0a 2a 2a 20 69 73 20 63 6c 65  edSync.** is cle
1770: 61 72 65 64 2e 20 20 54 68 65 20 6d 6f 64 69 66  ared.  The modif
1780: 69 65 64 20 70 61 67 65 20 63 61 6e 6e 6f 74 20  ied page cannot 
1790: 62 65 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20  be written back 
17a0: 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
17b0: 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  l.** database fi
17c0: 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 6a 6f 75  le until the jou
17d0: 72 6e 61 6c 20 70 61 67 65 73 20 68 61 73 20 62  rnal pages has b
17e0: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69  een synced to di
17f0: 73 6b 20 61 6e 64 20 74 68 65 0a 2a 2a 20 50 67  sk and the.** Pg
1800: 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 68 61 73  Hdr.needSync has
1810: 20 62 65 65 6e 20 63 6c 65 61 72 65 64 2e 0a 2a   been cleared..*
1820: 2a 0a 2a 2a 20 54 68 65 20 50 67 48 64 72 2e 64  *.** The PgHdr.d
1830: 69 72 74 79 20 66 6c 61 67 20 69 73 20 73 65 74  irty flag is set
1840: 20 77 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67   when sqlite3Pag
1850: 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
1860: 6c 65 64 20 61 6e 64 0a 2a 2a 20 69 73 20 63 6c  led and.** is cl
1870: 65 61 72 65 64 20 61 67 61 69 6e 20 77 68 65 6e  eared again when
1880: 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
1890: 74 20 69 73 20 77 72 69 74 74 65 6e 20 62 61 63  t is written bac
18a0: 6b 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  k to the origina
18b0: 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  l.** database fi
18c0: 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  le..*/.typedef s
18d0: 74 72 75 63 74 20 50 67 48 64 72 20 50 67 48 64  truct PgHdr PgHd
18e0: 72 3b 0a 73 74 72 75 63 74 20 50 67 48 64 72 20  r;.struct PgHdr 
18f0: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
1900: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
1910: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
1920: 74 6f 20 77 68 69 63 68 20 74 68 69 73 20 70 61  to which this pa
1930: 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20  ge belongs */.  
1940: 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20  Pgno pgno;      
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1960: 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
1970: 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20  r for this page 
1980: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78  */.  PgHdr *pNex
1990: 74 48 61 73 68 2c 20 2a 70 50 72 65 76 48 61 73  tHash, *pPrevHas
19a0: 68 3b 20 20 2f 2a 20 48 61 73 68 20 63 6f 6c 6c  h;  /* Hash coll
19b0: 69 73 69 6f 6e 20 63 68 61 69 6e 20 66 6f 72 20  ision chain for 
19c0: 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20  PgHdr.pgno */.  
19d0: 50 67 48 64 72 20 2a 70 4e 65 78 74 46 72 65 65  PgHdr *pNextFree
19e0: 2c 20 2a 70 50 72 65 76 46 72 65 65 3b 20 20 2f  , *pPrevFree;  /
19f0: 2a 20 46 72 65 65 6c 69 73 74 20 6f 66 20 70 61  * Freelist of pa
1a00: 67 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d  ges where nRef==
1a10: 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  0 */.  PgHdr *pN
1a20: 65 78 74 41 6c 6c 3b 20 20 20 20 20 20 20 20 20  extAll;         
1a30: 20 20 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20        /* A list 
1a40: 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a  of all pages */.
1a50: 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 53 74    PgHdr *pNextSt
1a60: 6d 74 2c 20 2a 70 50 72 65 76 53 74 6d 74 3b 20  mt, *pPrevStmt; 
1a70: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65   /* List of page
1a80: 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  s in the stateme
1a90: 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  nt journal */.  
1aa0: 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20  u8 inJournal;   
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ac0: 2a 20 54 52 55 45 20 69 66 20 68 61 73 20 62 65  * TRUE if has be
1ad0: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f  en written to jo
1ae0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e  urnal */.  u8 in
1af0: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
1b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55            /* TRU
1b10: 45 20 69 66 20 69 6e 20 74 68 65 20 73 74 61 74  E if in the stat
1b20: 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  ement subjournal
1b30: 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 3b 20   */.  u8 dirty; 
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b50: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20       /* TRUE if 
1b60: 77 65 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65  we need to write
1b70: 20 62 61 63 6b 20 63 68 61 6e 67 65 73 20 2a 2f   back changes */
1b80: 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20  .  u8 needSync; 
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75 72 6e 61    /* Sync journa
1bb0: 6c 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  l before writing
1bc0: 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
1bd0: 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  u8 alwaysRollbac
1be0: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k;             /
1bf0: 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72  * Disable dont_r
1c00: 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68  ollback() for th
1c10: 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 73 68 6f  is page */.  sho
1c20: 72 74 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  rt int nRef;    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1c40: 75 6d 62 65 72 20 6f 66 20 75 73 65 72 73 20 6f  umber of users o
1c50: 66 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  f this page */. 
1c60: 20 50 67 48 64 72 20 2a 70 44 69 72 74 79 2c 20   PgHdr *pDirty, 
1c70: 2a 70 50 72 65 76 44 69 72 74 79 3b 20 20 20 20  *pPrevDirty;    
1c80: 2f 2a 20 44 69 72 74 79 20 70 61 67 65 73 20 2a  /* Dirty pages *
1c90: 2f 0a 20 20 75 33 32 20 6e 6f 74 55 73 65 64 3b  /.  u32 notUsed;
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb0: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 73 70 61     /* Buffer spa
1cc0: 63 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ce */.#ifdef SQL
1cd0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
1ce0: 20 20 75 33 32 20 70 61 67 65 48 61 73 68 3b 0a    u32 pageHash;.
1cf0: 23 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50 61 67  #endif.  /* pPag
1d00: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
1d10: 65 73 20 6f 66 20 70 61 67 65 20 64 61 74 61 20  es of page data 
1d20: 66 6f 6c 6c 6f 77 20 74 68 69 73 20 68 65 61 64  follow this head
1d30: 65 72 20 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72  er */.  /* Pager
1d40: 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66  .nExtra bytes of
1d50: 20 6c 6f 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c   local data foll
1d60: 6f 77 20 74 68 65 20 70 61 67 65 20 64 61 74 61  ow the page data
1d70: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f   */.};../*.** Fo
1d80: 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f  r an in-memory o
1d90: 6e 6c 79 20 64 61 74 61 62 61 73 65 2c 20 73 6f  nly database, so
1da0: 6d 65 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  me extra informa
1db0: 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64  tion is recorded
1dc0: 20 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68 20 70   about.** each p
1dd0: 61 67 65 20 73 6f 20 74 68 61 74 20 63 68 61 6e  age so that chan
1de0: 67 65 73 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  ges can be rolle
1df0: 64 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72 6e 61  d back.  (Journa
1e00: 6c 20 66 69 6c 65 73 20 61 72 65 20 6e 6f 74 0a  l files are not.
1e10: 2a 2a 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ** used for in-m
1e20: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e  emory databases.
1e30: 29 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  )  The following
1e40: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
1e50: 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20  added to.** the 
1e60: 65 6e 64 20 6f 66 20 65 76 65 72 79 20 45 58 54  end of every EXT
1e70: 52 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69 6e 2d  RA block for in-
1e80: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73  memory databases
1e90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 66  ..**.** This inf
1ea0: 6f 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64 20 68  ormation could h
1eb0: 61 76 65 20 62 65 65 6e 20 61 64 64 65 64 20 64  ave been added d
1ec0: 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 50  irectly to the P
1ed0: 67 48 64 72 20 73 74 72 75 63 74 75 72 65 2e 0a  gHdr structure..
1ee0: 2a 2a 20 42 75 74 20 74 68 65 6e 20 69 74 20 77  ** But then it w
1ef0: 6f 75 6c 64 20 74 61 6b 65 20 75 70 20 61 6e 20  ould take up an 
1f00: 65 78 74 72 61 20 38 20 62 79 74 65 73 20 6f 66  extra 8 bytes of
1f10: 20 73 74 6f 72 61 67 65 20 6f 6e 20 65 76 65 72   storage on ever
1f20: 79 20 50 67 48 64 72 0a 2a 2a 20 65 76 65 6e 20  y PgHdr.** even 
1f30: 66 6f 72 20 64 69 73 6b 2d 62 61 73 65 64 20 64  for disk-based d
1f40: 61 74 61 62 61 73 65 73 2e 20 20 53 70 6c 69 74  atabases.  Split
1f50: 74 69 6e 67 20 69 74 20 6f 75 74 20 73 61 76 65  ting it out save
1f60: 73 20 38 20 62 79 74 65 73 2e 20 20 54 68 69 73  s 8 bytes.  This
1f70: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20 73 61  .** is only a sa
1f80: 76 69 6e 67 73 20 6f 66 20 30 2e 38 25 20 62 75  vings of 0.8% bu
1f90: 74 20 74 68 6f 73 65 20 70 65 72 63 65 6e 74 61  t those percenta
1fa0: 67 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f 0a 74  ges add up..*/.t
1fb0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67  ypedef struct Pg
1fc0: 48 69 73 74 6f 72 79 20 50 67 48 69 73 74 6f 72  History PgHistor
1fd0: 79 3b 0a 73 74 72 75 63 74 20 50 67 48 69 73 74  y;.struct PgHist
1fe0: 6f 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f 72 69  ory {.  u8 *pOri
1ff0: 67 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  g;     /* Origin
2000: 61 6c 20 70 61 67 65 20 74 65 78 74 2e 20 20 52  al page text.  R
2010: 65 73 74 6f 72 65 20 74 6f 20 74 68 69 73 20 6f  estore to this o
2020: 6e 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62 61 63  n a full rollbac
2030: 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74 6d 74  k */.  u8 *pStmt
2040: 3b 20 20 20 20 20 2f 2a 20 54 65 78 74 20 61 73  ;     /* Text as
2050: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
2060: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
2070: 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e  current statemen
2080: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  t */.};../*.** A
2090: 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20   macro used for 
20a0: 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64  invoking the cod
20b0: 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ec if there is o
20c0: 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ne.*/.#ifdef SQL
20d0: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20  ITE_HAS_CODEC.# 
20e0: 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c  define CODEC1(P,
20f0: 44 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78 43  D,N,X) if( P->xC
2100: 6f 64 65 63 21 3d 30 20 29 7b 20 50 2d 3e 78 43  odec!=0 ){ P->xC
2110: 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72  odec(P->pCodecAr
2120: 67 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64 65  g,D,N,X); }.# de
2130: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
2140: 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 28 50 2d  N,X) ((char*)(P-
2150: 3e 78 43 6f 64 65 63 21 3d 30 3f 50 2d 3e 78 43  >xCodec!=0?P->xC
2160: 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72  odec(P->pCodecAr
2170: 67 2c 44 2c 4e 2c 58 29 3a 44 29 29 0a 23 65 6c  g,D,N,X):D)).#el
2180: 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  se.# define CODE
2190: 43 31 28 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20 4e  C1(P,D,N,X) /* N
21a0: 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e 65  O-OP */.# define
21b0: 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29   CODEC2(P,D,N,X)
21c0: 20 28 28 63 68 61 72 2a 29 44 29 0a 23 65 6e 64   ((char*)D).#end
21d0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  if../*.** Conver
21e0: 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  t a pointer to a
21f0: 20 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70 6f   PgHdr into a po
2200: 69 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61 74  inter to its dat
2210: 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61 67  a.** and back ag
2220: 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ain..*/.#define 
2230: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50 29  PGHDR_TO_DATA(P)
2240: 20 20 28 28 76 6f 69 64 2a 29 28 26 28 50 29 5b    ((void*)(&(P)[
2250: 31 5d 29 29 0a 23 64 65 66 69 6e 65 20 44 41 54  1])).#define DAT
2260: 41 5f 54 4f 5f 50 47 48 44 52 28 44 29 20 20 28  A_TO_PGHDR(D)  (
2270: 26 28 28 50 67 48 64 72 2a 29 28 44 29 29 5b 2d  &((PgHdr*)(D))[-
2280: 31 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44  1]).#define PGHD
2290: 52 5f 54 4f 5f 45 58 54 52 41 28 47 2c 50 29 20  R_TO_EXTRA(G,P) 
22a0: 28 28 76 6f 69 64 2a 29 26 28 28 63 68 61 72 2a  ((void*)&((char*
22b0: 29 28 26 28 47 29 5b 31 5d 29 29 5b 28 50 29 2d  )(&(G)[1]))[(P)-
22c0: 3e 70 61 67 65 53 69 7a 65 5d 29 0a 23 64 65 66  >pageSize]).#def
22d0: 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  ine PGHDR_TO_HIS
22e0: 54 28 50 2c 50 47 52 29 20 20 5c 0a 20 20 20 20  T(P,PGR)  \.    
22f0: 20 20 20 20 20 20 20 20 28 28 50 67 48 69 73 74          ((PgHist
2300: 6f 72 79 2a 29 26 28 28 63 68 61 72 2a 29 28 26  ory*)&((char*)(&
2310: 28 50 29 5b 31 5d 29 29 5b 28 50 47 52 29 2d 3e  (P)[1]))[(PGR)->
2320: 70 61 67 65 53 69 7a 65 2b 28 50 47 52 29 2d 3e  pageSize+(PGR)->
2330: 6e 45 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20  nExtra])../*.** 
2340: 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68  A open page cach
2350: 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  e is an instance
2360: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2370: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  g structure..**.
2380: 2a 2a 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  ** Pager.errCode
2390: 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 53   may be set to S
23a0: 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c  QLITE_IOERR, SQL
23b0: 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 53 51 4c  ITE_CORRUPT, SQL
23c0: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 0a 2a 2a 20  ITE_PROTOCOL.** 
23d0: 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 20  or SQLITE_FULL. 
23e0: 4f 6e 63 65 20 6f 6e 65 20 6f 66 20 74 68 65 20  Once one of the 
23f0: 66 69 72 73 74 20 74 68 72 65 65 20 65 72 72 6f  first three erro
2400: 72 73 20 6f 63 63 75 72 73 2c 20 69 74 20 70 65  rs occurs, it pe
2410: 72 73 69 73 74 73 0a 2a 2a 20 61 6e 64 20 69 73  rsists.** and is
2420: 20 72 65 74 75 72 6e 65 64 20 61 73 20 74 68 65   returned as the
2430: 20 72 65 73 75 6c 74 20 6f 66 20 65 76 65 72 79   result of every
2440: 20 6d 61 6a 6f 72 20 70 61 67 65 72 20 41 50 49   major pager API
2450: 20 63 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20 53   call.  The.** S
2460: 51 4c 49 54 45 5f 46 55 4c 4c 20 72 65 74 75 72  QLITE_FULL retur
2470: 6e 20 63 6f 64 65 20 69 73 20 73 6c 69 67 68 74  n code is slight
2480: 6c 79 20 64 69 66 66 65 72 65 6e 74 2e 20 49 74  ly different. It
2490: 20 70 65 72 73 69 73 74 73 20 6f 6e 6c 79 20 75   persists only u
24a0: 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6e 65 78 74  ntil the.** next
24b0: 20 73 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c   successful roll
24c0: 62 61 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65  back is performe
24d0: 64 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63  d on the pager c
24e0: 61 63 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 53  ache. Also,.** S
24f0: 51 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20  QLITE_FULL does 
2500: 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 73  not affect the s
2510: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
2520: 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65   and sqlite3Page
2530: 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 41 50 49  rLookup().** API
2540: 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74 69 6c  s, they may stil
2550: 6c 20 62 65 20 75 73 65 64 20 73 75 63 63 65 73  l be used succes
2560: 73 66 75 6c 6c 79 2e 0a 2a 2f 0a 73 74 72 75 63  sfully..*/.struc
2570: 74 20 50 61 67 65 72 20 7b 0a 20 20 75 38 20 6a  t Pager {.  u8 j
2580: 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20  ournalOpen;     
2590: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
25a0: 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  if journal file 
25b0: 64 65 73 63 72 69 70 74 6f 72 73 20 69 73 20 76  descriptors is v
25c0: 61 6c 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f 75  alid */.  u8 jou
25d0: 72 6e 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20  rnalStarted;    
25e0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
25f0: 20 68 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e   header of journ
2600: 61 6c 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a  al is synced */.
2610: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
2620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2630: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
2640: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
2650: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52  file */.  u8 noR
2660: 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20  eadlock;        
2670: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
2680: 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e  bother to obtain
2690: 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20   readlocks */.  
26a0: 75 38 20 73 74 6d 74 4f 70 65 6e 3b 20 20 20 20  u8 stmtOpen;    
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
26c0: 72 75 65 20 69 66 20 74 68 65 20 73 74 61 74 65  rue if the state
26d0: 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20  ment subjournal 
26e0: 69 73 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20  is open */.  u8 
26f0: 73 74 6d 74 49 6e 55 73 65 3b 20 20 20 20 20 20  stmtInUse;      
2700: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2710: 20 77 65 20 61 72 65 20 69 6e 20 61 20 73 74 61   we are in a sta
2720: 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
2730: 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 73 74  ction */.  u8 st
2740: 6d 74 41 75 74 6f 6f 70 65 6e 3b 20 20 20 20 20  mtAutoopen;     
2750: 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 73         /* Open s
2760: 74 6d 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  tmt journal when
2770: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73   main journal is
2780: 20 6f 70 65 6e 65 64 2a 2f 0a 20 20 75 38 20 6e   opened*/.  u8 n
2790: 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  oSync;          
27a0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
27b0: 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  t sync the journ
27c0: 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20  al if true */.  
27d0: 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20  u8 fullSync;    
27e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
27f0: 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66  o extra syncs of
2800: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
2810: 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20   robustness */. 
2820: 20 75 38 20 66 75 6c 6c 5f 66 73 79 6e 63 3b 20   u8 full_fsync; 
2830: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2840: 55 73 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20  Use F_FULLFSYNC 
2850: 77 68 65 6e 20 61 76 61 69 6c 61 62 6c 65 20 2a  when available *
2860: 2f 0a 20 20 75 38 20 73 74 61 74 65 3b 20 20 20  /.  u8 state;   
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2880: 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c  /* PAGER_UNLOCK,
2890: 20 5f 53 48 41 52 45 44 2c 20 5f 52 45 53 45 52   _SHARED, _RESER
28a0: 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75  VED, etc. */.  u
28b0: 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20  8 tempFile;     
28c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46             /* zF
28d0: 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d  ilename is a tem
28e0: 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20  porary file */. 
28f0: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2910: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
2920: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
2930: 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20  .  u8 needSync; 
2940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2950: 2a 20 54 72 75 65 20 69 66 20 61 6e 20 66 73 79  * True if an fsy
2960: 6e 63 28 29 20 69 73 20 6e 65 65 64 65 64 20 6f  nc() is needed o
2970: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
2980: 0a 20 20 75 38 20 64 69 72 74 79 43 61 63 68 65  .  u8 dirtyCache
2990: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
29a0: 2a 20 54 72 75 65 20 69 66 20 63 61 63 68 65 64  * True if cached
29b0: 20 70 61 67 65 73 20 68 61 76 65 20 63 68 61 6e   pages have chan
29c0: 67 65 64 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61  ged */.  u8 alwa
29d0: 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20  ysRollback;     
29e0: 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20       /* Disable 
29f0: 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
2a00: 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f  for all pages */
2a10: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a30: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
2a40: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
2a50: 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72  /.  u8 setMaster
2a60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a70: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a  /* True if a m-j
2a80: 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77   name has been w
2a90: 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a  ritten to jrnl *
2aa0: 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b  /.  int errCode;
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac0: 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61  /* One of severa
2ad0: 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72  l kinds of error
2ae0: 73 20 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a  s */.  int dbSiz
2af0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2b00: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2b10: 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c  pages in the fil
2b20: 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44  e */.  int origD
2b30: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
2b40: 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66     /* dbSize bef
2b50: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
2b60: 63 68 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20  change */.  int 
2b70: 73 74 6d 74 53 69 7a 65 3b 20 20 20 20 20 20 20  stmtSize;       
2b80: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
2b90: 6f 66 20 64 61 74 61 62 61 73 65 20 28 69 6e 20  of database (in 
2ba0: 70 61 67 65 73 29 20 61 74 20 73 74 6d 74 5f 62  pages) at stmt_b
2bb0: 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  egin() */.  int 
2bc0: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
2bd0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2be0: 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74  r of pages writt
2bf0: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
2c00: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
2c10: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
2c20: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
2c30: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
2c40: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
2c50: 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 4e 52   */.  int stmtNR
2c60: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
2c70: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
2c80: 65 63 6f 72 64 73 20 69 6e 20 73 74 6d 74 20 73  ecords in stmt s
2c90: 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  ubjournal */.  i
2ca0: 6e 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20  nt nExtra;      
2cb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
2cc0: 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
2cd0: 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  s to each in-mem
2ce0: 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
2cf0: 74 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20  t pageSize;     
2d00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2d10: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
2d20: 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  a page */.  int 
2d30: 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
2d40: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
2d50: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
2d60: 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f 0a 20 20  mory pages */.  
2d70: 69 6e 74 20 6e 4d 61 78 50 61 67 65 3b 20 20 20  int nMaxPage;   
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
2d90: 69 67 68 20 77 61 74 65 72 20 6d 61 72 6b 20 6f  igh water mark o
2da0: 66 20 6e 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74  f nPage */.  int
2db0: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
2dc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2dd0: 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
2de0: 70 61 67 65 73 20 77 69 74 68 20 50 67 48 64 72  pages with PgHdr
2df0: 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74  .nRef>0 */.  int
2e00: 20 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20 20   mxPage;        
2e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
2e20: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  mum number of pa
2e30: 67 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63  ges to hold in c
2e40: 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49  ache */.  u8 *aI
2e50: 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  nJournal;       
2e60: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74        /* One bit
2e70: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
2e80: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2e90: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e  ile */.  u8 *aIn
2ea0: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
2eb0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
2ec0: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
2ed0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
2ee0: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
2ef0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
2f00: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
2f10: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
2f20: 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b   char *zJournal;
2f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f40: 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  Name of the jour
2f50: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  nal file */.  ch
2f60: 61 72 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b 20  ar *zDirectory; 
2f70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72            /* Dir
2f80: 65 63 74 6f 72 79 20 68 6f 6c 64 20 64 61 74 61  ectory hold data
2f90: 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c  base and journal
2fa0: 20 66 69 6c 65 73 20 2a 2f 0a 20 20 4f 73 46 69   files */.  OsFi
2fb0: 6c 65 20 2a 66 64 2c 20 2a 6a 66 64 3b 20 20 20  le *fd, *jfd;   
2fc0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
2fd0: 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20  descriptors for 
2fe0: 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75  database and jou
2ff0: 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73 46 69 6c 65  rnal */.  OsFile
3000: 20 2a 73 74 66 64 3b 20 20 20 20 20 20 20 20 20   *stfd;         
3010: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
3020: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65  scriptor for the
3030: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
3040: 75 72 6e 61 6c 2a 2f 0a 20 20 42 75 73 79 48 61  urnal*/.  BusyHa
3050: 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64  ndler *pBusyHand
3060: 6c 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72  ler;  /* Pointer
3070: 20 74 6f 20 73 71 6c 69 74 65 2e 62 75 73 79 48   to sqlite.busyH
3080: 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 67 48 64  andler */.  PgHd
3090: 72 20 2a 70 46 69 72 73 74 2c 20 2a 70 4c 61 73  r *pFirst, *pLas
30a0: 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  t;      /* List 
30b0: 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f  of free pages */
30c0: 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74  .  PgHdr *pFirst
30d0: 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 2f  Synced;        /
30e0: 2a 20 46 69 72 73 74 20 66 72 65 65 20 70 61 67  * First free pag
30f0: 65 20 77 69 74 68 20 50 67 48 64 72 2e 6e 65 65  e with PgHdr.nee
3100: 64 53 79 6e 63 3d 3d 30 20 2a 2f 0a 20 20 50 67  dSync==0 */.  Pg
3110: 48 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20  Hdr *pAll;      
3120: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
3130: 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a  t of all pages *
3140: 2f 0a 20 20 50 67 48 64 72 20 2a 70 53 74 6d 74  /.  PgHdr *pStmt
3150: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3160: 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73  /* List of pages
3170: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
3180: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  t subjournal */.
3190: 20 20 50 67 48 64 72 20 2a 70 44 69 72 74 79 3b    PgHdr *pDirty;
31a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31b0: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 64 69 72   List of all dir
31c0: 74 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 36  ty pages */.  i6
31d0: 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20  4 journalOff;   
31e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
31f0: 72 65 6e 74 20 62 79 74 65 20 6f 66 66 73 65 74  rent byte offset
3200: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
3210: 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  file */.  i64 jo
3220: 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20  urnalHdr;       
3230: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
3240: 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73  fset to previous
3250: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
3260: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 48 64 72  */.  i64 stmtHdr
3270: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
3280: 20 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e 61   /* First journa
3290: 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  l header written
32a0: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
32b0: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 43 6b 73  */.  i64 stmtCks
32c0: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
32d0: 20 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77 68   /* cksumInit wh
32e0: 65 6e 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  en statement was
32f0: 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 36   started */.  i6
3300: 34 20 73 74 6d 74 4a 53 69 7a 65 3b 20 20 20 20  4 stmtJSize;    
3310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
3320: 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 74 20  e of journal at 
3330: 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a  stmt_begin() */.
3340: 20 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a 65    int sectorSize
3350: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3360: 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   Assumed sector 
3370: 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  size during roll
3380: 62 61 63 6b 20 2a 2f 0a 23 69 66 64 65 66 20 53  back */.#ifdef S
3390: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
33a0: 20 6e 48 69 74 2c 20 6e 4d 69 73 73 2c 20 6e 4f   nHit, nMiss, nO
33b0: 76 66 6c 3b 20 20 20 20 20 2f 2a 20 43 61 63 68  vfl;     /* Cach
33c0: 65 20 68 69 74 73 2c 20 6d 69 73 73 69 6e 67 2c  e hits, missing,
33d0: 20 61 6e 64 20 4c 52 55 20 6f 76 65 72 66 6c 6f   and LRU overflo
33e0: 77 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61  ws */.  int nRea
33f0: 64 2c 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20  d,nWrite;       
3400: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
3410: 70 61 67 65 73 20 72 65 61 64 2f 77 72 69 74 74  pages read/writt
3420: 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76  en */.#endif.  v
3430: 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63 74 6f  oid (*xDestructo
3440: 72 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 3b  r)(DbPage*,int);
3450: 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f   /* Call this ro
3460: 75 74 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69  utine when freei
3470: 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f  ng pages */.  vo
3480: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
3490: 44 62 50 61 67 65 2a 2c 69 6e 74 29 3b 20 20 20  DbPage*,int);   
34a0: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
34b0: 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64  tine when reload
34c0: 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 76  ing pages */.  v
34d0: 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76  oid *(*xCodec)(v
34e0: 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c  oid*,void*,Pgno,
34f0: 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65  int); /* Routine
3500: 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67   for en/decoding
3510: 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20   data */.  void 
3520: 2a 70 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20  *pCodecArg;     
3530: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
3540: 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64  argument to xCod
3550: 65 63 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 48  ec() */.  int nH
3560: 61 73 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ash;            
3570: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
3580: 20 74 68 65 20 70 61 67 65 72 20 68 61 73 68 20   the pager hash 
3590: 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67 48 64 72  table */.  PgHdr
35a0: 20 2a 2a 61 48 61 73 68 3b 20 20 20 20 20 20 20   **aHash;       
35b0: 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74         /* Hash t
35c0: 61 62 6c 65 20 74 6f 20 6d 61 70 20 70 61 67 65  able to map page
35d0: 20 6e 75 6d 62 65 72 20 74 6f 20 50 67 48 64 72   number to PgHdr
35e0: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
35f0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
3600: 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 50 61 67  MANAGEMENT.  Pag
3610: 65 72 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  er *pNext;      
3620: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b           /* Link
3630: 65 64 20 6c 69 73 74 20 6f 66 20 70 61 67 65 72  ed list of pager
3640: 73 20 69 6e 20 74 68 69 73 20 74 68 72 65 61 64  s in this thread
3650: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61   */.#endif.  cha
3660: 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20  r *pTmpSpace;   
3670: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
3680: 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  r.pageSize bytes
3690: 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d   of space for tm
36a0: 70 20 75 73 65 20 2a 2f 0a 20 20 75 33 32 20 69  p use */.  u32 i
36b0: 43 68 61 6e 67 65 43 6f 75 6e 74 3b 20 20 20 20  ChangeCount;    
36c0: 20 20 20 20 20 20 20 2f 2a 20 44 62 20 63 68 61         /* Db cha
36d0: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 6f 72 20  nge-counter for 
36e0: 77 68 69 63 68 20 63 61 63 68 65 20 69 73 20 76  which cache is v
36f0: 61 6c 69 64 20 2a 2f 0a 20 20 75 38 20 64 6f 4e  alid */.  u8 doN
3700: 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  otSync;         
3710: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
3720: 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20 64 6f  . While true, do
3730: 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63   not spill the c
3740: 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 65 78 63  ache */.  u8 exc
3750: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
3760: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
3770: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
3780: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
3790: 45 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  E */.  u8 change
37a0: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
37b0: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
37c0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
37d0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
37e0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  */.};../*.** If 
37f0: 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20 64  SQLITE_TEST is d
3800: 65 66 69 6e 65 64 20 74 68 65 6e 20 69 6e 63 72  efined then incr
3810: 65 6d 65 6e 74 20 74 68 65 20 76 61 72 69 61 62  ement the variab
3820: 6c 65 20 67 69 76 65 6e 20 69 6e 0a 2a 2a 20 74  le given in.** t
3830: 68 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 23  he argument.*/.#
3840: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
3850: 54 0a 23 20 64 65 66 69 6e 65 20 54 45 53 54 5f  T.# define TEST_
3860: 49 4e 43 52 28 78 29 20 20 78 2b 2b 0a 23 65 6c  INCR(x)  x++.#el
3870: 73 65 0a 23 20 64 65 66 69 6e 65 20 54 45 53 54  se.# define TEST
3880: 5f 49 4e 43 52 28 78 29 0a 23 65 6e 64 69 66 0a  _INCR(x).#endif.
3890: 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66  ./*.** Journal f
38a0: 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20  iles begin with 
38b0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
38c0: 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65  gic string.  The
38d0: 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74   data.** was obt
38e0: 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f  ained from /dev/
38f0: 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75  random.  It is u
3900: 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61  sed only as a sa
3910: 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a  nity check..**.*
3920: 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20  * Since version 
3930: 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e  2.8.0, the journ
3940: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69  al format contai
3950: 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61  ns additional sa
3960: 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67  nity.** checking
3970: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49   information.  I
3980: 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c  f the power fail
3990: 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
39a0: 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20  nal is begin.** 
39b0: 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61  written, semi-ra
39c0: 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74  ndom garbage dat
39d0: 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69  a might appear i
39e0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
39f0: 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65   file after powe
3a00: 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20  r is restored.  
3a10: 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  If an attempt is
3a20: 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f   then made.** to
3a30: 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61   roll the journa
3a40: 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  l back, the data
3a50: 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f  base could be co
3a60: 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64  rrupted.  The ad
3a70: 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69  ditional.** sani
3a80: 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61  ty checking data
3a90: 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74   is an attempt t
3aa0: 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67  o discover the g
3ab0: 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  arbage in the.**
3ac0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e   journal and ign
3ad0: 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ore it..**.** Th
3ae0: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
3af0: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
3b00: 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61  r the new journa
3b10: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74  l format consist
3b20: 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74  s.** of a 32-bit
3b30: 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63   checksum on eac
3b40: 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20  h page of data. 
3b50: 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f   The checksum co
3b60: 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65  vers both.** the
3b70: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
3b80: 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67   the pPager->pag
3b90: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
3ba0: 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65  ata for the page
3bb0: 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20  ..** This cksum 
3bc0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
3bd0: 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f  o a 32-bit rando
3be0: 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70  m value that app
3bf0: 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a  ears in the.** j
3c00: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68  ournal file righ
3c10: 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64  t after the head
3c20: 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20  er.  The random 
3c30: 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69  initializer is i
3c40: 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63  mportant,.** bec
3c50: 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74  ause garbage dat
3c60: 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  a that appears a
3c70: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a  t the end of a j
3c80: 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79  ournal is likely
3c90: 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61  .** data that wa
3ca0: 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20  s once in other 
3cb0: 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20  files that have 
3cc0: 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64  now been deleted
3cd0: 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72  .  If the.** gar
3ce0: 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66  bage data came f
3cf0: 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20  rom an obsolete 
3d00: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
3d10: 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68  e checksums migh
3d20: 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e  t.** be correct.
3d30: 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c    But by initial
3d40: 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73  izing the checks
3d50: 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c  um to random val
3d60: 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64  ue which.** is d
3d70: 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65  ifferent for eve
3d80: 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d  ry journal, we m
3d90: 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73  inimize that ris
3da0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  k..*/.static con
3db0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
3dc0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
3dd0: 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64   = {.  0xd9, 0xd
3de0: 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30  5, 0x05, 0xf9, 0
3df0: 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c  x20, 0xa1, 0x63,
3e00: 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a   0xd7,.};../*.**
3e10: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
3e20: 20 68 65 61 64 65 72 20 61 6e 64 20 6f 66 20 65   header and of e
3e30: 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20  ach page in the 
3e40: 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 74 65 72  journal is deter
3e50: 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  mined.** by the 
3e60: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73  following macros
3e70: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55  ..*/.#define JOU
3e80: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
3e90: 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61  r)  ((pPager->pa
3ea0: 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a  geSize) + 8)../*
3eb0: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
3ec0: 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20  header size for 
3ed0: 74 68 69 73 20 70 61 67 65 72 2e 20 49 6e 20 74  this pager. In t
3ee0: 68 65 20 66 75 74 75 72 65 2c 20 74 68 69 73 20  he future, this 
3ef0: 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20  could be.** set 
3f00: 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65 20 72 65  to some value re
3f10: 61 64 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b  ad from the disk
3f20: 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65   controller. The
3f30: 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68   important.** ch
3f40: 61 72 61 63 74 65 72 69 73 74 69 63 20 69 73 20  aracteristic is 
3f50: 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20 73  that it is the s
3f60: 61 6d 65 20 73 69 7a 65 20 61 73 20 61 20 64 69  ame size as a di
3f70: 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64  sk sector..*/.#d
3f80: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44  efine JOURNAL_HD
3f90: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70 50  R_SZ(pPager) (pP
3fa0: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
3fb0: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63  )../*.** The mac
3fc0: 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65  ro MEMDB is true
3fd0: 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69   if we are deali
3fe0: 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65  ng with an in-me
3ff0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
4000: 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73 20  * We do this as 
4010: 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20  a macro so that 
4020: 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d  if the SQLITE_OM
4030: 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72  IT_MEMORYDB macr
4040: 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65  o is set,.** the
4050: 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20   value of MEMDB 
4060: 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61  will be a consta
4070: 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69  nt and the compi
4080: 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a  ler will optimiz
4090: 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68  e.** out code th
40a0: 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65  at would never e
40b0: 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65  xecute..*/.#ifde
40c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
40d0: 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20  MORYDB.# define 
40e0: 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20  MEMDB 0.#else.# 
40f0: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61  define MEMDB pPa
4100: 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69  ger->memDb.#endi
4110: 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75  f../*.** Page nu
4120: 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47  mber PAGER_MJ_PG
4130: 4e 4f 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  NO is never used
4140: 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61   in an SQLite da
4150: 74 61 62 61 73 65 20 28 69 74 20 69 73 0a 2a 2a  tabase (it is.**
4160: 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 6f   reserved for wo
4170: 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61 20 77  rking around a w
4180: 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63  indows/posix inc
4190: 6f 6d 70 61 74 69 62 69 6c 69 74 79 29 2e 20 49  ompatibility). I
41a0: 74 20 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20  t is.** used in 
41b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73  the journal to s
41c0: 69 67 6e 69 66 79 20 74 68 61 74 20 74 68 65 20  ignify that the 
41d0: 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65  remainder of the
41e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a   journal file .*
41f0: 2a 20 69 73 20 64 65 76 6f 74 65 64 20 74 6f 20  * is devoted to 
4200: 73 74 6f 72 69 6e 67 20 61 20 6d 61 73 74 65 72  storing a master
4210: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20   journal name - 
4220: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
4230: 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f  e pages to.** ro
4240: 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d  ll back. See com
4250: 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e 63 74 69  ments for functi
4260: 6f 6e 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  on writeMasterJo
4270: 75 72 6e 61 6c 28 29 20 66 6f 72 20 64 65 74 61  urnal() for deta
4280: 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69  ils..*/./* #defi
4290: 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  ne PAGER_MJ_PGNO
42a0: 28 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59 54  (x) (PENDING_BYT
42b0: 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65  E/((x)->pageSize
42c0: 29 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )) */.#define PA
42d0: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28  GER_MJ_PGNO(x) (
42e0: 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28  (PENDING_BYTE/((
42f0: 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b 31  x)->pageSize))+1
4300: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  )../*.** The max
4310: 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20  imum legal page 
4320: 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20  number is (2^31 
4330: 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  - 1)..*/.#define
4340: 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20   PAGER_MAX_PGNO 
4350: 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a  2147483647../*.*
4360: 2a 20 45 6e 61 62 6c 65 20 72 65 66 65 72 65 6e  * Enable referen
4370: 63 65 20 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e  ce count trackin
4380: 67 20 28 66 6f 72 20 64 65 62 75 67 67 69 6e 67  g (for debugging
4390: 29 20 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65  ) here:.*/.#ifde
43a0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
43b0: 69 6e 74 20 70 61 67 65 72 33 5f 72 65 66 69 6e  int pager3_refin
43c0: 66 6f 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20  fo_enable = 0;. 
43d0: 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67   static void pag
43e0: 65 72 5f 72 65 66 69 6e 66 6f 28 50 67 48 64 72  er_refinfo(PgHdr
43f0: 20 2a 70 29 7b 0a 20 20 20 20 73 74 61 74 69 63   *p){.    static
4400: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
4410: 20 20 69 66 28 20 21 70 61 67 65 72 33 5f 72 65    if( !pager3_re
4420: 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72  finfo_enable ) r
4430: 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74  eturn;.    sqlit
4440: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20  e3DebugPrintf(. 
4450: 20 20 20 20 20 20 22 52 45 46 43 4e 54 3a 20 25        "REFCNT: %
4460: 34 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d  4d addr=%p nRef=
4470: 25 2d 33 64 20 74 6f 74 61 6c 3d 25 64 5c 6e 22  %-3d total=%d\n"
4480: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f  ,.       p->pgno
4490: 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
44a0: 70 29 2c 20 70 2d 3e 6e 52 65 66 2c 20 70 2d 3e  p), p->nRef, p->
44b0: 70 50 61 67 65 72 2d 3e 6e 52 65 66 0a 20 20 20  pPager->nRef.   
44c0: 20 29 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 20 20   );.    cnt++;  
44d0: 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67 20 74 6f   /* Something to
44e0: 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e   set a breakpoin
44f0: 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64 65  t on */.  }.# de
4500: 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 20  fine REFINFO(X) 
4510: 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 58   pager_refinfo(X
4520: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
4530: 20 52 45 46 49 4e 46 4f 28 58 29 0a 23 65 6e 64   REFINFO(X).#end
4540: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  if.../*.** Chang
4550: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
4560: 65 20 70 61 67 65 72 20 68 61 73 68 20 74 61 62  e pager hash tab
4570: 6c 65 20 74 6f 20 4e 2e 20 20 4e 20 6d 75 73 74  le to N.  N must
4580: 20 62 65 20 61 20 70 6f 77 65 72 0a 2a 2a 20 6f   be a power.** o
4590: 66 20 74 77 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  f two..*/.static
45a0: 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 69   void pager_resi
45b0: 7a 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 50 61  ze_hash_table(Pa
45c0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
45d0: 20 4e 29 7b 0a 20 20 50 67 48 64 72 20 2a 2a 61   N){.  PgHdr **a
45e0: 48 61 73 68 2c 20 2a 70 50 67 3b 0a 20 20 61 73  Hash, *pPg;.  as
45f0: 73 65 72 74 28 20 4e 3e 30 20 26 26 20 28 4e 26  sert( N>0 && (N&
4600: 28 4e 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 61  (N-1))==0 );.  a
4610: 48 61 73 68 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Hash = sqliteMal
4620: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61 48 61 73  loc( sizeof(aHas
4630: 68 5b 30 5d 29 2a 4e 20 29 3b 0a 20 20 69 66 28  h[0])*N );.  if(
4640: 20 61 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20   aHash==0 ){.   
4650: 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 72   /* Failure to r
4660: 65 68 61 73 68 20 69 73 20 6e 6f 74 20 61 6e 20  ehash is not an 
4670: 65 72 72 6f 72 2e 20 20 49 74 20 69 73 20 6f 6e  error.  It is on
4680: 6c 79 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  ly a performance
4690: 20 68 69 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74   hit. */.    ret
46a0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
46b0: 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48  eFree(pPager->aH
46c0: 61 73 68 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ash);.  pPager->
46d0: 6e 48 61 73 68 20 3d 20 4e 3b 0a 20 20 70 50 61  nHash = N;.  pPa
46e0: 67 65 72 2d 3e 61 48 61 73 68 20 3d 20 61 48 61  ger->aHash = aHa
46f0: 73 68 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50  sh;.  for(pPg=pP
4700: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
4710: 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
4720: 6c 6c 29 7b 0a 20 20 20 20 69 6e 74 20 68 3b 0a  ll){.    int h;.
4730: 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
4740: 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  o==0 ){.      as
4750: 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74  sert( pPg->pNext
4760: 48 61 73 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e  Hash==0 && pPg->
4770: 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a  pPrevHash==0 );.
4780: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
4790: 20 20 20 20 7d 0a 20 20 20 20 68 20 3d 20 70 50      }.    h = pP
47a0: 67 2d 3e 70 67 6e 6f 20 26 20 28 4e 2d 31 29 3b  g->pgno & (N-1);
47b0: 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  .    pPg->pNextH
47c0: 61 73 68 20 3d 20 61 48 61 73 68 5b 68 5d 3b 0a  ash = aHash[h];.
47d0: 20 20 20 20 69 66 28 20 61 48 61 73 68 5b 68 5d      if( aHash[h]
47e0: 20 29 7b 0a 20 20 20 20 20 20 61 48 61 73 68 5b   ){.      aHash[
47f0: 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  h]->pPrevHash = 
4800: 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  pPg;.    }.    a
4810: 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20  Hash[h] = pPg;. 
4820: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73     pPg->pPrevHas
4830: 68 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  h = 0;.  }.}../*
4840: 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69  .** Read a 32-bi
4850: 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74  t integer from t
4860: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
4870: 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65  scriptor.  Store
4880: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
4890: 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20  that is read in 
48a0: 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53  *pRes.  Return S
48b0: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
48c0: 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f  ything worked, o
48d0: 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  r an.** error co
48e0: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
48f0: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a  goes wrong..**.*
4900: 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65  * All values are
4910: 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20   stored on disk 
4920: 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a  as big-endian..*
4930: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
4940: 64 33 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a  d32bits(OsFile *
4950: 66 64 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a  fd, u32 *pRes){.
4960: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
4970: 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20  ac[4];.  int rc 
4980: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
4990: 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61  fd, ac, sizeof(a
49a0: 63 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  c));.  if( rc==S
49b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
49c0: 2a 70 52 65 73 20 3d 20 28 61 63 5b 30 5d 3c 3c  *pRes = (ac[0]<<
49d0: 32 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36  24) | (ac[1]<<16
49e0: 29 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c  ) | (ac[2]<<8) |
49f0: 20 61 63 5b 33 5d 3b 0a 20 20 7d 0a 20 20 72 65   ac[3];.  }.  re
4a00: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
4a10: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
4a20: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20   integer into a 
4a30: 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e  string buffer in
4a40: 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65   big-endian byte
4a50: 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
4a60: 63 20 76 6f 69 64 20 70 75 74 33 32 62 69 74 73  c void put32bits
4a70: 28 63 68 61 72 20 2a 61 63 2c 20 75 33 32 20 76  (char *ac, u32 v
4a80: 61 6c 29 7b 0a 20 20 61 63 5b 30 5d 20 3d 20 28  al){.  ac[0] = (
4a90: 76 61 6c 3e 3e 32 34 29 20 26 20 30 78 66 66 3b  val>>24) & 0xff;
4aa0: 0a 20 20 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e  .  ac[1] = (val>
4ab0: 3e 31 36 29 20 26 20 30 78 66 66 3b 0a 20 20 61  >16) & 0xff;.  a
4ac0: 63 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20  c[2] = (val>>8) 
4ad0: 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20  & 0xff;.  ac[3] 
4ae0: 3d 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 7d 0a  = val & 0xff;.}.
4af0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
4b00: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
4b10: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  to the given fil
4b20: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52  e descriptor.  R
4b30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
4b40: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  ** on success or
4b50: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
4b60: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
4b70: 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
4b80: 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74  c int write32bit
4b90: 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33  s(OsFile *fd, u3
4ba0: 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61  2 val){.  char a
4bb0: 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74  c[4];.  put32bit
4bc0: 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65  s(ac, val);.  re
4bd0: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72  turn sqlite3OsWr
4be0: 69 74 65 28 66 64 2c 20 61 63 2c 20 34 29 3b 0a  ite(fd, ac, 4);.
4bf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
4c00: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 61  32-bit integer a
4c10: 74 20 6f 66 66 73 65 74 20 27 6f 66 66 73 65 74  t offset 'offset
4c20: 27 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  ' from the page 
4c30: 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a  identified by.**
4c40: 20 70 61 67 65 20 68 65 61 64 65 72 20 27 70 27   page header 'p'
4c50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
4c60: 72 65 74 72 69 65 76 65 33 32 62 69 74 73 28 50  retrieve32bits(P
4c70: 67 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66  gHdr *p, int off
4c80: 73 65 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  set){.  unsigned
4c90: 20 63 68 61 72 20 2a 61 63 3b 0a 20 20 61 63 20   char *ac;.  ac 
4ca0: 3d 20 26 28 28 75 6e 73 69 67 6e 65 64 20 63 68  = &((unsigned ch
4cb0: 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54  ar*)PGHDR_TO_DAT
4cc0: 41 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20  A(p))[offset];. 
4cd0: 20 72 65 74 75 72 6e 20 28 61 63 5b 30 5d 3c 3c   return (ac[0]<<
4ce0: 32 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36  24) | (ac[1]<<16
4cf0: 29 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c  ) | (ac[2]<<8) |
4d00: 20 61 63 5b 33 5d 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   ac[3];.}.../*.*
4d10: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
4d20: 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
4d30: 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72 20 6f   when an error o
4d40: 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
4d50: 20 70 61 67 65 72 0a 2a 2a 20 63 6f 64 65 2e 20   pager.** code. 
4d60: 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
4d70: 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
4d80: 74 6f 20 74 68 65 20 70 61 67 65 72 20 73 74 72  to the pager str
4d90: 75 63 74 75 72 65 2c 20 74 68 65 0a 2a 2a 20 73  ucture, the.** s
4da0: 65 63 6f 6e 64 20 74 68 65 20 65 72 72 6f 72 2d  econd the error-
4db0: 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65  code about to be
4dc0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 70   returned by a p
4dd0: 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f  ager API functio
4de0: 6e 2e 20 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  n. .** The value
4df0: 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 20 63   returned is a c
4e00: 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e  opy of the secon
4e10: 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
4e20: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a  is function. .**
4e30: 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e  .** If the secon
4e40: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51  d argument is SQ
4e50: 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49  LITE_IOERR, SQLI
4e60: 54 45 5f 43 4f 52 52 55 50 54 20 6f 72 20 53 51  TE_CORRUPT or SQ
4e70: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 2c 0a 2a  LITE_PROTOCOL,.*
4e80: 2a 20 74 68 65 20 65 72 72 6f 72 20 62 65 63 6f  * the error beco
4e90: 6d 65 73 20 70 65 72 73 69 73 74 65 6e 74 2e 20  mes persistent. 
4ea0: 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 41  All subsequent A
4eb0: 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73  PI calls on this
4ec0: 20 50 61 67 65 72 0a 2a 2a 20 77 69 6c 6c 20 69   Pager.** will i
4ed0: 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72  mmediately retur
4ee0: 6e 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f 72  n the same error
4ef0: 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
4f00: 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72   int pager_error
4f10: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
4f20: 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72  int rc){.  int r
4f30: 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a  c2 = rc & 0xff;.
4f40: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
4f50: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
4f60: 45 5f 46 55 4c 4c 20 7c 7c 20 70 50 61 67 65 72  E_FULL || pPager
4f70: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
4f80: 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 0a 20 20  E_OK );.  if(.  
4f90: 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55    rc2==SQLITE_FU
4fa0: 4c 4c 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53  LL ||.    rc2==S
4fb0: 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20  QLITE_IOERR ||. 
4fc0: 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 43     rc2==SQLITE_C
4fd0: 4f 52 52 55 50 54 20 7c 7c 0a 20 20 20 20 72 63  ORRUPT ||.    rc
4fe0: 32 3d 3d 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  2==SQLITE_PROTOC
4ff0: 4f 4c 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67  OL.  ){.    pPag
5000: 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  er->errCode = rc
5010: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5020: 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
5030: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
5040: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33  /*.** Return a 3
5050: 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74 68  2-bit hash of th
5060: 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72 20  e page data for 
5070: 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  pPage..*/.static
5080: 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68   u32 pager_pageh
5090: 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65  ash(PgHdr *pPage
50a0: 29 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20  ){.  u32 hash = 
50b0: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e  0;.  int i;.  un
50c0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61  signed char *pDa
50d0: 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ta = (unsigned c
50e0: 68 61 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f 44  har *)PGHDR_TO_D
50f0: 41 54 41 28 70 50 61 67 65 29 3b 0a 20 20 66 6f  ATA(pPage);.  fo
5100: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
5110: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
5120: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68  ; i++){.    hash
5130: 20 3d 20 28 68 61 73 68 2b 69 29 5e 70 44 61 74   = (hash+i)^pDat
5140: 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  a[i];.  }.  retu
5150: 72 6e 20 68 61 73 68 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn hash;.}../*.*
5160: 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45  * The CHECK_PAGE
5170: 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50   macro takes a P
5180: 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75  gHdr* as an argu
5190: 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f  ment. If SQLITE_
51a0: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69  CHECK_PAGES.** i
51b0: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e  s defined, and N
51c0: 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66  DEBUG is not def
51d0: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
51e0: 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63  ) statement chec
51f0: 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70  ks.** that the p
5200: 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69  age is either di
5210: 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74  rty or still mat
5220: 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61  ches the calcula
5230: 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a  ted page-hash..*
5240: 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  /.#define CHECK_
5250: 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67  PAGE(x) checkPag
5260: 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64  e(x).static void
5270: 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72   checkPage(PgHdr
5280: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
5290: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
52a0: 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28  Pager;.  assert(
52b0: 20 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20   !pPg->pageHash 
52c0: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
52d0: 64 65 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 70  de || MEMDB || p
52e0: 50 67 2d 3e 64 69 72 74 79 20 7c 7c 20 0a 20 20  Pg->dirty || .  
52f0: 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
5300: 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73  h==pager_pagehas
5310: 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c  h(pPg) );.}..#el
5320: 73 65 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b  se.#define CHECK
5330: 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 0a  _PAGE(x).#endif.
5340: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  ./*.** When this
5350: 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a   is called the j
5360: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
5370: 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73  pager pPager mus
5380: 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68  t be open..** Th
5390: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
53a0: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 72 65   file name is re
53b0: 61 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20  ad from the end 
53c0: 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  of the file and 
53d0: 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  .** written into
53e0: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
53f0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
5400: 6f 63 28 29 2e 20 2a 70 7a 4d 61 73 74 65 72 20  oc(). *pzMaster 
5410: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69  is.** set to poi
5420: 6e 74 20 61 74 20 74 68 65 20 6d 65 6d 6f 72 79  nt at the memory
5430: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
5440: 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c  eturned. The cal
5450: 6c 65 72 20 6d 75 73 74 0a 2a 2a 20 73 71 6c 69  ler must.** sqli
5460: 74 65 46 72 65 65 28 29 20 2a 70 7a 4d 61 73 74  teFree() *pzMast
5470: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  er..**.** If no 
5480: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
5490: 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73  ile name is pres
54a0: 65 6e 74 20 2a 70 7a 4d 61 73 74 65 72 20 69 73  ent *pzMaster is
54b0: 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a   set to 0 and.**
54c0: 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
54d0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
54e0: 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75  nt readMasterJou
54f0: 72 6e 61 6c 28 4f 73 46 69 6c 65 20 2a 70 4a 72  rnal(OsFile *pJr
5500: 6e 6c 2c 20 63 68 61 72 20 2a 2a 70 7a 4d 61 73  nl, char **pzMas
5510: 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ter){.  int rc;.
5520: 20 20 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34    u32 len;.  i64
5530: 20 73 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75   szJ;.  u32 cksu
5540: 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e  m;.  int i;.  un
5550: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
5560: 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66  ic[8]; /* A buff
5570: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
5580: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a  agic header */..
5590: 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b    *pzMaster = 0;
55a0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
55b0: 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c  OsFileSize(pJrnl
55c0: 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72  , &szJ);.  if( r
55d0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
55e0: 73 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20  szJ<16 ) return 
55f0: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rc;..  rc = sqli
5600: 74 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c  te3OsSeek(pJrnl,
5610: 20 73 7a 4a 2d 31 36 29 3b 0a 20 20 69 66 28 20   szJ-16);.  if( 
5620: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
5630: 72 65 74 75 72 6e 20 72 63 3b 0a 20 0a 20 20 72  return rc;. .  r
5640: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
5650: 4a 72 6e 6c 2c 20 26 6c 65 6e 29 3b 0a 20 20 69  Jrnl, &len);.  i
5660: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
5670: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
5680: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
5690: 28 70 4a 72 6e 6c 2c 20 26 63 6b 73 75 6d 29 3b  (pJrnl, &cksum);
56a0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
56b0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
56c0: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
56d0: 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61  3OsRead(pJrnl, a
56e0: 4d 61 67 69 63 2c 20 38 29 3b 0a 20 20 69 66 28  Magic, 8);.  if(
56f0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
5700: 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  | memcmp(aMagic,
5710: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
5720: 38 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  8) ) return rc;.
5730: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
5740: 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a  sSeek(pJrnl, szJ
5750: 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20  -16-len);.  if( 
5760: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
5770: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2a 70  return rc;..  *p
5780: 7a 4d 61 73 74 65 72 20 3d 20 28 63 68 61 72 20  zMaster = (char 
5790: 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6c  *)sqliteMalloc(l
57a0: 65 6e 2b 31 29 3b 0a 20 20 69 66 28 20 21 2a 70  en+1);.  if( !*p
57b0: 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72  zMaster ){.    r
57c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
57d0: 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  EM;.  }.  rc = s
57e0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
57f0: 6e 6c 2c 20 2a 70 7a 4d 61 73 74 65 72 2c 20 6c  nl, *pzMaster, l
5800: 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  en);.  if( rc!=S
5810: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5820: 73 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d 61  sqliteFree(*pzMa
5830: 73 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61  ster);.    *pzMa
5840: 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 65  ster = 0;.    re
5850: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
5860: 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68  /* See if the ch
5870: 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74  ecksum matches t
5880: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
5890: 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28  l name */.  for(
58a0: 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29  i=0; i<len; i++)
58b0: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 28  {.    cksum -= (
58c0: 2a 70 7a 4d 61 73 74 65 72 29 5b 69 5d 3b 0a 20  *pzMaster)[i];. 
58d0: 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29   }.  if( cksum )
58e0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
58f0: 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74  checksum doesn't
5900: 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e   add up, then on
5910: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
5920: 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20   disk sectors.  
5930: 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20    ** containing 
5940: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
5950: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63  al filename is c
5960: 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d  orrupted. This m
5970: 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69  eans.    ** defi
5980: 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b  nitely roll back
5990: 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e  , so just return
59a0: 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72   SQLITE_OK and r
59b0: 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20  eport a (nul).  
59c0: 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72    ** master-jour
59d0: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20  nal filename..  
59e0: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 46    */.    sqliteF
59f0: 72 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a  ree(*pzMaster);.
5a00: 20 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20      *pzMaster = 
5a10: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
5a20: 28 2a 70 7a 4d 61 73 74 65 72 29 5b 6c 65 6e 5d  (*pzMaster)[len]
5a30: 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20   = '\0';.  }.   
5a40: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5a50: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
5a60: 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ek the journal f
5a70: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
5a80: 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
5a90: 72 20 62 6f 75 6e 64 61 72 79 20 77 68 65 72 65  r boundary where
5aa0: 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65   a.** journal he
5ab0: 61 64 65 72 20 6d 61 79 20 62 65 20 72 65 61 64  ader may be read
5ac0: 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 50 61 67   or written. Pag
5ad0: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73  er.journalOff is
5ae0: 20 75 70 64 61 74 65 64 20 77 69 74 68 0a 2a 2a   updated with.**
5af0: 20 74 68 65 20 6e 65 77 20 73 65 65 6b 20 6f 66   the new seek of
5b00: 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20  fset..**.** i.e 
5b10: 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a  for a sector siz
5b20: 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20  e of 512:.**.** 
5b30: 49 6e 70 75 74 20 4f 66 66 73 65 74 20 20 20 20  Input Offset    
5b40: 20 20 20 20 20 20 20 20 20 20 4f 75 74 70 75 74            Output
5b50: 20 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d   Offset.** -----
5b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b80: 2d 2d 0a 2a 2a 20 30 20 20 20 20 20 20 20 20 20  --.** 0         
5b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ba0: 30 0a 2a 2a 20 35 31 32 20 20 20 20 20 20 20 20  0.** 512        
5bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
5bc0: 31 32 0a 2a 2a 20 31 30 30 20 20 20 20 20 20 20  12.** 100       
5bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5be0: 35 31 32 0a 2a 2a 20 32 30 30 30 20 20 20 20 20  512.** 2000     
5bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c00: 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61   2048.** .*/.sta
5c10: 74 69 63 20 69 6e 74 20 73 65 65 6b 4a 6f 75 72  tic int seekJour
5c20: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
5c30: 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66  ager){.  i64 off
5c40: 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63  set = 0;.  i64 c
5c50: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
5c60: 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29  alOff;.  if( c )
5c70: 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28  {.    offset = (
5c80: 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44  (c-1)/JOURNAL_HD
5c90: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31  R_SZ(pPager) + 1
5ca0: 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ) * JOURNAL_HDR_
5cb0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
5cc0: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
5cd0: 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  %JOURNAL_HDR_SZ(
5ce0: 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20  pPager)==0 );.  
5cf0: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d  assert( offset>=
5d00: 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  c );.  assert( (
5d10: 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41  offset-c)<JOURNA
5d20: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
5d30: 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   );.  pPager->jo
5d40: 75 72 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65  urnalOff = offse
5d50: 74 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  t;.  return sqli
5d60: 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
5d70: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
5d80: 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f  ournalOff);.}../
5d90: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
5da0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
5db0: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  en when this rou
5dc0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
5dd0: 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61  A journal.** hea
5de0: 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  der (JOURNAL_HDR
5df0: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72  _SZ bytes) is wr
5e00: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
5e10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74  ournal file at t
5e20: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f  he.** current lo
5e30: 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  cation..**.** Th
5e40: 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65  e format for the
5e50: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5e60: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
5e70: 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67  * - 8 bytes: Mag
5e80: 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a  ic identifying j
5e90: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a  ournal format..*
5ea0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d  * - 4 bytes: Num
5eb0: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
5ec0: 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31  n journal, or -1
5ed0: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73   no-sync mode is
5ee0: 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65   on..** - 4 byte
5ef0: 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  s: Random number
5f00: 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68   used for page h
5f10: 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  ash..** - 4 byte
5f20: 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62  s: Initial datab
5f30: 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  ase page count..
5f40: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65  ** - 4 bytes: Se
5f50: 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62  ctor size used b
5f60: 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  y the process th
5f70: 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f  at wrote this jo
5f80: 75 72 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f  urnal..** .** Fo
5f90: 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e  llowed by (JOURN
5fa0: 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 34 29 20  AL_HDR_SZ - 24) 
5fb0: 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20  bytes of unused 
5fc0: 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  space..*/.static
5fd0: 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61   int writeJourna
5fe0: 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67  lHdr(Pager *pPag
5ff0: 65 72 29 7b 0a 20 20 63 68 61 72 20 7a 48 65 61  er){.  char zHea
6000: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
6010: 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 3b 0a 20  nalMagic)+16];. 
6020: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
6030: 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
6040: 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61  ff==0 ){.    pPa
6050: 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20  ger->stmtHdrOff 
6060: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
6070: 6c 4f 66 66 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  lOff;.  }..  rc 
6080: 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72  = seekJournalHdr
6090: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
60a0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
60b0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
60c0: 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
60d0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50  journalOff;.  pP
60e0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
60f0: 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   += JOURNAL_HDR_
6100: 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f  SZ(pPager);..  /
6110: 2a 20 46 49 58 20 4d 45 3a 20 0a 20 20 2a 2a 0a  * FIX ME: .  **.
6120: 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 66 6f    ** Possibly fo
6130: 72 20 61 20 70 61 67 65 72 20 6e 6f 74 20 69 6e  r a pager not in
6140: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74   no-sync mode, t
6150: 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 61 67 69 63  he journal magic
6160: 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a   should not.  **
6170: 20 62 65 20 77 72 69 74 74 65 6e 20 75 6e 74 69   be written unti
6180: 6c 20 6e 52 65 63 20 69 73 20 66 69 6c 6c 65 64  l nRec is filled
6190: 20 69 6e 20 61 73 20 70 61 72 74 20 6f 66 20 6e   in as part of n
61a0: 65 78 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  ext syncJournal(
61b0: 29 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63  ). .  **.  ** Ac
61c0: 74 75 61 6c 6c 79 20 6d 61 79 62 65 20 74 68 65  tually maybe the
61d0: 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 20 68   whole journal h
61e0: 65 61 64 65 72 20 73 68 6f 75 6c 64 20 62 65 20  eader should be 
61f0: 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68  delayed until th
6200: 61 74 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e 20 54  at.  ** point. T
6210: 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 2e  hink about this.
6220: 0a 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 7a  .  */.  memcpy(z
6230: 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c  Header, aJournal
6240: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
6250: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
6260: 20 2f 2a 20 54 68 65 20 6e 52 65 63 20 46 69 65   /* The nRec Fie
6270: 6c 64 2e 20 30 78 46 46 46 46 46 46 46 46 20 66  ld. 0xFFFFFFFF f
6280: 6f 72 20 6e 6f 2d 73 79 6e 63 20 6a 6f 75 72 6e  or no-sync journ
6290: 61 6c 73 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62  als. */.  put32b
62a0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
62b0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
62c0: 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 6f 53  c)], pPager->noS
62d0: 79 6e 63 20 3f 20 30 78 66 66 66 66 66 66 66 66  ync ? 0xffffffff
62e0: 20 3a 20 30 29 3b 0a 20 20 2f 2a 20 54 68 65 20   : 0);.  /* The 
62f0: 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73  random check-has
6300: 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f  h initialiser */
6310: 20 0a 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f   .  sqlite3Rando
6320: 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61  mness(sizeof(pPa
6330: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c  ger->cksumInit),
6340: 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   &pPager->cksumI
6350: 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74  nit);.  put32bit
6360: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
6370: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
6380: 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  +4], pPager->cks
6390: 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68  umInit);.  /* Th
63a0: 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61  e initial databa
63b0: 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74  se size */.  put
63c0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
63d0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
63e0: 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72  agic)+8], pPager
63f0: 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 2f 2a 20  ->dbSize);.  /* 
6400: 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74  The assumed sect
6410: 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73  or size for this
6420: 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75   process */.  pu
6430: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
6440: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
6450: 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67  Magic)+12], pPag
6460: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b  er->sectorSize);
6470: 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44  .  IOTRACE(("JHD
6480: 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  R %p %lld %d\n",
6490: 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
64a0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 73 69 7a  >journalHdr, siz
64b0: 65 6f 66 28 7a 48 65 61 64 65 72 29 29 29 0a 20  eof(zHeader))). 
64c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
64d0: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
64e0: 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f  , zHeader, sizeo
64f0: 66 28 7a 48 65 61 64 65 72 29 29 3b 0a 0a 20 20  f(zHeader));..  
6500: 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  /* The journal h
6510: 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20 77  eader has been w
6520: 72 69 74 74 65 6e 20 73 75 63 63 65 73 73 66 75  ritten successfu
6530: 6c 6c 79 2e 20 53 65 65 6b 20 74 68 65 20 6a 6f  lly. Seek the jo
6540: 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
6550: 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68  descriptor to th
6560: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75  e end of the jou
6570: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63 74  rnal header sect
6580: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  or..  */.  if( r
6590: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
65a0: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 54      IOTRACE(("JT
65b0: 41 49 4c 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20  AIL %p %lld\n", 
65c0: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
65d0: 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 29 0a 20  journalOff-1)). 
65e0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
65f0: 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66  sSeek(pPager->jf
6600: 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
6610: 61 6c 4f 66 66 2d 31 29 3b 0a 20 20 20 20 69 66  alOff-1);.    if
6620: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6630: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
6640: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
6650: 67 65 72 2d 3e 6a 66 64 2c 20 22 5c 30 30 30 22  ger->jfd, "\000"
6660: 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 1);.    }.  }.
6670: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
6680: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
6690: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
66a0: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73  pen when this is
66b0: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
66c0: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a  al header file.*
66d0: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
66e0: 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64  Z bytes) is read
66f0: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
6700: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  t location in th
6710: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
6720: 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  e. See comments 
6730: 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77  above function w
6740: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29  riteJournalHdr()
6750: 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69   for a descripti
6760: 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75  on of.** the jou
6770: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d  rnal header form
6780: 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  at..**.** If the
6790: 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20   header is read 
67a0: 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e  successfully, *n
67b0: 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68  Rec is set to th
67c0: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70  e number of.** p
67d0: 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c  age records foll
67e0: 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65  owing this heade
67f0: 72 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 69 73  r and *dbSize is
6800: 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65   set to the size
6810: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
6820: 61 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74  ase before the t
6830: 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e  ransaction began
6840: 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f  , in pages. Also
6850: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
6860: 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  nit.** is set to
6870: 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
6880: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
6890: 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f   header. SQLITE_
68a0: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  OK is returned.*
68b0: 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  * in this case..
68c0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
68d0: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65  rnal header file
68e0: 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63   appears to be c
68f0: 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45  orrupted, SQLITE
6900: 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75  _DONE is.** retu
6910: 72 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63 20 61  rned and *nRec a
6920: 6e 64 20 2a 64 62 53 69 7a 65 20 61 72 65 20 6e  nd *dbSize are n
6930: 6f 74 20 73 65 74 2e 20 20 49 66 20 4a 4f 55 52  ot set.  If JOUR
6940: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
6950: 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65  .** cannot be re
6960: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
6970: 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f  nal file an erro
6980: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
6990: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
69a0: 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  t readJournalHdr
69b0: 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
69c0: 72 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61  r, .  i64 journa
69d0: 6c 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e  lSize,.  u32 *pN
69e0: 52 65 63 2c 20 0a 20 20 75 33 32 20 2a 70 44 62  Rec, .  u32 *pDb
69f0: 53 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Size.){.  int rc
6a00: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
6a10: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20  r aMagic[8]; /* 
6a20: 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64  A buffer to hold
6a30: 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65   the magic heade
6a40: 72 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 73 65 65  r */..  rc = see
6a50: 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  kJournalHdr(pPag
6a60: 65 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  er);.  if( rc ) 
6a70: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66  return rc;..  if
6a80: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
6a90: 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lOff+JOURNAL_HDR
6aa0: 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f  _SZ(pPager) > jo
6ab0: 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20  urnalSize ){.   
6ac0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
6ad0: 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  ONE;.  }..  rc =
6ae0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
6af0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67  Pager->jfd, aMag
6b00: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
6b10: 63 29 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  c));.  if( rc ) 
6b20: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66  return rc;..  if
6b30: 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ( memcmp(aMagic,
6b40: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
6b50: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21  sizeof(aMagic))!
6b60: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
6b70: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
6b80: 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  }..  rc = read32
6b90: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
6ba0: 2c 20 70 4e 52 65 63 29 3b 0a 20 20 69 66 28 20  , pNRec);.  if( 
6bb0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
6bc0: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
6bd0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
6be0: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
6bf0: 69 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  it);.  if( rc ) 
6c00: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
6c10: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
6c20: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 62 53 69  ager->jfd, pDbSi
6c30: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ze);.  if( rc ) 
6c40: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
6c50: 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75   Update the assu
6c60: 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  med sector-size 
6c70: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
6c80: 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a  ue used by .  **
6c90: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
6ca0: 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a  t created this j
6cb0: 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20  ournal. If this 
6cc0: 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a  journal was.  **
6cd0: 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
6ce0: 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e  ocess other than
6cf0: 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20   this one, then 
6d00: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a  this routine.  *
6d10: 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  * is being calle
6d20: 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61  d from within pa
6d30: 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20  ger_playback(). 
6d40: 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a  The local value.
6d50: 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65    ** of Pager.se
6d60: 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74  ctorSize is rest
6d70: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ored at the end 
6d80: 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e  of that routine.
6d90: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61  .  */.  rc = rea
6da0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
6db0: 6a 66 64 2c 20 28 75 33 32 20 2a 29 26 70 50 61  jfd, (u32 *)&pPa
6dc0: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
6dd0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6de0: 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65  urn rc;..  pPage
6df0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
6e00: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
6e10: 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20  pPager);.  rc = 
6e20: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
6e30: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
6e40: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
6e50: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
6e60: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  ./*.** Write the
6e70: 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72   supplied master
6e80: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
6e90: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
6ea0: 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a  ile for pager.**
6eb0: 20 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63   pPager at the c
6ec0: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
6ed0: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
6ee0: 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65  nal name must be
6ef0: 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69   the last.** thi
6f00: 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20  ng written to a 
6f10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
6f20: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
6f30: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
6f40: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
6f50: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
6f60: 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74  is advanced to t
6f70: 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62  he next sector b
6f80: 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a  oundary before.*
6f90: 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72  * anything is wr
6fa0: 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61  itten. The forma
6fb0: 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20  t is:.**.** + 4 
6fc0: 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f  bytes: PAGER_MJ_
6fd0: 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74  PGNO..** + N byt
6fe0: 65 73 3a 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61  es: length of ma
6ff0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
7000: 65 2e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a  e..** + 4 bytes:
7010: 20 4e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a   N.** + 4 bytes:
7020: 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   Master journal 
7030: 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  name checksum..*
7040: 2a 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f  * + 8 bytes: aJo
7050: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
7060: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
7070: 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63  ournal page chec
7080: 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20  ksum is the sum 
7090: 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  of the bytes in 
70a0: 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  the master.** jo
70b0: 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a  urnal name..**.*
70c0: 2a 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20  * If zMaster is 
70d0: 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28  a NULL pointer (
70e0: 6f 63 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e  occurs for a sin
70f0: 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
7100: 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74  nsaction), .** t
7110: 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
7120: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
7130: 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  nt writeMasterJo
7140: 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
7150: 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
7160: 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
7170: 20 72 63 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20   rc;.  int len; 
7180: 0a 20 20 69 6e 74 20 69 3b 20 0a 20 20 75 33 32  .  int i; .  u32
7190: 20 63 6b 73 75 6d 20 3d 20 30 3b 0a 20 20 63 68   cksum = 0;.  ch
71a0: 61 72 20 7a 42 75 66 5b 73 69 7a 65 6f 66 28 61  ar zBuf[sizeof(a
71b0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 2a  JournalMagic)+2*
71c0: 34 5d 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73  4];..  if( !zMas
71d0: 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ter || pPager->s
71e0: 65 74 4d 61 73 74 65 72 29 20 72 65 74 75 72 6e  etMaster) return
71f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50   SQLITE_OK;.  pP
7200: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
7210: 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74  = 1;..  len = st
7220: 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3b 0a 20  rlen(zMaster);. 
7230: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b   for(i=0; i<len;
7240: 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d   i++){.    cksum
7250: 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a   += zMaster[i];.
7260: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20    }..  /* If in 
7270: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
7280: 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  advance to the n
7290: 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20  ext disk sector 
72a0: 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20  before writing. 
72b0: 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a   ** the master j
72c0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69  ournal name. Thi
72d0: 73 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65  s is in case the
72e0: 20 70 72 65 76 69 6f 75 73 20 70 61 67 65 20 77   previous page w
72f0: 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74  ritten to.  ** t
7300: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61  he journal has a
7310: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63  lready been sync
7320: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
7330: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
7340: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 65 6b  ){.    rc = seek
7350: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
7360: 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
7370: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
7380: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61  rn rc;.  }.  pPa
7390: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
73a0: 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20  += (len+20);..  
73b0: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
73c0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 50 41  (pPager->jfd, PA
73d0: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
73e0: 65 72 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  er));.  if( rc!=
73f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
7400: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73  rn rc;..  rc = s
7410: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
7420: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
7430: 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20  er, len);.  if( 
7440: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
7450: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 75  return rc;..  pu
7460: 74 33 32 62 69 74 73 28 7a 42 75 66 2c 20 6c 65  t32bits(zBuf, le
7470: 6e 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  n);.  put32bits(
7480: 26 7a 42 75 66 5b 34 5d 2c 20 63 6b 73 75 6d 29  &zBuf[4], cksum)
7490: 3b 0a 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66  ;.  memcpy(&zBuf
74a0: 5b 38 5d 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  [8], aJournalMag
74b0: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
74c0: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 72 63  nalMagic));.  rc
74d0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
74e0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
74f0: 42 75 66 2c 20 38 2b 73 69 7a 65 6f 66 28 61 4a  Buf, 8+sizeof(aJ
7500: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
7510: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
7520: 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  c = !pPager->noS
7530: 79 6e 63 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ync;.  return rc
7540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f  ;.}../*.** Add o
7550: 72 20 72 65 6d 6f 76 65 20 61 20 70 61 67 65 20  r remove a page 
7560: 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66  from the list of
7570: 20 61 6c 6c 20 70 61 67 65 73 20 74 68 61 74 20   all pages that 
7580: 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a 20 73 74  are in the.** st
7590: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
75a0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72  .**.** The Pager
75b0: 20 6b 65 65 70 73 20 61 20 73 65 70 61 72 61 74   keeps a separat
75c0: 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
75d0: 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74  that are current
75e0: 6c 79 20 69 6e 0a 2a 2a 20 74 68 65 20 73 74 61  ly in.** the sta
75f0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20  tement journal. 
7600: 20 54 68 69 73 20 68 65 6c 70 73 20 74 68 65 20   This helps the 
7610: 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
7620: 43 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74  Commit().** rout
7630: 69 6e 65 20 72 75 6e 20 4d 55 43 48 20 66 61 73  ine run MUCH fas
7640: 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  ter for the comm
7650: 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
7660: 65 72 65 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20  ere are many.** 
7670: 70 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20  pages in memory 
7680: 62 75 74 20 6f 6e 6c 79 20 61 20 66 65 77 20 61  but only a few a
7690: 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  re in the statem
76a0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  ent journal..*/.
76b0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
76c0: 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
76d0: 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  t(PgHdr *pPg){. 
76e0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
76f0: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
7700: 69 66 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20  if( pPg->inStmt 
7710: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
7720: 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74  rt( pPg->pPrevSt
7730: 6d 74 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 4e  mt==0 && pPg->pN
7740: 65 78 74 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  extStmt==0 );.  
7750: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  pPg->pPrevStmt =
7760: 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   0;.  if( pPager
7770: 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 70  ->pStmt ){.    p
7780: 50 61 67 65 72 2d 3e 70 53 74 6d 74 2d 3e 70 50  Pager->pStmt->pP
7790: 72 65 76 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20  revStmt = pPg;. 
77a0: 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 53   }.  pPg->pNextS
77b0: 74 6d 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 53  tmt = pPager->pS
77c0: 74 6d 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  tmt;.  pPager->p
77d0: 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 70 50  Stmt = pPg;.  pP
77e0: 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 7d  g->inStmt = 1;.}
77f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
7800: 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74  e_remove_from_st
7810: 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70  mt_list(PgHdr *p
7820: 50 67 29 7b 0a 20 20 69 66 28 20 21 70 50 67 2d  Pg){.  if( !pPg-
7830: 3e 69 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e  >inStmt ) return
7840: 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72  ;.  if( pPg->pPr
7850: 65 76 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73  evStmt ){.    as
7860: 73 65 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76  sert( pPg->pPrev
7870: 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d  Stmt->pNextStmt=
7880: 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d  =pPg );.    pPg-
7890: 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78  >pPrevStmt->pNex
78a0: 74 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65  tStmt = pPg->pNe
78b0: 78 74 53 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b  xtStmt;.  }else{
78c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
78d0: 2d 3e 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3d  ->pPager->pStmt=
78e0: 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d  =pPg );.    pPg-
78f0: 3e 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d  >pPager->pStmt =
7900: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b   pPg->pNextStmt;
7910: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e  .  }.  if( pPg->
7920: 70 4e 65 78 74 53 74 6d 74 20 29 7b 0a 20 20 20  pNextStmt ){.   
7930: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e   assert( pPg->pN
7940: 65 78 74 53 74 6d 74 2d 3e 70 50 72 65 76 53 74  extStmt->pPrevSt
7950: 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  mt==pPg );.    p
7960: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70  Pg->pNextStmt->p
7970: 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e  PrevStmt = pPg->
7980: 70 50 72 65 76 53 74 6d 74 3b 0a 20 20 7d 0a 20  pPrevStmt;.  }. 
7990: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20   pPg->pNextStmt 
79a0: 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65  = 0;.  pPg->pPre
79b0: 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67  vStmt = 0;.  pPg
79c0: 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a  ->inStmt = 0;.}.
79d0: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61  ./*.** Find a pa
79e0: 67 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74  ge in the hash t
79f0: 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70  able given its p
7a00: 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 52 65 74  age number.  Ret
7a10: 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
7a20: 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20   to the page or 
7a30: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
7a40: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48  d..*/.static PgH
7a50: 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  dr *pager_lookup
7a60: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
7a70: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
7a80: 48 64 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 50  Hdr *p;.  if( pP
7a90: 61 67 65 72 2d 3e 61 48 61 73 68 3d 3d 30 20 29  ager->aHash==0 )
7aa0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 20 3d   return 0;.  p =
7ab0: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70   pPager->aHash[p
7ac0: 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e  gno & (pPager->n
7ad0: 48 61 73 68 2d 31 29 5d 3b 0a 20 20 77 68 69 6c  Hash-1)];.  whil
7ae0: 65 28 20 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21  e( p && p->pgno!
7af0: 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d  =pgno ){.    p =
7b00: 20 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20   p->pNextHash;. 
7b10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
7b20: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74  ../*.** Unlock t
7b30: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
7b40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7b50: 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61   pager_unlock(Pa
7b60: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
7b70: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
7b80: 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
7b90: 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
7ba0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
7bb0: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
7bc0: 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
7bd0: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
7be0: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 49 4f 54   = -1;.      IOT
7bf0: 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70  RACE(("UNLOCK %p
7c00: 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
7c10: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
7c20: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
7c30: 4c 4f 43 4b 3b 0a 20 20 20 20 70 50 61 67 65 72  LOCK;.    pPager
7c40: 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
7c50: 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  e = 0;.  }.}../*
7c60: 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f  .** Execute a ro
7c70: 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e  llback if a tran
7c80: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
7c90: 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  e and unlock the
7ca0: 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69   .** database fi
7cb0: 6c 65 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f  le. This is a no
7cc0: 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65 72  -op if the pager
7cd0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74   has already ent
7ce0: 65 72 65 64 0a 2a 2a 20 74 68 65 20 65 72 72 6f  ered.** the erro
7cf0: 72 2d 73 74 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  r-state..*/.stat
7d00: 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
7d10: 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50  ockAndRollback(P
7d20: 61 67 65 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  ager *p){.  if( 
7d30: 70 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74  p->errCode ) ret
7d40: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
7d50: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
7d60: 45 53 45 52 56 45 44 20 7c 7c 20 70 2d 3e 6a 6f  ESERVED || p->jo
7d70: 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a  urnalOpen==0 );.
7d80: 20 20 69 66 28 20 70 2d 3e 73 74 61 74 65 3e 3d    if( p->state>=
7d90: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
7da0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
7db0: 65 72 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20  erRollback(p);. 
7dc0: 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63   }.  pager_unloc
7dd0: 6b 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  k(p);.  assert( 
7de0: 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70  p->errCode || !p
7df0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c  ->journalOpen ||
7e00: 20 28 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f   (p->exclusiveMo
7e10: 64 65 26 26 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f  de&&!p->journalO
7e20: 66 66 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ff) );.  assert(
7e30: 20 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21   p->errCode || !
7e40: 70 2d 3e 73 74 6d 74 4f 70 65 6e 20 7c 7c 20 70  p->stmtOpen || p
7e50: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
7e60: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  );.}.../*.** Unl
7e70: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
7e80: 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65 20 69   and clear the i
7e90: 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20  n-memory cache. 
7ea0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
7eb0: 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20   sets the state 
7ec0: 6f 66 20 74 68 65 20 70 61 67 65 72 20 62 61 63  of the pager bac
7ed0: 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77 61 73  k to what it was
7ee0: 20 77 68 65 6e 20 69 74 20 77 61 73 20 66 69 72   when it was fir
7ef0: 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41  st.** opened.  A
7f00: 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ny outstanding p
7f10: 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64  ages are invalid
7f20: 61 74 65 64 20 61 6e 64 20 73 75 62 73 65 71 75  ated and subsequ
7f30: 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20  ent attempts.** 
7f40: 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65 20  to access those 
7f50: 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  pages will likel
7f60: 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  y result in a co
7f70: 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69  redump..*/.stati
7f80: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
7f90: 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
7fa0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c  ){.  PgHdr *pPg,
7fb0: 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70   *pNext;.  if( p
7fc0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
7fd0: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70   return;.  for(p
7fe0: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
7ff0: 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29   pPg; pPg=pNext)
8000: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50  {.    pNext = pP
8010: 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
8020: 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29   sqliteFree(pPg)
8030: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
8040: 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 61  pStmt = 0;.  pPa
8050: 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b  ger->pFirst = 0;
8060: 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  .  pPager->pFirs
8070: 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70  tSynced = 0;.  p
8080: 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30  Pager->pLast = 0
8090: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c  ;.  pPager->pAll
80a0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
80b0: 6e 48 61 73 68 20 3d 20 30 3b 0a 20 20 73 71 6c  nHash = 0;.  sql
80c0: 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
80d0: 61 48 61 73 68 29 3b 0a 20 20 70 50 61 67 65 72  aHash);.  pPager
80e0: 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70  ->nPage = 0;.  p
80f0: 50 61 67 65 72 2d 3e 61 48 61 73 68 20 3d 20 30  Pager->aHash = 0
8100: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  ;.  pPager->nRef
8110: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57   = 0;.}../*.** W
8120: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
8130: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
8140: 70 61 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f  pager has the jo
8150: 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20  urnal file open 
8160: 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45  and.** a RESERVE
8170: 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
8180: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
8190: 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ase.  This routi
81a0: 6e 65 20 72 65 6c 65 61 73 65 73 0a 2a 2a 20 74  ne releases.** t
81b0: 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
81c0: 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20   and acquires a 
81d0: 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69  SHARED lock in i
81e0: 74 73 20 70 6c 61 63 65 2e 20 20 54 68 65 20 6a  ts place.  The j
81f0: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 69  ournal.** file i
8200: 73 20 64 65 6c 65 74 65 64 20 61 6e 64 20 63 6c  s deleted and cl
8210: 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f  osed..**.** TODO
8220: 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70 69  : Consider keepi
8230: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
8240: 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d  ile open for tem
8250: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73  porary databases
8260: 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20  ..** This might 
8270: 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e  give a performan
8280: 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f  ce improvement o
8290: 6e 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65 20  n windows where 
82a0: 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c  opening.** a fil
82b0: 65 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76  e is an expensiv
82c0: 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  e operation..*/.
82d0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
82e0: 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 50 61 67  _unwritelock(Pag
82f0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
8300: 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
8310: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
8320: 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c  .  int rc2 = SQL
8330: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
8340: 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66  ( !MEMDB );.  if
8350: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  ( pPager->state<
8360: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
8370: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8380: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71  ITE_OK;.  }.  sq
8390: 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f  lite3PagerStmtCo
83a0: 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20  mmit(pPager);.  
83b0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
83c0: 4f 70 65 6e 20 26 26 20 21 70 50 61 67 65 72 2d  Open && !pPager-
83d0: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
83e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
83f0: 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74  lose(&pPager->st
8400: 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  fd);.    pPager-
8410: 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20  >stmtOpen = 0;. 
8420: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
8430: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
8440: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
8450: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
8460: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
8470: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
8480: 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
8490: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65       sqlite3OsSe
84a0: 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ek(pPager->jfd, 
84b0: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  0);.      pPager
84c0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
84d0: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
84e0: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
84f0: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
8500: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
8510: 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ose(&pPager->jfd
8520: 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
8530: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30  >journalOpen = 0
8540: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
8550: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
8560: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a  ger->zJournal);.
8570: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
8580: 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49  Free( pPager->aI
8590: 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  nJournal );.    
85a0: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
85b0: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  al = 0;.    for(
85c0: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
85d0: 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
85e0: 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
85f0: 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
8600: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
8610: 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  dirty = 0;.     
8620: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
8630: 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 61   0;.      pPg->a
8640: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
8650: 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
8660: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
8670: 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
8680: 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
8690: 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
86a0: 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
86b0: 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  >pDirty = 0;.   
86c0: 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
86d0: 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  che = 0;.    pPa
86e0: 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
86f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
8700: 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
8710: 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
8720: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
8730: 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c  >dirtyCache==0 |
8740: 7c 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  | pPager->useJou
8750: 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a  rnal==0 );.  }..
8760: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
8770: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
8780: 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
8790: 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72  3OsUnlock(pPager
87a0: 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
87b0: 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  K);.    pPager->
87c0: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
87d0: 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ARED;.  }else if
87e0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
87f0: 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 29 7b  =PAGER_SYNCED ){
8800: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
8810: 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
8820: 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67  SIVE;.  }.  pPag
8830: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
8840: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
8850: 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70  tMaster = 0;.  p
8860: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
8870: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
8880: 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50  FirstSynced = pP
8890: 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20  ager->pFirst;.  
88a0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
88b0: 20 2d 31 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28   -1;..  return (
88c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63  rc==SQLITE_OK?rc
88d0: 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  2:rc);.}../*.** 
88e0: 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75  Compute and retu
88f0: 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 66 6f  rn a checksum fo
8900: 72 20 74 68 65 20 70 61 67 65 20 6f 66 20 64 61  r the page of da
8910: 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ta..**.** This i
8920: 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65  s not a real che
8930: 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20 72 65  cksum.  It is re
8940: 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75  ally just the su
8950: 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e  m of the .** ran
8960: 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  dom initial valu
8970: 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 6e  e and the page n
8980: 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70 65 72  umber.  We exper
8990: 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20  imented with.** 
89a0: 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68  a checksum of th
89b0: 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c 20 62  e entire data, b
89c0: 75 74 20 74 68 61 74 20 77 61 73 20 66 6f 75 6e  ut that was foun
89d0: 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77  d to be too slow
89e0: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
89f0: 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  t the page numbe
8a00: 72 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74  r is stored at t
8a10: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
8a20: 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20  data and.** the 
8a30: 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f 72  checksum is stor
8a40: 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  ed at the end.  
8a50: 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e  This is importan
8a60: 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a  t.  If journal.*
8a70: 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63  * corruption occ
8a80: 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77  urs due to a pow
8a90: 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
8aa0: 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e  most likely scen
8ab0: 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20  ario.** is that 
8ac0: 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f  one end or the o
8ad0: 74 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f  ther of the reco
8ae0: 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67  rd will be chang
8af0: 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75  ed.  It is.** mu
8b00: 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74  ch less likely t
8b10: 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73  hat the two ends
8b20: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
8b30: 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a  record will be.*
8b40: 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68  * correct and th
8b50: 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72  e middle be corr
8b60: 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73  upt.  Thus, this
8b70: 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65   "checksum" sche
8b80: 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61  me,.** though fa
8b90: 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63  st and simple, c
8ba0: 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c  atches the mostl
8bb0: 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66  y likely kind of
8bc0: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a   corruption..**.
8bd0: 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73  ** FIX ME:  Cons
8be0: 69 64 65 72 20 61 64 64 69 6e 67 20 65 76 65 72  ider adding ever
8bf0: 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f 29 20  y 200th (or so) 
8c00: 62 79 74 65 20 6f 66 20 74 68 65 20 64 61 74 61  byte of the data
8c10: 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b   to the.** check
8c20: 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79 20 69  sum.  That way i
8c30: 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  f a single page 
8c40: 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20  spans 3 or more 
8c50: 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61 6e 64  disk sectors and
8c60: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64  .** only the mid
8c70: 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20 63 6f  dle sector is co
8c80: 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c 20 73  rrupt, we will s
8c90: 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65 61 73  till have a reas
8ca0: 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65  onable.** chance
8cb0: 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68 65 20   of failing the 
8cc0: 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74 68 75  checksum and thu
8cd0: 73 20 64 65 74 65 63 74 69 6e 67 20 74 68 65 20  s detecting the 
8ce0: 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74  problem..*/.stat
8cf0: 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73  ic u32 pager_cks
8d00: 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  um(Pager *pPager
8d10: 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74  , const u8 *aDat
8d20: 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20  a){.  u32 cksum 
8d30: 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
8d40: 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70  nit;.  int i = p
8d50: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d  Pager->pageSize-
8d60: 32 30 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e  200;.  while( i>
8d70: 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  0 ){.    cksum +
8d80: 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20  = aData[i];.    
8d90: 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20  i -= 200;.  }.  
8da0: 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a  return cksum;.}.
8db0: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
8dc0: 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69  aration */.stati
8dd0: 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e  c void makeClean
8de0: 28 50 67 48 64 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  (PgHdr*);../*.**
8df0: 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70   Read a single p
8e00: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  age from the jou
8e10: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64  rnal file opened
8e20: 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
8e30: 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61  tor.** jfd.  Pla
8e40: 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20 70  yback this one p
8e50: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73  age..**.** If us
8e60: 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61  eCksum==0 it mea
8e70: 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  ns this journal 
8e80: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 63 68 65  does not use che
8e90: 63 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b 73 75  cksums.  Checksu
8ea0: 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73  ms.** are not us
8eb0: 65 64 20 69 6e 20 73 74 61 74 65 6d 65 6e 74 20  ed in statement 
8ec0: 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61 75 73 65  journals because
8ed0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
8ee0: 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65  als do not.** ne
8ef0: 65 64 20 74 6f 20 73 75 72 76 69 76 65 20 70 6f  ed to survive po
8f00: 77 65 72 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f  wer failures..*/
8f10: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
8f20: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
8f30: 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
8f40: 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64 2c 20  r, OsFile *jfd, 
8f50: 69 6e 74 20 75 73 65 43 6b 73 75 6d 29 7b 0a 20  int useCksum){. 
8f60: 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
8f70: 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20   *pPg;          
8f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
8f90: 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
8fa0: 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
8fb0: 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
8fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8fd0: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
8fe0: 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75  of a page in jou
8ff0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
9000: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
9010: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
9020: 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e  sum used for san
9030: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a  ity checking */.
9040: 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20 28 75    u8 *aData = (u
9050: 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70  8 *)pPager->pTmp
9060: 53 70 61 63 65 3b 20 20 20 2f 2a 20 54 65 6d 70  Space;   /* Temp
9070: 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 20 70   storage for a p
9080: 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 75 73 65  age */..  /* use
9090: 43 6b 73 75 6d 20 73 68 6f 75 6c 64 20 62 65 20  Cksum should be 
90a0: 74 72 75 65 20 66 6f 72 20 74 68 65 20 6d 61 69  true for the mai
90b0: 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 66 61  n journal and fa
90c0: 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20 73 74 61  lse for.  ** sta
90d0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e  tement journals.
90e0: 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68    Verify that th
90f0: 69 73 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  is is always the
9100: 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20 61 73 73   case.  */.  ass
9110: 65 72 74 28 20 6a 66 64 20 3d 3d 20 28 75 73 65  ert( jfd == (use
9120: 43 6b 73 75 6d 20 3f 20 70 50 61 67 65 72 2d 3e  Cksum ? pPager->
9130: 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 74  jfd : pPager->st
9140: 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
9150: 20 61 44 61 74 61 20 29 3b 0a 0a 20 20 72 63 20   aData );..  rc 
9160: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
9170: 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  , &pgno);.  if( 
9180: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
9190: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
91a0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
91b0: 6a 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67  jfd, aData, pPag
91c0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
91d0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
91e0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
91f0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
9200: 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e  lOff += pPager->
9210: 70 61 67 65 53 69 7a 65 20 2b 20 34 3b 0a 0a 20  pageSize + 4;.. 
9220: 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
9230: 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  ing on the page.
9240: 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69    This is more i
9250: 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20  mportant that I 
9260: 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20  originally.  ** 
9270: 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70  thought.  If a p
9280: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
9290: 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  urs while the jo
92a0: 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77  urnal is being w
92b0: 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20  ritten,.  ** it 
92c0: 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61  could cause inva
92d0: 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77  lid data to be w
92e0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
92f0: 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65  journal.  We nee
9300: 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74  d to.  ** detect
9310: 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61   this invalid da
9320: 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72  ta (with high pr
9330: 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69  obability) and i
9340: 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20  gnore it..  */. 
9350: 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20   if( pgno==0 || 
9360: 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
9370: 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
9380: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9390: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28  _DONE;.  }.  if(
93a0: 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e 65 64 29   pgno>(unsigned)
93b0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
93c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
93d0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
93e0: 28 20 75 73 65 43 6b 73 75 6d 20 29 7b 0a 20 20  ( useCksum ){.  
93f0: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
9400: 73 28 6a 66 64 2c 20 26 63 6b 73 75 6d 29 3b 0a  s(jfd, &cksum);.
9410: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
9420: 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67  urn rc;.    pPag
9430: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
9440: 3d 20 34 3b 0a 20 20 20 20 69 66 28 20 70 61 67  = 4;.    if( pag
9450: 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
9460: 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29   aData)!=cksum )
9470: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
9480: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
9490: 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
94a0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
94b0: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c  PAGER_RESERVED |
94c0: 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  | pPager->state>
94d0: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
94e0: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
94f0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45 53   pager is in RES
9500: 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65  ERVED state, the
9510: 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
9520: 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20  a copy of this. 
9530: 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20   ** page in the 
9540: 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20  pager cache. In 
9550: 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75  this case just u
9560: 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
9570: 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20  cache,.  ** not 
9580: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
9590: 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c  e. The page is l
95a0: 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79  eft marked dirty
95b0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
95c0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45   **.  ** If in E
95d0: 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20  XCLUSIVE state, 
95e0: 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74  then we update t
95f0: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69  he pager cache i
9600: 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a  f it exists.  **
9610: 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69   and the main fi
9620: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
9630: 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20  then marked not 
9640: 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dirty..  **.  **
9650: 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20   Ticket #1171:  
9660: 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  The statement jo
9670: 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74  urnal might cont
9680: 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ain page content
9690: 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69   that is.  ** di
96a0: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
96b0: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74   page content at
96c0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
96d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
96e0: 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20   ** This occurs 
96f0: 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63  when a page is c
9700: 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20  hanged prior to 
9710: 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73  the start of a s
9720: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
9730: 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e  en changed again
9740: 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
9750: 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c  ement.  When rol
9760: 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61  ling back such a
9770: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
9780: 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74  we must not writ
9790: 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  e to the origina
97a0: 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73  l database unles
97b0: 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66  s we know.  ** f
97c0: 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  or certain that 
97d0: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
97e0: 6e 74 65 6e 74 73 20 61 72 65 20 69 6e 20 74 68  ntents are in th
97f0: 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
9800: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f    ** journal.  O
9810: 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 20 66  therwise, if a f
9820: 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 6f 63 63  ull ROLLBACK occ
9830: 75 72 73 20 61 66 74 65 72 20 74 68 65 20 73 74  urs after the st
9840: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c  atement.  ** rol
9850: 6c 62 61 63 6b 20 74 68 65 20 66 75 6c 6c 20 52  lback the full R
9860: 4f 4c 4c 42 41 43 4b 20 77 69 6c 6c 20 6e 6f 74  OLLBACK will not
9870: 20 72 65 73 74 6f 72 65 20 74 68 65 20 70 61 67   restore the pag
9880: 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  e to its origina
9890: 6c 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20  l.  ** content. 
98a0: 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20   Two conditions 
98b0: 6d 75 73 74 20 62 65 20 6d 65 74 20 62 65 66 6f  must be met befo
98c0: 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  re writing to th
98d0: 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  e database.  ** 
98e0: 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64  files. (1) the d
98f0: 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
9900: 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20  locked.  (2) we 
9910: 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72  know that the or
9920: 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 70 61 67 65  iginal.  ** page
9930: 20 63 6f 6e 74 65 6e 74 20 69 73 20 69 6e 20 74   content is in t
9940: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
9950: 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74  either because t
9960: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
9970: 6e 0a 20 20 2a 2a 20 63 61 63 68 65 20 6f 72 20  n.  ** cache or 
9980: 65 6c 73 65 20 69 74 20 69 73 20 6d 61 72 6b 65  else it is marke
9990: 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30  d as needSync==0
99a0: 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70  ..  */.  pPg = p
99b0: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
99c0: 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73  er, pgno);.  ass
99d0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
99e0: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
99f0: 49 56 45 20 7c 7c 20 70 50 67 21 3d 30 20 29 3b  IVE || pPg!=0 );
9a00: 0a 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22  .  PAGERTRACE3("
9a10: 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65  PLAYBACK %d page
9a20: 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
9a30: 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 3b 0a  pPager), pgno);.
9a40: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
9a50: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
9a60: 53 49 56 45 20 26 26 20 28 70 50 67 3d 3d 30 20  SIVE && (pPg==0 
9a70: 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  || pPg->needSync
9a80: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  ==0) ){.    rc =
9a90: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
9aa0: 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f  Pager->fd, (pgno
9ab0: 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
9ac0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
9ad0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
9ae0: 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
9af0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
9b00: 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61 74 61  Pager->fd, aData
9b10: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
9b20: 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ze);.    }.    i
9b30: 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20  f( pPg ){.      
9b40: 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  makeClean(pPg);.
9b50: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
9b60: 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  pPg ){.    /* No
9b70: 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65   page should eve
9b80: 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20  r be explicitly 
9b90: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74  rolled back that
9ba0: 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65   is in use, exce
9bb0: 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61  pt.    ** for pa
9bc0: 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65  ge 1 which is he
9bd0: 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64  ld in use in ord
9be0: 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c  er to keep the l
9bf0: 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
9c00: 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76  * database activ
9c10: 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20  e. However such 
9c20: 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f  a page may be ro
9c30: 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
9c40: 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20  esult.    ** of 
9c50: 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f  an internal erro
9c60: 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61  r resulting in a
9c70: 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c  n automatic call
9c80: 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
9c90: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
9ca0: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f  )..    */.    vo
9cb0: 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 2f  id *pData;.    /
9cc0: 2a 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e  * assert( pPg->n
9cd0: 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70  Ref==0 || pPg->p
9ce0: 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20  gno==1 ); */.   
9cf0: 20 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54   pData = PGHDR_T
9d00: 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 20  O_DATA(pPg);.   
9d10: 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 61   memcpy(pData, a
9d20: 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
9d30: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  geSize);.    if(
9d40: 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
9d50: 63 74 6f 72 20 29 7b 20 20 2f 2a 2a 2a 20 46 49  ctor ){  /*** FI
9d60: 58 20 4d 45 3a 20 20 53 68 6f 75 6c 64 20 74 68  X ME:  Should th
9d70: 69 73 20 62 65 20 78 52 65 69 6e 69 74 3f 20 2a  is be xReinit? *
9d80: 2a 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72  **/.      pPager
9d90: 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70 50  ->xDestructor(pP
9da0: 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  g, pPager->pageS
9db0: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64  ize);.    }.#ifd
9dc0: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
9dd0: 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70  PAGES.    pPg->p
9de0: 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
9df0: 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
9e00: 65 6e 64 69 66 0a 20 20 20 20 43 4f 44 45 43 31  endif.    CODEC1
9e10: 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
9e20: 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 0a  pPg->pgno, 3);..
9e30: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77      /* If this w
9e40: 61 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20  as page 1, then 
9e50: 72 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75  restore the valu
9e60: 65 20 6f 66 20 50 61 67 65 72 2e 69 43 68 61 6e  e of Pager.iChan
9e70: 67 65 43 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69  geCount */.    i
9e80: 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
9e90: 20 20 20 20 70 50 61 67 65 72 2d 3e 69 43 68 61      pPager->iCha
9ea0: 6e 67 65 43 6f 75 6e 74 20 3d 20 72 65 74 72 69  ngeCount = retri
9eb0: 65 76 65 33 32 62 69 74 73 28 70 50 67 2c 20 32  eve32bits(pPg, 2
9ec0: 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  4);.    }.  }.  
9ed0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
9ee0: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d  .** Parameter zM
9ef0: 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d  aster is the nam
9f00: 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  e of a master jo
9f10: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69  urnal file. A si
9f20: 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ngle journal.** 
9f30: 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72  file that referr
9f40: 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72  ed to the master
9f50: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
9f60: 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c  s just been roll
9f70: 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73  ed back..** This
9f80: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
9f90: 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
9fa0: 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
9fb0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9fc0: 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73  ile,.** and does
9fd0: 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a   so if it is..**
9fe0: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
9ff0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74  ournal file cont
a000: 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f  ains the names o
a010: 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72  f all child jour
a020: 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c  nals..** To tell
a030: 20 69 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   if a master jou
a040: 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65  rnal can be dele
a050: 74 65 64 2c 20 63 68 65 63 6b 20 74 6f 20 65 61  ted, check to ea
a060: 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69  ch of the.** chi
a070: 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63  ldren.  If all c
a080: 68 69 6c 64 72 65 6e 20 61 72 65 20 65 69 74 68  hildren are eith
a090: 65 72 20 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f  er missing or do
a0a0: 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a   not refer to.**
a0b0: 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d 61 73   a different mas
a0c0: 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65  ter journal, the
a0d0: 6e 20 74 68 69 73 20 6d 61 73 74 65 72 20 6a 6f  n this master jo
a0e0: 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c  urnal can be del
a0f0: 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eted..*/.static 
a100: 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  int pager_delmas
a110: 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ter(const char *
a120: 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
a130: 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65 72  rc;.  int master
a140: 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f 73 46  _open = 0;.  OsF
a150: 69 6c 65 20 2a 6d 61 73 74 65 72 20 3d 20 30 3b  ile *master = 0;
a160: 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
a170: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20  Journal = 0; /* 
a180: 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74  Contents of mast
a190: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
a1a0: 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72  */.  i64 nMaster
a1b0: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f  Journal;       /
a1c0: 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72  * Size of master
a1d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
a1e0: 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
a1f0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
a200: 69 6c 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20  ile exclusively 
a210: 69 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f 74 68  in case some oth
a220: 65 72 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20  er process.  ** 
a230: 69 73 20 72 75 6e 6e 69 6e 67 20 74 68 69 73 20  is running this 
a240: 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f  routine also. No
a250: 74 20 74 68 61 74 20 69 74 20 6d 61 6b 65 73 20  t that it makes 
a260: 74 6f 6f 20 6d 75 63 68 20 64 69 66 66 65 72 65  too much differe
a270: 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  nce..  */.  rc =
a280: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
a290: 61 64 4f 6e 6c 79 28 7a 4d 61 73 74 65 72 2c 20  adOnly(zMaster, 
a2a0: 26 6d 61 73 74 65 72 29 3b 0a 20 20 69 66 28 20  &master);.  if( 
a2b0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
a2c0: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
a2d0: 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65  ut;.  master_ope
a2e0: 6e 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71  n = 1;.  rc = sq
a2f0: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
a300: 6d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72  master, &nMaster
a310: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
a320: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
a330: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
a340: 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74  ut;..  if( nMast
a350: 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20  erJournal>0 ){. 
a360: 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61     char *zJourna
a370: 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  l;.    char *zMa
a380: 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 0a 20 20  sterPtr = 0;..  
a390: 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e    /* Load the en
a3a0: 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
a3b0: 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70  nal file into sp
a3c0: 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
a3d0: 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 4d  m.    ** sqliteM
a3e0: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e  alloc() and poin
a3f0: 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
a400: 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a  rJournal. .    *
a410: 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75  /.    zMasterJou
a420: 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73  rnal = (char *)s
a430: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73  qliteMalloc(nMas
a440: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  terJournal);.   
a450: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75   if( !zMasterJou
a460: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  rnal ){.      rc
a470: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
a480: 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d  .      goto delm
a490: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d  aster_out;.    }
a4a0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
a4b0: 33 4f 73 52 65 61 64 28 6d 61 73 74 65 72 2c 20  3OsRead(master, 
a4c0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  zMasterJournal, 
a4d0: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
a4e0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
a4f0: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
a500: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
a510: 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
a520: 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  sterJournal;.   
a530: 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
a540: 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
a550: 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
a560: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
a570: 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74  lite3OsFileExist
a580: 73 28 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20  s(zJournal) ){. 
a590: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
a5a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f   the journals po
a5b0: 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
a5c0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65  master journal e
a5d0: 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  xists..        *
a5e0: 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68  * Open it and ch
a5f0: 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73  eck if it points
a600: 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a   at the master j
a610: 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20  ournal. If.     
a620: 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
a630: 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
a640: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
a650: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
a660: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f 73     */.        Os
a670: 46 69 6c 65 20 2a 6a 6f 75 72 6e 61 6c 20 3d 20  File *journal = 
a680: 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  0;.        int c
a690: 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ;..        rc = 
a6a0: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
a6b0: 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61 6c 2c 20  dOnly(zJournal, 
a6c0: 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  &journal);.     
a6d0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
a6e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
a6f0: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
a700: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
a710: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
a720: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
a730: 6a 6f 75 72 6e 61 6c 2c 20 26 7a 4d 61 73 74 65  journal, &zMaste
a740: 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73  rPtr);.        s
a750: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6a  qlite3OsClose(&j
a760: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  ournal);.       
a770: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
a780: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
a790: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
a7a0: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
a7b0: 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74         c = zMast
a7c0: 65 72 50 74 72 21 3d 30 20 26 26 20 73 74 72 63  erPtr!=0 && strc
a7d0: 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a  mp(zMasterPtr, z
a7e0: 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20  Master)==0;.    
a7f0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
a800: 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20  MasterPtr);.    
a810: 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20      if( c ){.   
a820: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
a830: 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
a840: 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
a850: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
a860: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67  . */.          g
a870: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
a880: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
a890: 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72     }.      zJour
a8a0: 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a  nal += (strlen(z
a8b0: 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20  Journal)+1);.   
a8c0: 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 72 63 20 3d   }.  }.  .  rc =
a8d0: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
a8e0: 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65 6c 6d  (zMaster);..delm
a8f0: 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28  aster_out:.  if(
a900: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
a910: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
a920: 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  e(zMasterJournal
a930: 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d  );.  }  .  if( m
a940: 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20  aster_open ){.  
a950: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
a960: 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20  (&master);.  }. 
a970: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
a980: 69 66 20 30 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  if 0./*.** Make 
a990: 65 76 65 72 79 20 70 61 67 65 20 69 6e 20 74 68  every page in th
a9a0: 65 20 63 61 63 68 65 20 61 67 72 65 65 20 77 69  e cache agree wi
a9b0: 74 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69  th what is on di
a9c0: 73 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  sk.  In other wo
a9d0: 72 64 73 2c 0a 2a 2a 20 72 65 72 65 61 64 20 74  rds,.** reread t
a9e0: 68 65 20 64 69 73 6b 20 74 6f 20 72 65 73 65 74  he disk to reset
a9f0: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
aa00: 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54  e cache..**.** T
aa10: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
aa20: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 72 6f  alled after a ro
aa30: 6c 6c 62 61 63 6b 20 69 6e 20 77 68 69 63 68 20  llback in which 
aa40: 73 6f 6d 65 20 6f 66 20 74 68 65 20 64 69 72 74  some of the dirt
aa50: 79 20 63 61 63 68 65 0a 2a 2a 20 70 61 67 65 73  y cache.** pages
aa60: 20 68 61 64 20 6e 65 76 65 72 20 62 65 65 6e 20   had never been 
aa70: 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 64  written out to d
aa80: 69 73 6b 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  isk.  We need to
aa90: 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a   roll back the.*
aaa0: 2a 20 63 61 63 68 65 20 63 6f 6e 74 65 6e 74 20  * cache content 
aab0: 61 6e 64 20 74 68 65 20 65 61 73 69 65 73 74 20  and the easiest 
aac0: 77 61 79 20 74 6f 20 64 6f 20 74 68 61 74 20 69  way to do that i
aad0: 73 20 74 6f 20 72 65 72 65 61 64 20 74 68 65 20  s to reread the 
aae0: 6f 6c 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62  old content.** b
aaf0: 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 69 73  ack from the dis
ab00: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
ab10: 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61   pager_reload_ca
ab20: 63 68 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  che(Pager *pPage
ab30: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
ab40: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
ab50: 49 54 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70 50  ITE_OK;.  for(pP
ab60: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
ab70: 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
ab80: 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 63 68 61  extAll){.    cha
ab90: 72 20 2a 7a 42 75 66 20 3d 20 70 50 61 67 65 72  r *zBuf = pPager
aba0: 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20  ->pTmpSpace;    
abb0: 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72      /* Temp stor
abc0: 61 67 65 20 66 6f 72 20 6f 6e 65 20 70 61 67 65  age for one page
abd0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67   */.    if( !pPg
abe0: 2d 3e 64 69 72 74 79 20 29 20 63 6f 6e 74 69 6e  ->dirty ) contin
abf0: 75 65 3b 0a 20 20 20 20 69 66 28 20 28 69 6e 74  ue;.    if( (int
ac00: 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50  )pPg->pgno <= pP
ac10: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
ac20: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
ac30: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
ac40: 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
ac50: 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29 28  >pageSize*(i64)(
ac60: 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 29 3b 0a 20  pPg->pgno-1));. 
ac70: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
ac80: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ac90: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
aca0: 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
acb0: 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70   zBuf, pPager->p
acc0: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
acd0: 7d 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  }.      PAGERTRA
ace0: 43 45 33 28 22 52 45 46 45 54 43 48 20 25 64 20  CE3("REFETCH %d 
acf0: 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
ad00: 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
ad10: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  ->pgno);.      i
ad20: 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
ad30: 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67       CODEC1(pPag
ad40: 65 72 2c 20 7a 42 75 66 2c 20 70 50 67 2d 3e 70  er, zBuf, pPg->p
ad50: 67 6e 6f 2c 20 32 29 3b 0a 20 20 20 20 7d 65 6c  gno, 2);.    }el
ad60: 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  se{.      memset
ad70: 28 7a 42 75 66 2c 20 30 2c 20 70 50 61 67 65 72  (zBuf, 0, pPager
ad80: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
ad90: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
ada0: 6e 52 65 66 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d  nRef==0 || memcm
adb0: 70 28 7a 42 75 66 2c 20 50 47 48 44 52 5f 54 4f  p(zBuf, PGHDR_TO
adc0: 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67  _DATA(pPg), pPag
add0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b  er->pageSize) ){
ade0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47  .      memcpy(PG
adf0: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
ae00: 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e  , zBuf, pPager->
ae10: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
ae20: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65   if( pPager->xRe
ae30: 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20  initer ){.      
ae40: 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
ae50: 74 65 72 28 70 50 67 2c 20 70 50 61 67 65 72 2d  ter(pPg, pPager-
ae60: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
ae70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ae80: 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
ae90: 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67  _EXTRA(pPg, pPag
aea0: 65 72 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  er), 0, pPager->
aeb0: 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d  nExtra);.      }
aec0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
aed0: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
aee0: 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
aef0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
af00: 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
af10: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
af20: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
af30: 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  Pg);.#endif.  }.
af40: 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
af50: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
af60: 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  c;.}.#endif../*.
af70: 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  ** Truncate the 
af80: 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20 74 68 65  main file of the
af90: 20 67 69 76 65 6e 20 70 61 67 65 72 20 74 6f 20   given pager to 
afa0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
afb0: 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64  ges.** indicated
afc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
afd0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50  pager_truncate(P
afe0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
aff0: 74 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65  t nPage){.  asse
b000: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
b010: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
b020: 56 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  VE );.  return s
b030: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
b040: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
b050: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69  ger->pageSize*(i
b060: 36 34 29 6e 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  64)nPage);.}../*
b070: 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
b080: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75   journal and thu
b090: 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  s restore the da
b0a0: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a  tabase file to.*
b0b0: 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  * the state it w
b0c0: 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20  as in before we 
b0d0: 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63  started making c
b0e0: 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20  hanges.  .**.** 
b0f0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
b100: 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f   format is as fo
b110: 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28  llows: .**.**  (
b120: 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69  1)  8 byte prefi
b130: 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a  x.  A copy of aJ
b140: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
b150: 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62  *  (2)  4 byte b
b160: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
b170: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
b180: 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70  umber of valid p
b190: 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20  age records.**  
b1a0: 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72       in the jour
b1b0: 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61  nal.  If this va
b1c0: 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
b1d0: 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20  f, then compute 
b1e0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d  the.**       num
b1f0: 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
b200: 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  rds from the jou
b210: 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  rnal size..**  (
b220: 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  3)  4 byte big-e
b230: 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
b240: 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69  ich is the initi
b250: 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  al value for the
b260: 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74   .**       sanit
b270: 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  y checksum..**  
b280: 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (4)  4 byte inte
b290: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
b2a0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
b2b0: 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
b2c0: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
b2d0: 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72  se to during a r
b2e0: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29  ollback..**  (5)
b2f0: 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
b300: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
b310: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
b320: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
b330: 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d  nal.**       nam
b340: 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61  e.  The value ma
b350: 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63  y be zero (indic
b360: 61 74 65 20 74 68 61 74 20 74 68 65 72 65 20 69  ate that there i
b370: 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20  s no master.**  
b380: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a       journal.).*
b390: 2a 20 20 28 36 29 20 20 4e 20 62 79 74 65 73 20  *  (6)  N bytes 
b3a0: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
b3b0: 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65  urnal name.  The
b3c0: 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75   name will be nu
b3d0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20  l-terminated.** 
b3e0: 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20        and might 
b3f0: 62 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20  be shorter than 
b400: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
b410: 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65  rom (5).  If the
b420: 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20   first byte.**  
b430: 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65       of the name
b440: 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68   is \000 then th
b450: 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72  ere is no master
b460: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d   journal.  The m
b470: 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a  aster.**       j
b480: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73  ournal name is s
b490: 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a  tored in UTF-8..
b4a0: 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f 20 6f 72  **  (7)  Zero or
b4b0: 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74   more pages inst
b4c0: 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66  ances, each as f
b4d0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20  ollows:.**      
b4e0: 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65    +  4 byte page
b4f0: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20   number..**     
b500: 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61     +  pPager->pa
b510: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
b520: 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20  data..**        
b530: 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73  +  4 byte checks
b540: 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65  um.**.** When we
b550: 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f   speak of the jo
b560: 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65  urnal header, we
b570: 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20   mean the first 
b580: 36 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a  6 items above..*
b590: 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20  * Each entry in 
b5a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61  the journal is a
b5b0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
b5c0: 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a  e 7th item..**.*
b5d0: 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65  * Call the value
b5e0: 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64   from the second
b5f0: 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20   bullet "nRec". 
b600: 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d   nRec is the num
b610: 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20  ber of.** valid 
b620: 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20  page entries in 
b630: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
b640: 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75   most cases, you
b650: 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
b660: 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  .** value of nRe
b670: 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  c from the size 
b680: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
b690: 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70  ile.  But if a p
b6a0: 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20  ower.** failure 
b6b0: 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74  occurred while t
b6c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
b6d0: 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74  eing written, it
b6e0: 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a   could be the.**
b6f0: 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73   case that the s
b700: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
b710: 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65  al file had alre
b720: 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73  ady been increas
b730: 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78  ed but.** the ex
b740: 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20  tra entries had 
b750: 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20  not yet made it 
b760: 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20  safely to disk. 
b770: 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c   In such a case,
b780: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
b790: 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
b7a0: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
b7b0: 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c  e would be too l
b7c0: 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  arge.  For.** th
b7d0: 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c  at reason, we al
b7e0: 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65  ways use the nRe
b7f0: 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68  c value in the h
b800: 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eader..**.** If 
b810: 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
b820: 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20  s 0xffffffff it 
b830: 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20  means that nRec 
b840: 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
b850: 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ed.** from the f
b860: 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ile size.  This 
b870: 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68  value is used wh
b880: 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65  en the user sele
b890: 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79  cts the.** no-sy
b8a0: 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68  nc option for th
b8b0: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f  e journal.  A po
b8c0: 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
b8d0: 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70  d lead to corrup
b8e0: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20  tion.** in this 
b8f0: 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74  case.  But for t
b900: 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f  hings like tempo
b910: 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63  rary table (whic
b920: 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c  h will be.** del
b930: 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f  eted when the po
b940: 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29  wer is restored)
b950: 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20   we don't care. 
b960: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66   .**.** If the f
b970: 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68  ile opened as th
b980: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
b990: 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
b9a0: 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  med.** journal f
b9b0: 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  ile then all pag
b9c0: 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72  es up to the fir
b9d0: 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67  st corrupted pag
b9e0: 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  e are rolled.** 
b9f0: 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65  back (or no page
ba00: 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s if the journal
ba10: 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75   header is corru
ba20: 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e  pted). The journ
ba30: 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68  al file.** is th
ba40: 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  en deleted and S
ba50: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
ba60: 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f  d, just as if no
ba70: 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a   corruption had.
ba80: 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  ** been encounte
ba90: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
baa0: 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29   I/O or malloc()
bab0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
bac0: 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  he journal-file 
bad0: 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a  is not deleted.*
bae0: 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
baf0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
bb00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
bb10: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
bb20: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
bb30: 20 69 73 48 6f 74 29 7b 0a 20 20 69 36 34 20 73   isHot){.  i64 s
bb40: 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
bb50: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
bb60: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
bb70: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
bb80: 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  2 nRec;         
bb90: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
bba0: 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74   of Records in t
bbb0: 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
bbc0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
bbd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
bbe0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67   counter */.  Pg
bbf0: 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20  no mxPg = 0;    
bc00: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
bc10: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66  f the original f
bc20: 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a  ile in pages */.
bc30: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
bc40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
bc50: 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73  sult code of a s
bc60: 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  ubroutine */.  c
bc70: 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
bc80: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
bc90: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
bca0: 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f  l file if any */
bcb0: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
bcc0: 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
bcd0: 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f  ds are in the jo
bce0: 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61  urnal.  Abort ea
bcf0: 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  rly if.  ** the 
bd00: 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79  journal is empty
bd10: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
bd20: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
bd30: 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73  Open );.  rc = s
bd40: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
bd50: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73  (pPager->jfd, &s
bd60: 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  zJ);.  if( rc!=S
bd70: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d  QLITE_OK || szJ=
bd80: 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  =0 ){.    goto e
bd90: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
bda0: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
bdb0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
bdc0: 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ame from the jou
bdd0: 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70  rnal, if it is p
bde0: 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20  resent..  ** If 
bdf0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
be00: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70   file name is sp
be10: 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65  ecified, but the
be20: 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a   file is not.  *
be30: 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73  * present on dis
be40: 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  k, then the jour
be50: 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61  nal is not hot a
be60: 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  nd does not need
be70: 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79   to be.  ** play
be80: 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed back..  */.  
be90: 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
bea0: 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
beb0: 66 64 2c 20 26 7a 4d 61 73 74 65 72 29 3b 0a 20  fd, &zMaster);. 
bec0: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
bed0: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66  ITE_DONE );.  if
bee0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
bef0: 7c 7c 20 28 7a 4d 61 73 74 65 72 20 26 26 20 21  || (zMaster && !
bf00: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69  sqlite3OsFileExi
bf10: 73 74 73 28 7a 4d 61 73 74 65 72 29 29 20 29 7b  sts(zMaster)) ){
bf20: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
bf30: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d  zMaster);.    zM
bf40: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69  aster = 0;.    i
bf50: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
bf60: 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  NE ) rc = SQLITE
bf70: 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  _OK;.    goto en
bf80: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
bf90: 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
bfa0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
bfb0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
bfc0: 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a  alOff = 0;..  /*
bfd0: 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69   This loop termi
bfe0: 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65  nates either whe
bff0: 6e 20 74 68 65 20 72 65 61 64 4a 6f 75 72 6e 61  n the readJourna
c000: 6c 48 64 72 28 29 20 63 61 6c 6c 20 72 65 74 75  lHdr() call retu
c010: 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  rns.  ** SQLITE_
c020: 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72  DONE or an IO er
c030: 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20  ror occurs. */. 
c040: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20   while( 1 ){..  
c050: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65    /* Read the ne
c060: 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  xt journal heade
c070: 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  r from the journ
c080: 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  al file.  If the
c090: 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f  re are.    ** no
c0a0: 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c  t enough bytes l
c0b0: 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  eft in the journ
c0c0: 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f  al file for a co
c0d0: 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f  mplete header, o
c0e0: 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63  r.    ** it is c
c0f0: 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61  orrupted, then a
c100: 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f 66   process must of
c110: 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72   failed while wr
c120: 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a  iting it..    **
c130: 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   This indicates 
c140: 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65  nothing more nee
c150: 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ds to be rolled 
c160: 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  back..    */.   
c170: 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
c180: 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a  lHdr(pPager, szJ
c190: 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b  , &nRec, &mxPg);
c1a0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
c1b0: 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20  ITE_OK ){ .     
c1c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c1d0: 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
c1e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
c1f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
c200: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
c210: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
c220: 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66  f nRec is 0xffff
c230: 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20  ffff, then this 
c240: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61  journal was crea
c250: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
c260: 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20  .    ** working 
c270: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e  in no-sync mode.
c280: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
c290: 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
c2a0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
c2b0: 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  file consists of
c2c0: 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72   pages, there ar
c2d0: 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61  e no more journa
c2e0: 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75  l headers. Compu
c2f0: 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61  te.    ** the va
c300: 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65  lue of nRec base
c310: 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70  d on this assump
c320: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
c330: 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66   if( nRec==0xfff
c340: 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61  fffff ){.      a
c350: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
c360: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
c370: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
c380: 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20  ) );.      nRec 
c390: 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c  = (szJ - JOURNAL
c3a0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29  _HDR_SZ(pPager))
c3b0: 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70  /JOURNAL_PG_SZ(p
c3c0: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  Pager);.    }.. 
c3d0: 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73     /* If nRec is
c3e0: 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c   0 and this roll
c3f0: 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61  back is of a tra
c400: 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64  nsaction created
c410: 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   by this.    ** 
c420: 70 72 6f 63 65 73 73 2e 20 49 6e 20 74 68 69 73  process. In this
c430: 20 63 61 73 65 20 74 68 65 20 72 65 73 74 20 6f   case the rest o
c440: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
c450: 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 0a 20  le consists of. 
c460: 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 6c 65 64     ** journalled
c470: 20 63 6f 70 69 65 73 20 6f 66 20 70 61 67 65 73   copies of pages
c480: 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
c490: 20 72 65 61 64 20 62 61 63 6b 20 69 6e 74 6f 20   read back into 
c4a0: 74 68 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a  the cache..    *
c4b0: 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  /.    if( nRec==
c4c0: 30 20 26 26 20 21 69 73 48 6f 74 20 29 7b 0a 20  0 && !isHot ){. 
c4d0: 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a       nRec = (szJ
c4e0: 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
c4f0: 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c  alOff) / JOURNAL
c500: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
c510: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
c520: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
c530: 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66  st header read f
c540: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
c550: 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
c560: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
c570: 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 27 73 20  le back to it's 
c580: 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
c590: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
c5a0: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
c5b0: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20  ER_EXCLUSIVE && 
c5c0: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
c5d0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
c5e0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
c5f0: 65 72 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  er) ){.      ass
c600: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69  ert( pPager->ori
c610: 67 44 62 53 69 7a 65 3d 3d 30 20 7c 7c 20 70 50  gDbSize==0 || pP
c620: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
c630: 3d 3d 6d 78 50 67 20 29 3b 0a 20 20 20 20 20 20  ==mxPg );.      
c640: 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
c650: 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
c660: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
c670: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c680: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
c690: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
c6a0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
c6b0: 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
c6c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
c6d0: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
c6e0: 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
c6f0: 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
c700: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
c710: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  le..    */.    f
c720: 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20  or(i=0; i<nRec; 
c730: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
c740: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
c750: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
c760: 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29   pPager->jfd, 1)
c770: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
c780: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c790: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
c7a0: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
c7b0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
c7c0: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
c7d0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
c7e0: 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20  ff = szJ;.      
c7f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c800: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c810: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
c820: 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
c830: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c840: 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45   }.  /*NOTREACHE
c850: 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20  D*/.  assert( 0 
c860: 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b  );..end_playback
c870: 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
c880: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
c890: 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
c8a0: 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ock(pPager);.  }
c8b0: 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 20 29  .  if( zMaster )
c8c0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
c8d0: 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a  e was a master j
c8e0: 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20  ournal and this 
c8f0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
c900: 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20  urn success,.   
c910: 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
c920: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
c930: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
c940: 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20  ournal..    */. 
c950: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
c960: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
c970: 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74   = pager_delmast
c980: 65 72 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  er(zMaster);.   
c990: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65   }.    sqliteFre
c9a0: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a  e(zMaster);.  }.
c9b0: 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e  .  /* The Pager.
c9c0: 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61  sectorSize varia
c9d0: 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  ble may have bee
c9e0: 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20  n updated while 
c9f0: 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63  rolling.  ** bac
ca00: 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61  k a journal crea
ca10: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
ca20: 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
ca30: 74 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53  t PAGER_SECTOR_S
ca40: 49 5a 45 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  IZE.  ** value. 
ca50: 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20  Reset it to the 
ca60: 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f  correct value fo
ca70: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  r this process..
ca80: 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 73    */.  pPager->s
ca90: 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69  ectorSize = sqli
caa0: 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
cab0: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 72  pPager->fd);.  r
cac0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
cad0: 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  ** Playback the 
cae0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
caf0: 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  l..**.** This is
cb00: 20 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79   similar to play
cb10: 69 6e 67 20 62 61 63 6b 20 74 68 65 20 74 72 61  ing back the tra
cb20: 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
cb30: 20 62 75 74 20 77 69 74 68 0a 2a 2a 20 61 20 66   but with.** a f
cb40: 65 77 20 65 78 74 72 61 20 74 77 69 73 74 73 2e  ew extra twists.
cb50: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54  .**.**    (1)  T
cb60: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
cb70: 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
cb80: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73  se file at the s
cb90: 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20  tart of.**      
cba0: 20 20 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74     the statement
cbb0: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 50   is stored in pP
cbc0: 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 2c 20  ager->stmtSize, 
cbd0: 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20  not in the.**   
cbe0: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69        journal fi
cbf0: 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a  le itself..**.**
cc00: 20 20 20 20 28 32 29 20 20 49 6e 20 61 64 64 69      (2)  In addi
cc10: 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20  tion to playing 
cc20: 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65  back the stateme
cc30: 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f  nt journal, also
cc40: 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 6c 61 79  .**         play
cc50: 62 61 63 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f  back all pages o
cc60: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
cc70: 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e  n journal beginn
cc80: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 61  ing.**         a
cc90: 74 20 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d  t offset pPager-
cca0: 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73  >stmtJSize..*/.s
ccb0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
ccc0: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 50 61  stmt_playback(Pa
ccd0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
cce0: 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
ccf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
cd00: 20 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75   of the full jou
cd10: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 68 64  rnal */.  i64 hd
cd20: 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 52 65 63  rOff;.  int nRec
cd30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cd40: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65   /* Number of Re
cd50: 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69  cords */.  int i
cd60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cd70: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
cd80: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ter */.  int rc;
cd90: 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72  ..  szJ = pPager
cda0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 23 69  ->journalOff;.#i
cdb0: 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 20 20  fndef NDEBUG .  
cdc0: 7b 0a 20 20 20 20 69 36 34 20 6f 73 5f 73 7a 4a  {.    i64 os_szJ
cdd0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
cde0: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
cdf0: 67 65 72 2d 3e 6a 66 64 2c 20 26 6f 73 5f 73 7a  ger->jfd, &os_sz
ce00: 4a 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  J);.    if( rc!=
ce10: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
ce20: 72 6e 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72  rn rc;.    asser
ce30: 74 28 20 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20 29  t( szJ==os_szJ )
ce40: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
ce50: 2f 2a 20 53 65 74 20 68 64 72 4f 66 66 20 74 6f  /* Set hdrOff to
ce60: 20 62 65 20 74 68 65 20 6f 66 66 73 65 74 20 6a   be the offset j
ce70: 75 73 74 20 61 66 74 65 72 20 74 68 65 20 65 6e  ust after the en
ce80: 64 20 6f 66 20 74 68 65 20 6c 61 73 74 20 6a 6f  d of the last jo
ce90: 75 72 6e 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20  urnal.  ** page 
cea0: 77 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20 74  written before t
ceb0: 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
cec0: 2d 68 65 61 64 65 72 20 66 6f 72 20 74 68 69 73  -header for this
ced0: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
cee0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
cef0: 77 72 69 74 74 65 6e 2c 20 6f 72 20 74 68 65 20  written, or the 
cf00: 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
cf10: 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20  if no journal.  
cf20: 2a 2a 20 68 65 61 64 65 72 20 77 61 73 20 77 72  ** header was wr
cf30: 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64  itten..  */.  hd
cf40: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73  rOff = pPager->s
cf50: 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61 73 73  tmtHdrOff;.  ass
cf60: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c  ert( pPager->ful
cf70: 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66  lSync || !hdrOff
cf80: 20 29 3b 0a 20 20 69 66 28 20 21 68 64 72 4f 66   );.  if( !hdrOf
cf90: 66 20 29 7b 0a 20 20 20 20 68 64 72 4f 66 66 20  f ){.    hdrOff 
cfa0: 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20  = szJ;.  }.  .  
cfb0: 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  /* Truncate the 
cfc0: 64 61 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f  database back to
cfd0: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69   its original si
cfe0: 7a 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ze..  */.  if( p
cff0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
d000: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  GER_EXCLUSIVE ){
d010: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
d020: 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
d030: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
d040: 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  e);.  }.  assert
d050: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
d060: 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
d070: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
d080: 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  e = pPager->stmt
d090: 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  Size;..  /* Figu
d0a0: 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
d0b0: 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
d0c0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
d0d0: 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  rnal..  */.  ass
d0e0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d  ert( pPager->stm
d0f0: 74 49 6e 55 73 65 20 26 26 20 70 50 61 67 65 72  tInUse && pPager
d100: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
d110: 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b  .  sqlite3OsSeek
d120: 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30  (pPager->stfd, 0
d130: 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50 61 67  );.  nRec = pPag
d140: 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20  er->stmtNRec;.  
d150: 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69  .  /* Copy origi
d160: 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66  nal pages out of
d170: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
d180: 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20  ournal and back 
d190: 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  into the.  ** da
d1a0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f  tabase file.  No
d1b0: 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74  te that the stat
d1c0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d  ement journal om
d1d0: 69 74 73 20 63 68 65 63 6b 73 75 6d 73 20 66 72  its checksums fr
d1e0: 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20 72 65 63  om.  ** each rec
d1f0: 6f 72 64 20 73 69 6e 63 65 20 70 6f 77 65 72 2d  ord since power-
d200: 66 61 69 6c 75 72 65 20 72 65 63 6f 76 65 72 79  failure recovery
d210: 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e   is not importan
d220: 74 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a 20  t to statement. 
d230: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20   ** journals..  
d240: 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d  */.  for(i=nRec-
d250: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
d260: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
d270: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
d280: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
d290: 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 61 73  stfd, 0);.    as
d2a0: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
d2b0: 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28  _DONE );.    if(
d2c0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d2d0: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
d2e0: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
d2f0: 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65  /* Now roll some
d300: 20 70 61 67 65 73 20 62 61 63 6b 20 66 72 6f 6d   pages back from
d310: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
d320: 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67 65 72 2e   journal. Pager.
d330: 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a 20 77  stmtJSize.  ** w
d340: 61 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  as the size of t
d350: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d360: 77 68 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d  when this statem
d370: 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64 2c  ent was started,
d380: 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72 79 74 68   so.  ** everyth
d390: 69 6e 67 20 61 66 74 65 72 20 74 68 61 74 20 6e  ing after that n
d3a0: 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
d3b0: 64 20 62 61 63 6b 2c 20 65 69 74 68 65 72 20 69  d back, either i
d3c0: 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74  nto the.  ** dat
d3d0: 61 62 61 73 65 2c 20 74 68 65 20 6d 65 6d 6f 72  abase, the memor
d3e0: 79 20 63 61 63 68 65 2c 20 6f 72 20 62 6f 74 68  y cache, or both
d3f0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69  ..  **.  ** If i
d400: 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74  t is not zero, t
d410: 68 65 6e 20 50 61 67 65 72 2e 73 74 6d 74 48 64  hen Pager.stmtHd
d420: 72 4f 66 66 20 69 73 20 74 68 65 20 6f 66 66 73  rOff is the offs
d430: 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a  et to the start.
d440: 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73    ** of the firs
d450: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
d460: 20 77 72 69 74 74 65 6e 20 64 75 72 69 6e 67 20   written during 
d470: 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 74  this statement t
d480: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
d490: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
d4a0: 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66  sSeek(pPager->jf
d4b0: 64 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  d, pPager->stmtJ
d4c0: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Size);.  if( rc!
d4d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d4e0: 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f    goto end_stmt_
d4f0: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20  playback;.  }.  
d500: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d510: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ff = pPager->stm
d520: 74 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72  tJSize;.  pPager
d530: 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70 50  ->cksumInit = pP
d540: 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b  ager->stmtCksum;
d550: 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72  .  while( pPager
d560: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 68  ->journalOff < h
d570: 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 72 63 20  drOff ){.    rc 
d580: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
d590: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
d5a0: 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31  , pPager->jfd, 1
d5b0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
d5c0: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
d5d0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
d5e0: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
d5f0: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
d600: 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
d610: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d620: 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20  ff < szJ ){.    
d630: 75 33 32 20 6e 4a 52 65 63 3b 20 20 20 20 20 20  u32 nJRec;      
d640: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
d650: 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20  Journal Records 
d660: 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79  */.    u32 dummy
d670: 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  ;.    rc = readJ
d680: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
d690: 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26  , szJ, &nJRec, &
d6a0: 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28 20  dummy);.    if( 
d6b0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
d6c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
d6d0: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
d6e0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  ;.      goto end
d6f0: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
d700: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4a      }.    if( nJ
d710: 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Rec==0 ){.      
d720: 6e 4a 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70  nJRec = (szJ - p
d730: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
d740: 66 29 20 2f 20 28 70 50 61 67 65 72 2d 3e 70 61  f) / (pPager->pa
d750: 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20 7d  geSize+8);.    }
d760: 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4a 52 65 63  .    for(i=nJRec
d770: 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70 50 61 67  -1; i>=0 && pPag
d780: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c  er->journalOff <
d790: 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   szJ; i--){.    
d7a0: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
d7b0: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
d7c0: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
d7d0: 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73  fd, 1);.      as
d7e0: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
d7f0: 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 69  _DONE );.      i
d800: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
d810: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74   ) goto end_stmt
d820: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d  _playback;.    }
d830: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
d840: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
d850: 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c  ;.  .end_stmt_pl
d860: 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63  ayback:.  if( rc
d870: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20  ==SQLITE_OK) {. 
d880: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
d890: 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20  alOff = szJ;.   
d8a0: 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61 64   /* pager_reload
d8b0: 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 20  _cache(pPager); 
d8c0: 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
d8d0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
d8e0: 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
d8f0: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
d900: 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61  ory pages that a
d910: 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76  re allowed..*/.v
d920: 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
d930: 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67  SetCachesize(Pag
d940: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
d950: 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d  mxPage){.  if( m
d960: 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20 20  xPage>10 ){.    
d970: 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d  pPager->mxPage =
d980: 20 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65   mxPage;.  }else
d990: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
d9a0: 50 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d  Page = 10;.  }.}
d9b0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74  ../*.** Adjust t
d9c0: 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66  he robustness of
d9d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
d9e0: 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
d9f0: 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20  S crashes.** or 
da00: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62  power failures b
da10: 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e  y changing the n
da20: 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29  umber of syncs()
da30: 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a  s when writing.*
da40: 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
da50: 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61  ournal.  There a
da60: 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a  re three levels:
da70: 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20  .**.**    OFF   
da80: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e      sqlite3OsSyn
da90: 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c  c() is never cal
daa0: 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  led.  This is th
dab0: 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20  e default.**    
dac0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65            for te
dad0: 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e  mporary and tran
dae0: 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a  sient files..**.
daf0: 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20  **    NORMAL    
db00: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
db10: 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72  ynced once befor
db20: 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
db30: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
db40: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20        database. 
db50: 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
db60: 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65  y adequate prote
db70: 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20  ction, but.**   
db80: 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73             it is
db90: 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70   theoretically p
dba0: 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20  ossible, though 
dbb0: 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a  very unlikely,.*
dbc0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
dbd0: 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e  hat an inopertun
dbe0: 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  e power failure 
dbf0: 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20  could leave the 
dc00: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
dc10: 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61          in a sta
dc20: 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63  te which would c
dc30: 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74  ause damage to t
dc40: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
dc50: 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e              when
dc60: 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61   it is rolled ba
dc70: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c  ck..**.**    FUL
dc80: 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  L      The journ
dc90: 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69  al is synced twi
dca0: 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
dcb0: 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
dcd0: 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d  tabase (with som
dce0: 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  e additional inf
dcf0: 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e  ormation - the n
dd00: 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20  Rec field.**    
dd10: 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
dd20: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
dd30: 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  - being written 
dd40: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74  in between the t
dd50: 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  wo.**           
dd60: 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77     syncs).  If w
dd70: 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72  e assume that wr
dd80: 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20  iting a.**      
dd90: 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64          single d
dda0: 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74  isk sector is at
ddb0: 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20  omic, then this 
ddc0: 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a  mode provides.**
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
dde0: 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65  surance that the
ddf0: 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f   journal will no
de00: 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74  t be corrupted t
de10: 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  o the.**        
de20: 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63        point of c
de30: 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f  ausing damage to
de40: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75   the database du
de50: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ring rollback..*
de60: 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c  *.** Numeric val
de70: 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ues associated w
de80: 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73  ith these states
de90: 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52   are OFF==1, NOR
dea0: 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55  MAL=2,.** and FU
deb0: 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  LL=3..*/.#ifndef
dec0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
ded0: 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20  ER_PRAGMAS.void 
dee0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53  sqlite3PagerSetS
def0: 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72  afetyLevel(Pager
df00: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65   *pPager, int le
df10: 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 5f 66 73  vel, int full_fs
df20: 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  ync){.  pPager->
df30: 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d  noSync =  level=
df40: 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =1 || pPager->te
df50: 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
df60: 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76  ->fullSync = lev
df70: 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72  el==3 && !pPager
df80: 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
df90: 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63  ager->full_fsync
dfa0: 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 3b 0a 20   = full_fsync;. 
dfb0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
dfc0: 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65  ync ) pPager->ne
dfd0: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65  edSync = 0;.}.#e
dfe0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
dff0: 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
e000: 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63   variable is inc
e010: 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65  remented wheneve
e020: 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a  r the library.**
e030: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65   attempts to ope
e040: 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
e050: 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  le.  This inform
e060: 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f  ation is used fo
e070: 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  r.** testing and
e080: 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20   analysis only. 
e090: 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49   .*/.#ifdef SQLI
e0a0: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
e0b0: 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
e0c0: 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
e0d0: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d  /*.** Open a tem
e0e0: 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 0a 2a 2a  porary file. .**
e0f0: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69  .** Write the fi
e100: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e  le descriptor in
e110: 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e 20  to *fd.  Return 
e120: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
e130: 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20  cess or some.** 
e140: 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
e150: 20 69 66 20 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a   if we fail..**.
e160: 2a 2a 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61  ** The OS will a
e170: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
e180: 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ete the temporar
e190: 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69  y file when it i
e1a0: 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  s.** closed..*/.
e1b0: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
e1c0: 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  e3PagerOpentemp(
e1d0: 4f 73 46 69 6c 65 20 2a 2a 70 46 64 29 7b 0a 20  OsFile **pFd){. 
e1e0: 20 69 6e 74 20 63 6e 74 20 3d 20 38 3b 0a 20 20   int cnt = 8;.  
e1f0: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a  int rc;.  char z
e200: 46 69 6c 65 5b 53 51 4c 49 54 45 5f 54 45 4d 50  File[SQLITE_TEMP
e210: 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 23 69 66  NAME_SIZE];..#if
e220: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
e230: 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65    sqlite3_opente
e240: 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20  mp_count++;  /* 
e250: 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  Used for testing
e260: 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
e270: 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 64  ly */.#endif.  d
e280: 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20  o{.    cnt--;.  
e290: 20 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46    sqlite3OsTempF
e2a0: 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29 3b 0a  ileName(zFile);.
e2b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e2c0: 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
e2d0: 7a 46 69 6c 65 2c 20 70 46 64 2c 20 31 29 3b 0a  zFile, pFd, 1);.
e2e0: 20 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30 20    }while( cnt>0 
e2f0: 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  && rc!=SQLITE_OK
e300: 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e   && rc!=SQLITE_N
e310: 4f 4d 45 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e  OMEM );.  return
e320: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
e330: 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  eate a new page 
e340: 63 61 63 68 65 20 61 6e 64 20 70 75 74 20 61 20  cache and put a 
e350: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
e360: 61 67 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70  age cache in *pp
e370: 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69  Pager..** The fi
e380: 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 20  le to be cached 
e390: 6e 65 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20  need not exist. 
e3a0: 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   The file is not
e3b0: 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a   locked until.**
e3c0: 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
e3d0: 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  to sqlite3PagerG
e3e0: 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79  et() and is only
e3f0: 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c   held open until
e400: 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67   the.** last pag
e410: 65 20 69 73 20 72 65 6c 65 61 73 65 64 20 75 73  e is released us
e420: 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65 72  ing sqlite3Pager
e430: 55 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  Unref()..**.** I
e440: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
e450: 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f  ULL then a rando
e460: 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72  mly-named tempor
e470: 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61  ary file is crea
e480: 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20  ted.** and used 
e490: 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  as the file to b
e4a0: 65 20 63 61 63 68 65 64 2e 20 20 54 68 65 20 66  e cached.  The f
e4b0: 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65  ile will be dele
e4c0: 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63  ted.** automatic
e4d0: 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20  ally when it is 
e4e0: 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  closed..**.** If
e4f0: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
e500: 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c  memory:" then al
e510: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  l information is
e520: 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a   held in cache..
e530: 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 77  ** It is never w
e540: 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20  ritten to disk. 
e550: 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
e560: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  d to implement a
e570: 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  n.** in-memory d
e580: 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20  atabase..*/.int 
e590: 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
e5a0: 28 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61  (.  Pager **ppPa
e5b0: 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ger,         /* 
e5c0: 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72  Return the Pager
e5d0: 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
e5e0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
e5f0: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a  *zFilename,   /*
e600: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
e610: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
e620: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  en */.  int nExt
e630: 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ra,             
e640: 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20   /* Extra bytes 
e650: 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69  append to each i
e660: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
e670: 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
e680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
e690: 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67  lags controlling
e6a0: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b   this file */.){
e6b0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
e6c0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 46   = 0;.  char *zF
e6d0: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b  ullPathname = 0;
e6e0: 0a 20 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 20  .  int nameLen; 
e6f0: 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 20 69 73 20   /* Compiler is 
e700: 77 72 6f 6e 67 2e 20 54 68 69 73 20 69 73 20 61  wrong. This is a
e710: 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65  lways initialize
e720: 64 20 62 65 66 6f 72 65 20 75 73 65 20 2a 2f 0a  d before use */.
e730: 20 20 4f 73 46 69 6c 65 20 2a 66 64 3b 0a 20 20    OsFile *fd;.  
e740: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
e750: 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  OK;.  int i;.  i
e760: 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b  nt tempFile = 0;
e770: 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30  .  int memDb = 0
e780: 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79  ;.  int readOnly
e790: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a   = 0;.  int useJ
e7a0: 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20  ournal = (flags 
e7b0: 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55  & PAGER_OMIT_JOU
e7c0: 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20  RNAL)==0;.  int 
e7d0: 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c  noReadlock = (fl
e7e0: 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52  ags & PAGER_NO_R
e7f0: 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20 63  EADLOCK)!=0;.  c
e800: 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45  har zTemp[SQLITE
e810: 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b  _TEMPNAME_SIZE];
e820: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
e830: 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
e840: 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41 20 6d  AGEMENT.  /* A m
e850: 61 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74 20 66  alloc() cannot f
e860: 61 69 6c 20 69 6e 20 73 71 6c 69 74 65 33 54 68  ail in sqlite3Th
e870: 72 65 61 64 44 61 74 61 28 29 20 61 73 20 6f 6e  readData() as on
e880: 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20  e or more calls 
e890: 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28  to .  ** malloc(
e8a0: 29 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  ) must have alre
e8b0: 61 64 79 20 62 65 65 6e 20 6d 61 64 65 20 62 79  ady been made by
e8c0: 20 74 68 69 73 20 74 68 72 65 61 64 20 62 65 66   this thread bef
e8d0: 6f 72 65 20 69 74 20 67 65 74 73 0a 20 20 2a 2a  ore it gets.  **
e8e0: 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2e 20   to this point. 
e8f0: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 54  This means the T
e900: 68 72 65 61 64 44 61 74 61 20 6d 75 73 74 20 68  hreadData must h
e910: 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ave been allocat
e920: 65 64 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ed already.  ** 
e930: 73 6f 20 74 68 61 74 20 54 68 72 65 61 64 44 61  so that ThreadDa
e940: 74 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20 62 65  ta.nAlloc can be
e950: 20 73 65 74 2e 20 49 74 20 77 6f 75 6c 64 20 62   set. It would b
e960: 65 20 6e 69 63 65 20 74 6f 20 61 73 73 65 72 74  e nice to assert
e970: 0a 20 20 2a 2a 20 74 68 61 74 20 54 68 72 65 61  .  ** that Threa
e980: 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 69 73 20  dData.nAlloc is 
e990: 6e 6f 6e 2d 7a 65 72 6f 2c 20 62 75 74 20 61 6c  non-zero, but al
e9a0: 61 73 20 74 68 69 73 20 62 72 65 61 6b 73 20 74  as this breaks t
e9b0: 65 73 74 20 63 61 73 65 73 20 0a 20 20 2a 2a 20  est cases .  ** 
e9c0: 77 72 69 74 74 65 6e 20 74 6f 20 69 6e 76 6f 6b  written to invok
e9d0: 65 20 74 68 65 20 70 61 67 65 72 20 64 69 72 65  e the pager dire
e9e0: 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 54 68 72  ctly..  */.  Thr
e9f0: 65 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20  eadData *pTsd = 
ea00: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
ea10: 61 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  a();.  assert( p
ea20: 54 73 64 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Tsd );.#endif.. 
ea30: 20 2f 2a 20 49 66 20 6d 61 6c 6c 6f 63 28 29 20   /* If malloc() 
ea40: 68 61 73 20 61 6c 72 65 61 64 79 20 66 61 69 6c  has already fail
ea50: 65 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ed return SQLITE
ea60: 5f 4e 4f 4d 45 4d 2e 20 42 65 66 6f 72 65 20 65  _NOMEM. Before e
ea70: 76 65 6e 0a 20 20 2a 2a 20 74 65 73 74 69 6e 67  ven.  ** testing
ea80: 20 66 6f 72 20 74 68 69 73 2c 20 73 65 74 20 2a   for this, set *
ea90: 70 70 50 61 67 65 72 20 74 6f 20 4e 55 4c 4c 20  ppPager to NULL 
eaa0: 73 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6b 6e  so the caller kn
eab0: 6f 77 73 20 74 68 65 20 70 61 67 65 72 0a 20 20  ows the pager.  
eac0: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 77 61 73  ** structure was
ead0: 20 6e 65 76 65 72 20 61 6c 6c 6f 63 61 74 65 64   never allocated
eae0: 2e 20 0a 20 20 2a 2f 0a 20 20 2a 70 70 50 61 67  . .  */.  *ppPag
eaf0: 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71  er = 0;.  if( sq
eb00: 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65  lite3MallocFaile
eb10: 64 28 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  d() ){.    retur
eb20: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
eb30: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 66 64    }.  memset(&fd
eb40: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 64 29 29  , 0, sizeof(fd))
eb50: 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
eb60: 20 70 61 67 65 72 20 66 69 6c 65 20 61 6e 64 20   pager file and 
eb70: 73 65 74 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  set zFullPathnam
eb80: 65 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 6d 61  e to point at ma
eb90: 6c 6c 6f 63 28 29 65 64 20 0a 20 20 2a 2a 20 6d  lloc()ed .  ** m
eba0: 65 6d 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  emory containing
ebb0: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 66 69   the complete fi
ebc0: 6c 65 6e 61 6d 65 20 28 69 2e 65 2e 20 69 6e 63  lename (i.e. inc
ebd0: 6c 75 64 69 6e 67 20 74 68 65 20 64 69 72 65 63  luding the direc
ebe0: 74 6f 72 79 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  tory)..  */.  if
ebf0: 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
ec00: 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23  Filename[0] ){.#
ec10: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ec20: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20  IT_MEMORYDB.    
ec30: 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  if( strcmp(zFile
ec40: 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29  name,":memory:")
ec50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ==0 ){.      mem
ec60: 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 46  Db = 1;.      zF
ec70: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
ec80: 6c 69 74 65 53 74 72 44 75 70 28 22 22 29 3b 0a  liteStrDup("");.
ec90: 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
eca0: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 46 75  .    {.      zFu
ecb0: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
ecc0: 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
ecd0: 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
ece0: 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 50 61       if( zFullPa
ecf0: 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
ed00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
ed10: 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 7a 46  OpenReadWrite(zF
ed20: 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66 64  ullPathname, &fd
ed30: 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20  , &readOnly);.  
ed40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
ed50: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
ed60: 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65  lite3PagerOpente
ed70: 6d 70 28 26 66 64 29 3b 0a 20 20 20 20 73 71 6c  mp(&fd);.    sql
ed80: 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61  ite3OsTempFileNa
ed90: 6d 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 7a  me(zTemp);.    z
eda0: 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 54 65 6d 70  Filename = zTemp
edb0: 3b 0a 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e  ;.    zFullPathn
edc0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  ame = sqlite3OsF
edd0: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c  ullPathname(zFil
ede0: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  ename);.    if( 
edf0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
ee00: 0a 20 20 20 20 20 20 74 65 6d 70 46 69 6c 65 20  .      tempFile 
ee10: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
ee20: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    /* Allocate th
ee30: 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
ee40: 65 2e 20 41 73 20 70 61 72 74 20 6f 66 20 74 68  e. As part of th
ee50: 65 20 73 61 6d 65 20 61 6c 6c 6f 63 61 74 69 6f  e same allocatio
ee60: 6e 2c 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a  n, allocate.  **
ee70: 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 66   space for the f
ee80: 75 6c 6c 20 70 61 74 68 73 20 6f 66 20 74 68 65  ull paths of the
ee90: 20 66 69 6c 65 2c 20 64 69 72 65 63 74 6f 72 79   file, directory
eea0: 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 0a 20 20   and journal .  
eeb0: 2a 2a 20 28 50 61 67 65 72 2e 7a 46 69 6c 65 6e  ** (Pager.zFilen
eec0: 61 6d 65 2c 20 50 61 67 65 72 2e 7a 44 69 72 65  ame, Pager.zDire
eed0: 63 74 6f 72 79 20 61 6e 64 20 50 61 67 65 72 2e  ctory and Pager.
eee0: 7a 4a 6f 75 72 6e 61 6c 29 2e 0a 20 20 2a 2f 0a  zJournal)..  */.
eef0: 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e    if( zFullPathn
ef00: 61 6d 65 20 29 7b 0a 20 20 20 20 6e 61 6d 65 4c  ame ){.    nameL
ef10: 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6c  en = strlen(zFul
ef20: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
ef30: 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 4d  pPager = sqliteM
ef40: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
ef50: 50 61 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65 6e  Pager) + nameLen
ef60: 2a 33 20 2b 20 33 30 20 29 3b 0a 20 20 20 20 69  *3 + 30 );.    i
ef70: 66 28 20 70 50 61 67 65 72 20 26 26 20 72 63 3d  f( pPager && rc=
ef80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
ef90: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70      pPager->pTmp
efa0: 53 70 61 63 65 20 3d 20 28 63 68 61 72 20 2a 29  Space = (char *)
efb0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
efc0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
efd0: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d  AGE_SIZE);.    }
efe0: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 61  .  }...  /* If a
eff0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20  n error occured 
f000: 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  in either of the
f010: 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66   blocks above, f
f020: 72 65 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 0a  ree the memory .
f030: 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20    ** pointed to 
f040: 62 79 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  by zFullPathname
f050: 2c 20 66 72 65 65 20 74 68 65 20 50 61 67 65 72  , free the Pager
f060: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 63   structure and c
f070: 6c 6f 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66  lose the .  ** f
f080: 69 6c 65 2e 20 53 69 6e 63 65 20 74 68 65 20 70  ile. Since the p
f090: 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  ager is not allo
f0a0: 63 61 74 65 64 20 74 68 65 72 65 20 69 73 20 6e  cated there is n
f0b0: 6f 20 6e 65 65 64 20 74 6f 20 73 65 74 20 0a 20  o need to set . 
f0c0: 20 2a 2a 20 61 6e 79 20 50 61 67 65 72 2e 65 72   ** any Pager.er
f0d0: 72 4d 61 73 6b 20 76 61 72 69 61 62 6c 65 73 2e  rMask variables.
f0e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61  .  */.  if( !pPa
f0f0: 67 65 72 20 7c 7c 20 21 7a 46 75 6c 6c 50 61 74  ger || !zFullPat
f100: 68 6e 61 6d 65 20 7c 7c 20 21 70 50 61 67 65 72  hname || !pPager
f110: 2d 3e 70 54 6d 70 53 70 61 63 65 20 7c 7c 20 72  ->pTmpSpace || r
f120: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
f130: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
f140: 73 65 28 26 66 64 29 3b 0a 20 20 20 20 73 71 6c  se(&fd);.    sql
f150: 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74  iteFree(zFullPat
f160: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  hname);.    sqli
f170: 74 65 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a  teFree(pPager);.
f180: 20 20 20 20 72 65 74 75 72 6e 20 28 28 72 63 3d      return ((rc=
f190: 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c 49  =SQLITE_OK)?SQLI
f1a0: 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20 20  TE_NOMEM:rc);.  
f1b0: 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 33  }..  PAGERTRACE3
f1c0: 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c  ("OPEN %d %s\n",
f1d0: 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64   FILEHANDLEID(fd
f1e0: 29 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ), zFullPathname
f1f0: 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f  );.  IOTRACE(("O
f200: 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50  PEN %p %s\n", pP
f210: 61 67 65 72 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  ager, zFullPathn
f220: 61 6d 65 29 29 0a 20 20 70 50 61 67 65 72 2d 3e  ame)).  pPager->
f230: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61  zFilename = (cha
f240: 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20  r*)&pPager[1];. 
f250: 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
f260: 6f 72 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  ory = &pPager->z
f270: 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e  Filename[nameLen
f280: 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  +1];.  pPager->z
f290: 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65  Journal = &pPage
f2a0: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 61  r->zDirectory[na
f2b0: 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74 72 63  meLen+1];.  strc
f2c0: 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  py(pPager->zFile
f2d0: 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  name, zFullPathn
f2e0: 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28 70  ame);.  strcpy(p
f2f0: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
f300: 79 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  y, zFullPathname
f310: 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 6e 61 6d 65  );..  for(i=name
f320: 4c 65 6e 3b 20 69 3e 30 20 26 26 20 70 50 61 67  Len; i>0 && pPag
f330: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69  er->zDirectory[i
f340: 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d  -1]!='/'; i--){}
f350: 0a 20 20 69 66 28 20 69 3e 30 20 29 20 70 50 61  .  if( i>0 ) pPa
f360: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b  ger->zDirectory[
f370: 69 2d 31 5d 20 3d 20 30 3b 0a 20 20 73 74 72 63  i-1] = 0;.  strc
f380: 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  py(pPager->zJour
f390: 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  nal, zFullPathna
f3a0: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  me);.  sqliteFre
f3b0: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
f3c0: 3b 0a 20 20 73 74 72 63 70 79 28 26 70 50 61 67  ;.  strcpy(&pPag
f3d0: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d  er->zJournal[nam
f3e0: 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c  eLen], "-journal
f3f0: 22 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64  ");.  pPager->fd
f400: 20 3d 20 66 64 3b 0a 20 20 2f 2a 20 70 50 61 67   = fd;.  /* pPag
f410: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
f420: 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
f430: 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75  ->useJournal = u
f440: 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d 65  seJournal && !me
f450: 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  mDb;.  pPager->n
f460: 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65  oReadlock = noRe
f470: 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e  adlock && readOn
f480: 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  ly;.  /* pPager-
f490: 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a  >stmtOpen = 0; *
f4a0: 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
f4b0: 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f  tmtInUse = 0; */
f4c0: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52  .  /* pPager->nR
f4d0: 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  ef = 0; */.  pPa
f4e0: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 65  ger->dbSize = me
f4f0: 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d  mDb-1;.  pPager-
f500: 3e 70 61 67 65 53 69 7a 65 20 3d 20 53 51 4c 49  >pageSize = SQLI
f510: 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
f520: 53 49 5a 45 3b 0a 20 20 2f 2a 20 70 50 61 67 65  SIZE;.  /* pPage
f530: 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b  r->stmtSize = 0;
f540: 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
f550: 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20  >stmtJSize = 0; 
f560: 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
f570: 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  nPage = 0; */.  
f580: 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50  /* pPager->nMaxP
f590: 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  age = 0; */.  pP
f5a0: 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31  ager->mxPage = 1
f5b0: 30 30 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41  00;.  assert( PA
f5c0: 47 45 52 5f 55 4e 4c 4f 43 4b 3d 3d 30 20 29 3b  GER_UNLOCK==0 );
f5d0: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
f5e0: 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
f5f0: 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67  CK; */.  /* pPag
f600: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b  er->errMask = 0;
f610: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65   */.  pPager->te
f620: 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c  mpFile = tempFil
f630: 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d  e;.  pPager->mem
f640: 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20 70 50  Db = memDb;.  pP
f650: 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d  ager->readOnly =
f660: 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20   readOnly;.  /* 
f670: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
f680: 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
f690: 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67  r->noSync = pPag
f6a0: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20  er->tempFile || 
f6b0: 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70  !useJournal;.  p
f6c0: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
f6d0: 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  = (pPager->noSyn
f6e0: 63 3f 30 3a 31 29 3b 0a 20 20 2f 2a 20 70 50 61  c?0:1);.  /* pPa
f6f0: 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b  ger->pFirst = 0;
f700: 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
f710: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
f720: 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
f730: 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f  r->pLast = 0; */
f740: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  .  pPager->nExtr
f750: 61 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d  a = FORCE_ALIGNM
f760: 45 4e 54 28 6e 45 78 74 72 61 29 3b 0a 20 20 61  ENT(nExtra);.  a
f770: 73 73 65 72 74 28 66 64 7c 7c 6d 65 6d 44 62 29  ssert(fd||memDb)
f780: 3b 0a 20 20 69 66 28 20 21 6d 65 6d 44 62 20 29  ;.  if( !memDb )
f790: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  {.    pPager->se
f7a0: 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
f7b0: 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 66  e3OsSectorSize(f
f7c0: 64 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61  d);.  }.  /* pPa
f7d0: 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
f7e0: 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d  r = 0; */.  /* m
f7f0: 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48  emset(pPager->aH
f800: 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ash, 0, sizeof(p
f810: 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20  Pager->aHash)); 
f820: 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  */.  *ppPager = 
f830: 70 50 61 67 65 72 3b 0a 23 69 66 64 65 66 20 53  pPager;.#ifdef S
f840: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
f850: 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
f860: 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 20 3d   pPager->pNext =
f870: 20 70 54 73 64 2d 3e 70 50 61 67 65 72 3b 0a 20   pTsd->pPager;. 
f880: 20 70 54 73 64 2d 3e 70 50 61 67 65 72 20 3d 20   pTsd->pPager = 
f890: 70 50 61 67 65 72 3b 0a 23 65 6e 64 69 66 0a 20  pPager;.#endif. 
f8a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
f8b0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
f8c0: 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
f8d0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   function..*/.vo
f8e0: 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
f8f0: 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 50 61  etBusyhandler(Pa
f900: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 42 75 73  ger *pPager, Bus
f910: 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48  yHandler *pBusyH
f920: 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61 67 65  andler){.  pPage
f930: 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20  r->pBusyHandler 
f940: 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a  = pBusyHandler;.
f950: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
f960: 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   destructor for 
f970: 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20  this pager.  If 
f980: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65  not NULL, the de
f990: 73 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c 6c  structor is call
f9a0: 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 72  ed.** when the r
f9b0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
f9c0: 6e 20 65 61 63 68 20 70 61 67 65 20 72 65 61 63  n each page reac
f9d0: 68 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 64  hes zero.  The d
f9e0: 65 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a  estructor can.**
f9f0: 20 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65 61   be used to clea
fa00: 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  n up information
fa10: 20 69 6e 20 74 68 65 20 65 78 74 72 61 20 73 65   in the extra se
fa20: 67 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74  gment appended t
fa30: 6f 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a  o each page..**.
fa40: 2a 2a 20 54 68 65 20 64 65 73 74 72 75 63 74 6f  ** The destructo
fa50: 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20  r is not called 
fa60: 61 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c 69  as a result sqli
fa70: 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e  te3PagerClose().
fa80: 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72    .** Destructor
fa90: 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65  s are only calle
faa0: 64 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65  d by sqlite3Page
fab0: 72 55 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69  rUnref()..*/.voi
fac0: 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
fad0: 74 44 65 73 74 72 75 63 74 6f 72 28 50 61 67 65  tDestructor(Page
fae0: 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
faf0: 28 2a 78 44 65 73 63 29 28 44 62 50 61 67 65 2a  (*xDesc)(DbPage*
fb00: 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72  ,int)){.  pPager
fb10: 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20  ->xDestructor = 
fb20: 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xDesc;.}../*.** 
fb30: 53 65 74 20 74 68 65 20 72 65 69 6e 69 74 69 61  Set the reinitia
fb40: 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70  lizer for this p
fb50: 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55  ager.  If not NU
fb60: 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61  LL, the reinitia
fb70: 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c  lizer.** is call
fb80: 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74  ed when the cont
fb90: 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ent of a page in
fba0: 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72   cache is restor
fbb0: 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
fbc0: 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61  al.** value as a
fbd0: 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c   result of a rol
fbe0: 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c  lback.  The call
fbf0: 62 61 63 6b 20 67 69 76 65 73 20 68 69 67 68 65  back gives highe
fc00: 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20  r-level code.** 
fc10: 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  an opportunity t
fc20: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 45 58  o restore the EX
fc30: 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61  TRA section to a
fc40: 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65  gree with the re
fc50: 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64  stored.** page d
fc60: 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ata..*/.void sql
fc70: 69 74 65 33 50 61 67 65 72 53 65 74 52 65 69 6e  ite3PagerSetRein
fc80: 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  iter(Pager *pPag
fc90: 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  er, void (*xRein
fca0: 69 74 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29  it)(DbPage*,int)
fcb0: 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65  ){.  pPager->xRe
fcc0: 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74  initer = xReinit
fcd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
fce0: 68 65 20 70 61 67 65 20 73 69 7a 65 2e 20 20 52  he page size.  R
fcf0: 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 73 69  eturn the new si
fd00: 7a 65 2e 20 20 49 66 20 74 68 65 20 73 75 67 67  ze.  If the sugg
fd10: 65 73 74 20 6e 65 77 20 70 61 67 65 0a 2a 2a 20  est new page.** 
fd20: 73 69 7a 65 20 69 73 20 69 6e 61 70 70 72 6f 70  size is inapprop
fd30: 72 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20 61  riate, then an a
fd40: 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67 65 20  lternative page 
fd50: 73 69 7a 65 20 69 73 20 73 65 6c 65 63 74 65 64  size is selected
fd60: 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 65 64  .** and returned
fd70: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
fd80: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
fd90: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
fda0: 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20  int pageSize){. 
fdb0: 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a   assert( pageSiz
fdc0: 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
fdd0: 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
fde0: 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 69 66  AGE_SIZE );.  if
fdf0: 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  ( !pPager->memDb
fe00: 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   && pPager->nRef
fe10: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 61 67 65 72  ==0 ){.    pager
fe20: 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
fe30: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
fe40: 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
fe50: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d  .    pPager->pTm
fe60: 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33  pSpace = sqlite3
fe70: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50  ReallocOrFree(pP
fe80: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 2c  ager->pTmpSpace,
fe90: 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a   pageSize);.  }.
fea0: 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
feb0: 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a  >pageSize;.}../*
fec0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
fed0: 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65  g set of routine
fee0: 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69  s are used to di
fef0: 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61  sable the simula
ff00: 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72  ted.** I/O error
ff10: 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65   mechanism.  The
ff20: 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
ff30: 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69  used to avoid si
ff40: 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72  mulated.** error
ff50: 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72  s in places wher
ff60: 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  e we do not care
ff70: 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a   about errors..*
ff80: 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51  *.** Unless -DSQ
ff90: 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75  LITE_TEST=1 is u
ffa0: 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69  sed, these routi
ffb0: 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f  nes are all no-o
ffc0: 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61  ps.** and genera
ffd0: 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23  te no code..*/.#
ffe0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
fff0: 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  T.extern int sql
10000 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
10010 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e  nding;.extern in
10020 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  t sqlite3_io_err
10030 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69  or_hit;.static i
10040 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f  nt saved_cnt;.vo
10050 69 64 20 63 6c 65 61 72 5f 73 69 6d 75 6c 61 74  id clear_simulat
10060 65 64 5f 69 6f 5f 65 72 72 6f 72 28 29 7b 0a 20  ed_io_error(){. 
10070 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
10080 72 5f 68 69 74 20 3d 20 30 3b 0a 7d 0a 76 6f 69  r_hit = 0;.}.voi
10090 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  d disable_simula
100a0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
100b0 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74  id){.  saved_cnt
100c0 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72   = sqlite3_io_er
100d0 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73  ror_pending;.  s
100e0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
100f0 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a  pending = -1;.}.
10100 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75  void enable_simu
10110 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
10120 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
10130 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
10140 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d  g = saved_cnt;.}
10150 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
10160 63 6c 65 61 72 5f 73 69 6d 75 6c 61 74 65 64 5f  clear_simulated_
10170 69 6f 5f 65 72 72 6f 72 28 29 0a 23 20 64 65 66  io_error().# def
10180 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ine disable_simu
10190 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
101a0 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c  ).# define enabl
101b0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
101c0 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a  rrors().#endif..
101d0 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66  /*.** Read the f
101e0 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f  irst N bytes fro
101f0 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  m the beginning 
10200 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f  of the file into
10210 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20   memory.** that 
10220 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e  pDest points to.
10230 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72   .**.** No error
10240 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e   checking is don
10250 65 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 20  e. The rational 
10260 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74  for this is that
10270 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a   this function .
10280 2a 2a 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  ** may be called
10290 20 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 6c   even if the fil
102a0 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
102b0 20 6f 72 20 63 6f 6e 74 61 69 6e 20 61 20 68 65   or contain a he
102c0 61 64 65 72 2e 20 49 6e 20 0a 2a 2a 20 74 68 65  ader. In .** the
102d0 73 65 20 63 61 73 65 73 20 73 71 6c 69 74 65 33  se cases sqlite3
102e0 4f 73 52 65 61 64 28 29 20 77 69 6c 6c 20 72 65  OsRead() will re
102f0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2c 20 74  turn an error, t
10300 6f 20 77 68 69 63 68 20 74 68 65 20 63 6f 72 72  o which the corr
10310 65 63 74 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 65  ect .** response
10320 20 69 73 20 74 6f 20 7a 65 72 6f 20 74 68 65 20   is to zero the 
10330 6d 65 6d 6f 72 79 20 61 74 20 70 44 65 73 74 20  memory at pDest 
10340 61 6e 64 20 63 6f 6e 74 69 6e 75 65 2e 20 20 41  and continue.  A
10350 20 72 65 61 6c 20 49 4f 20 65 72 72 6f 72 20 0a   real IO error .
10360 2a 2a 20 77 69 6c 6c 20 70 72 65 73 75 6d 61 62  ** will presumab
10370 6c 79 20 72 65 63 75 72 20 61 6e 64 20 62 65 20  ly recur and be 
10380 70 69 63 6b 65 64 20 75 70 20 6c 61 74 65 72 20  picked up later 
10390 28 54 6f 64 6f 3a 20 54 68 69 6e 6b 20 61 62 6f  (Todo: Think abo
103a0 75 74 20 74 68 69 73 29 2e 0a 2a 2f 0a 69 6e 74  ut this)..*/.int
103b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61   sqlite3PagerRea
103c0 64 46 69 6c 65 68 65 61 64 65 72 28 50 61 67 65  dFileheader(Page
103d0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e  r *pPager, int N
103e0 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
103f0 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72  *pDest){.  int r
10400 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
10410 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30   memset(pDest, 0
10420 2c 20 4e 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  , N);.  if( MEMD
10430 42 3d 3d 30 20 29 7b 0a 20 20 20 20 64 69 73 61  B==0 ){.    disa
10440 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
10450 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73  _errors();.    s
10460 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
10470 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20  ger->fd, 0);.   
10480 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
10490 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
104a0 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 48     IOTRACE(("DBH
104b0 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70  DR %p 0 %d\n", p
104c0 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72  Pager, N)).    r
104d0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
104e0 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44  d(pPager->fd, pD
104f0 65 73 74 2c 20 4e 29 3b 0a 20 20 20 20 69 66 28  est, N);.    if(
10500 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
10510 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
10520 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
10530 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
10540 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10550 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
10560 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
10570 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 69   pages in the di
10580 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74  sk file associat
10590 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65  ed with.** pPage
105a0 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  r. .**.** If the
105b0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69   PENDING_BYTE li
105c0 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 64  es on the page d
105d0 69 72 65 63 74 6c 79 20 61 66 74 65 72 20 74 68  irectly after th
105e0 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
105f0 66 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69  file, then consi
10600 64 65 72 20 74 68 69 73 20 70 61 67 65 20 70 61  der this page pa
10610 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  rt of the file t
10620 6f 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  oo. For example,
10630 20 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42   if.** PENDING_B
10640 59 54 45 20 69 73 20 62 79 74 65 20 34 30 39 36  YTE is byte 4096
10650 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65   (the first byte
10660 20 6f 66 20 70 61 67 65 20 35 29 20 61 6e 64 20   of page 5) and 
10670 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
10680 2a 2a 20 66 69 6c 65 20 69 73 20 34 30 39 36 20  ** file is 4096 
10690 62 79 74 65 73 2c 20 35 20 69 73 20 72 65 74 75  bytes, 5 is retu
106a0 72 6e 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  rned instead of 
106b0 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  4..*/.int sqlite
106c0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
106d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
106e0 20 20 69 36 34 20 6e 3b 0a 20 20 69 6e 74 20 72    i64 n;.  int r
106f0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  c;.  assert( pPa
10700 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ger!=0 );.  if( 
10710 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
10720 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
10730 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
10740 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a  r->dbSize>=0 ){.
10750 20 20 20 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e      n = pPager->
10760 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65  dbSize;.  } else
10770 20 7b 0a 20 20 20 20 69 66 28 20 28 72 63 20 3d   {.    if( (rc =
10780 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
10790 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
107a0 6e 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  n))!=SQLITE_OK )
107b0 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  {.      pager_er
107c0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
107d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
107e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
107f0 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e  >0 && n<pPager->
10800 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
10810 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c    n = 1;.    }el
10820 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d 20 70  se{.      n /= p
10830 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
10840 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
10850 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
10860 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
10870 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
10880 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20  ze = n;.    }.  
10890 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44  }.  if( n==(PEND
108a0 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d  ING_BYTE/pPager-
108b0 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20  >pageSize) ){.  
108c0 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74    n++;.  }.  ret
108d0 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  urn n;.}...#ifnd
108e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
108f0 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 43 6c  EMORYDB./*.** Cl
10900 65 61 72 20 61 20 50 67 48 69 73 74 6f 72 79 20  ear a PgHistory 
10910 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20  block.*/.static 
10920 76 6f 69 64 20 63 6c 65 61 72 48 69 73 74 6f 72  void clearHistor
10930 79 28 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69  y(PgHistory *pHi
10940 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65  st){.  sqliteFre
10950 65 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 29 3b  e(pHist->pOrig);
10960 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48  .  sqliteFree(pH
10970 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 70  ist->pStmt);.  p
10980 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30 3b  Hist->pOrig = 0;
10990 0a 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  .  pHist->pStmt 
109a0 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  = 0;.}.#else.#de
109b0 66 69 6e 65 20 63 6c 65 61 72 48 69 73 74 6f 72  fine clearHistor
109c0 79 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y(x).#endif../*.
109d0 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
109e0 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
109f0 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
10a00 28 50 61 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  (Pager*);../*.**
10a10 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d   Unlink pPg from
10a20 20 69 74 27 73 20 68 61 73 68 20 63 68 61 69 6e   it's hash chain
10a30 2e 20 41 6c 73 6f 20 73 65 74 20 74 68 65 20 70  . Also set the p
10a40 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 30 20  age number to 0 
10a50 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20 74  to indicate.** t
10a60 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
10a70 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 79 20  not part of any 
10a80 68 61 73 68 20 63 68 61 69 6e 2e 20 54 68 69 73  hash chain. This
10a90 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 63   is required bec
10aa0 61 75 73 65 20 74 68 65 0a 2a 2a 20 73 71 6c 69  ause the.** sqli
10ab0 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
10ac0 28 29 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 6c  () routine can l
10ad0 65 61 76 65 20 61 20 70 61 67 65 20 69 6e 20 74  eave a page in t
10ae0 68 65 20 0a 2a 2a 20 70 4e 65 78 74 46 72 65 65  he .** pNextFree
10af0 2f 70 50 72 65 76 46 72 65 65 20 6c 69 73 74 20  /pPrevFree list 
10b00 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70 61  that is not a pa
10b10 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68 2d 63  rt of any hash-c
10b20 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hain..*/.static 
10b30 76 6f 69 64 20 75 6e 6c 69 6e 6b 48 61 73 68 43  void unlinkHashC
10b40 68 61 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  hain(Pager *pPag
10b50 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b  er, PgHdr *pPg){
10b60 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f  .  if( pPg->pgno
10b70 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
10b80 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  t( pPg->pNextHas
10b90 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 50 72  h==0 && pPg->pPr
10ba0 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
10bb0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
10bc0 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  f( pPg->pNextHas
10bd0 68 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  h ){.    pPg->pN
10be0 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61  extHash->pPrevHa
10bf0 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48  sh = pPg->pPrevH
10c00 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ash;.  }.  if( p
10c10 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 29 7b  Pg->pPrevHash ){
10c20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
10c30 67 65 72 2d 3e 61 48 61 73 68 5b 70 50 67 2d 3e  ger->aHash[pPg->
10c40 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e  pgno & (pPager->
10c50 6e 48 61 73 68 2d 31 29 5d 21 3d 70 50 67 20 29  nHash-1)]!=pPg )
10c60 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  ;.    pPg->pPrev
10c70 48 61 73 68 2d 3e 70 4e 65 78 74 48 61 73 68 20  Hash->pNextHash 
10c80 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  = pPg->pNextHash
10c90 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
10ca0 6e 74 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  nt h = pPg->pgno
10cb0 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
10cc0 68 2d 31 29 3b 0a 20 20 20 20 70 50 61 67 65 72  h-1);.    pPager
10cd0 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
10ce0 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d  ->pNextHash;.  }
10cf0 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
10d00 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79      clearHistory
10d10 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  (PGHDR_TO_HIST(p
10d20 50 67 2c 20 70 50 61 67 65 72 29 29 3b 0a 20 20  Pg, pPager));.  
10d30 7d 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20  }.  pPg->pgno = 
10d40 30 3b 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  0;.  pPg->pNextH
10d50 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ash = pPg->pPrev
10d60 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Hash = 0;.}../*.
10d70 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61 67 65  ** Unlink a page
10d80 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c   from the free l
10d90 69 73 74 20 28 74 68 65 20 6c 69 73 74 20 6f 66  ist (the list of
10da0 20 61 6c 6c 20 70 61 67 65 73 20 77 68 65 72 65   all pages where
10db0 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64   nRef==0).** and
10dc0 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63   from its hash c
10dd0 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e 0a  ollision chain..
10de0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
10df0 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48 64 72 20  nlinkPage(PgHdr 
10e00 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
10e10 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
10e20 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70  ager;..  /* Keep
10e30 20 74 68 65 20 70 46 69 72 73 74 53 79 6e 63 65   the pFirstSynce
10e40 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69  d pointer pointi
10e50 6e 67 20 61 74 20 74 68 65 20 66 69 72 73 74 20  ng at the first 
10e60 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20 70 61 67  synchronized pag
10e70 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d  e */.  if( pPg==
10e80 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
10e90 6e 63 65 64 20 29 7b 0a 20 20 20 20 50 67 48 64  nced ){.    PgHd
10ea0 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78  r *p = pPg->pNex
10eb0 74 46 72 65 65 3b 0a 20 20 20 20 77 68 69 6c 65  tFree;.    while
10ec0 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79  ( p && p->needSy
10ed0 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65  nc ){ p = p->pNe
10ee0 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 70 50  xtFree; }.    pP
10ef0 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
10f00 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20 2f  ed = p;.  }..  /
10f10 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68  * Unlink from th
10f20 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
10f30 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72  if( pPg->pPrevFr
10f40 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70  ee ){.    pPg->p
10f50 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46  PrevFree->pNextF
10f60 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ree = pPg->pNext
10f70 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Free;.  }else{. 
10f80 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
10f90 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67 20 29  r->pFirst==pPg )
10fa0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46  ;.    pPager->pF
10fb0 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  irst = pPg->pNex
10fc0 74 46 72 65 65 3b 0a 20 20 7d 0a 20 20 69 66 28  tFree;.  }.  if(
10fd0 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20   pPg->pNextFree 
10fe0 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  ){.    pPg->pNex
10ff0 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65  tFree->pPrevFree
11000 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
11010 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
11020 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
11030 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20  pLast==pPg );.  
11040 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20    pPager->pLast 
11050 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
11060 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65  ;.  }.  pPg->pNe
11070 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50  xtFree = pPg->pP
11080 72 65 76 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20  revFree = 0;..  
11090 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74  /* Unlink from t
110a0 68 65 20 70 67 6e 6f 20 68 61 73 68 20 74 61 62  he pgno hash tab
110b0 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61  le */.  unlinkHa
110c0 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20  shChain(pPager, 
110d0 70 50 67 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  pPg);.}..#ifndef
110e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
110f0 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ORYDB./*.** This
11100 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
11110 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61 6e 20   to truncate an 
11120 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
11130 73 65 2e 20 20 44 65 6c 65 74 65 0a 2a 2a 20 61  se.  Delete.** a
11140 6c 6c 20 70 61 67 65 73 20 77 68 6f 73 65 20 70  ll pages whose p
11150 67 6e 6f 20 69 73 20 6c 61 72 67 65 72 20 74 68  gno is larger th
11160 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  an pPager->dbSiz
11170 65 20 61 6e 64 20 69 73 20 75 6e 72 65 66 65 72  e and is unrefer
11180 65 6e 63 65 64 2e 0a 2a 2a 20 52 65 66 65 72 65  enced..** Refere
11190 6e 63 65 64 20 70 61 67 65 73 20 6c 61 72 67 65  nced pages large
111a0 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64  r than pPager->d
111b0 62 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64  bSize are zeroed
111c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
111d0 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28   memoryTruncate(
111e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
111f0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
11200 50 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20  PgHdr **ppPg;.  
11210 69 6e 74 20 64 62 53 69 7a 65 20 3d 20 70 50 61  int dbSize = pPa
11220 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20  ger->dbSize;..  
11230 70 70 50 67 20 3d 20 26 70 50 61 67 65 72 2d 3e  ppPg = &pPager->
11240 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28  pAll;.  while( (
11250 70 50 67 20 3d 20 2a 70 70 50 67 29 21 3d 30 20  pPg = *ppPg)!=0 
11260 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  ){.    if( pPg->
11270 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a  pgno<=dbSize ){.
11280 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50        ppPg = &pP
11290 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
112a0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 67 2d 3e   }else if( pPg->
112b0 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 20 20  nRef>0 ){.      
112c0 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
112d0 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50  DATA(pPg), 0, pP
112e0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
112f0 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70  .      ppPg = &p
11300 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
11310 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
11320 70 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78  ppPg = pPg->pNex
11330 74 41 6c 6c 3b 0a 20 20 20 20 20 20 75 6e 6c 69  tAll;.      unli
11340 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  nkPage(pPg);.   
11350 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
11360 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  );.      sqliteF
11370 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ree(pPg);.      
11380 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b  pPager->nPage--;
11390 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c  .    }.  }.}.#el
113a0 73 65 0a 23 64 65 66 69 6e 65 20 6d 65 6d 6f 72  se.#define memor
113b0 79 54 72 75 6e 63 61 74 65 28 70 29 0a 23 65 6e  yTruncate(p).#en
113c0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  dif../*.** Try t
113d0 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  o obtain a lock 
113e0 6f 6e 20 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f  on a file.  Invo
113f0 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ke the busy call
11400 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b  back if the lock
11410 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79  .** is currently
11420 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
11430 20 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68   Repeat until th
11440 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
11450 72 65 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65  returns.** false
11460 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f   or until the lo
11470 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a  ck succeeds..**.
11480 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
11490 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61  _OK on success a
114a0 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
114b0 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62   if we cannot ob
114c0 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  tain.** the lock
114d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
114e0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
114f0 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
11500 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
11510 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
11520 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c   The OS lock val
11530 75 65 73 20 6d 75 73 74 20 62 65 20 74 68 65 20  ues must be the 
11540 73 61 6d 65 20 61 73 20 74 68 65 20 50 61 67 65  same as the Page
11550 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f  r lock values */
11560 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
11570 5f 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f  _SHARED==SHARED_
11580 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
11590 28 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ( PAGER_RESERVED
115a0 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
115b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
115c0 45 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58  ER_EXCLUSIVE==EX
115d0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
115e0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c  .  /* If the fil
115f0 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  e is currently u
11600 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20 74 68 65  nlocked then the
11610 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 75 6e   size must be un
11620 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72  known */.  asser
11630 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
11640 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c  >=PAGER_SHARED |
11650 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
11660 3c 30 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 0a  <0 || MEMDB );..
11670 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
11680 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ate>=locktype ){
11690 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
116a0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
116b0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20    do {.      rc 
116c0 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
116d0 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b  pPager->fd, lock
116e0 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c  type);.    }whil
116f0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
11700 53 59 20 26 26 20 73 71 6c 69 74 65 33 49 6e 76  SY && sqlite3Inv
11710 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70  okeBusyHandler(p
11720 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
11730 6c 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ler) );.    if( 
11740 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
11750 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
11760 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  tate = locktype;
11770 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
11780 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  "LOCK %p %d\n", 
11790 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65  pPager, locktype
117a0 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  )).    }.  }.  r
117b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
117c0 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  ** Truncate the 
117d0 66 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d 62  file to the numb
117e0 65 72 20 6f 66 20 70 61 67 65 73 20 73 70 65 63  er of pages spec
117f0 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ified..*/.int sq
11800 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
11810 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
11820 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
11830 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
11840 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
11850 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c  >=PAGER_SHARED |
11860 7c 20 4d 45 4d 44 42 20 29 3b 0a 20 20 73 71 6c  | MEMDB );.  sql
11870 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
11880 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  nt(pPager);.  if
11890 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
118a0 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50  e ){.    rc = pP
118b0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
118c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
118d0 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 3d 28  }.  if( nPage>=(
118e0 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d  unsigned)pPager-
118f0 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  >dbSize ){.    r
11900 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11910 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42  .  }.  if( MEMDB
11920 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
11930 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  dbSize = nPage;.
11940 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61      memoryTrunca
11950 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  te(pPager);.    
11960 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11970 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 79 6e  ;.  }.  rc = syn
11980 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
11990 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
119a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
119b0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
119c0 2a 20 47 65 74 20 61 6e 20 65 78 63 6c 75 73 69  * Get an exclusi
119d0 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ve lock on the d
119e0 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
119f0 72 75 6e 63 61 74 69 6e 67 2e 20 2a 2f 0a 20 20  runcating. */.  
11a00 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
11a10 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
11a20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
11a30 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
11a40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
11a50 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 63  rn rc;.  }..  rc
11a60 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
11a70 65 28 70 50 61 67 65 72 2c 20 6e 50 61 67 65 29  e(pPager, nPage)
11a80 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
11a90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
11aa0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
11ab0 61 67 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  age;.  }.  retur
11ac0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
11ad0 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65  hutdown the page
11ae0 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c   cache.  Free al
11af0 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f  l memory and clo
11b00 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a  se all files..**
11b10 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63  .** If a transac
11b20 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67  tion was in prog
11b30 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72  ress when this r
11b40 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
11b50 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61  , that.** transa
11b60 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
11b70 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74  back.  All outst
11b80 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65  anding pages are
11b90 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20   invalidated.** 
11ba0 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79  and their memory
11bb0 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20   is freed.  Any 
11bc0 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61  attempt to use a
11bd0 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64   page associated
11be0 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61  .** with this pa
11bf0 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74  ge cache after t
11c00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
11c10 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  urns will likely
11c20 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20  .** result in a 
11c30 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20  coredump..**.** 
11c40 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
11c50 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49  ways succeeds. I
11c60 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
11c70 69 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74  is active an att
11c80 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20  empt.** is made 
11c90 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  to roll it back.
11ca0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
11cb0 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72  urs during the r
11cc0 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f  ollback .** a ho
11cd0 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65  t journal may be
11ce0 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
11cf0 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65  esystem but no e
11d00 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
11d10 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  .** to the calle
11d20 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
11d30 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65  3PagerClose(Page
11d40 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 64  r *pPager){.#ifd
11d50 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
11d60 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
11d70 4e 54 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63  NT.  /* A malloc
11d80 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69  () cannot fail i
11d90 6e 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  n sqlite3ThreadD
11da0 61 74 61 28 29 20 61 73 20 6f 6e 65 20 6f 72 20  ata() as one or 
11db0 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20 0a 20  more calls to . 
11dc0 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d 75 73   ** malloc() mus
11dd0 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
11de0 65 65 6e 20 6d 61 64 65 20 62 79 20 74 68 69 73  een made by this
11df0 20 74 68 72 65 61 64 20 62 65 66 6f 72 65 20 69   thread before i
11e00 74 20 67 65 74 73 0a 20 20 2a 2a 20 74 6f 20 74  t gets.  ** to t
11e10 68 69 73 20 70 6f 69 6e 74 2e 20 54 68 69 73 20  his point. This 
11e20 6d 65 61 6e 73 20 74 68 65 20 54 68 72 65 61 64  means the Thread
11e30 44 61 74 61 20 6d 75 73 74 20 68 61 76 65 20 62  Data must have b
11e40 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c  een allocated al
11e50 72 65 61 64 79 0a 20 20 2a 2a 20 73 6f 20 74 68  ready.  ** so th
11e60 61 74 20 54 68 72 65 61 64 44 61 74 61 2e 6e 41  at ThreadData.nA
11e70 6c 6c 6f 63 20 63 61 6e 20 62 65 20 73 65 74 2e  lloc can be set.
11e80 0a 20 20 2a 2f 0a 20 20 54 68 72 65 61 64 44 61  .  */.  ThreadDa
11e90 74 61 20 2a 70 54 73 64 20 3d 20 73 71 6c 69 74  ta *pTsd = sqlit
11ea0 65 33 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a  e3ThreadData();.
11eb0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11ec0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
11ed0 73 64 20 26 26 20 70 54 73 64 2d 3e 6e 41 6c 6c  sd && pTsd->nAll
11ee0 6f 63 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  oc );.#endif..  
11ef0 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
11f00 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
11f10 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
11f20 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
11f30 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
11f40 30 3b 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74  0;.  pager_reset
11f50 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65  (pPager);.  page
11f60 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
11f70 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 65 6e  ck(pPager);.  en
11f80 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
11f90 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41  o_errors();.  PA
11fa0 47 45 52 54 52 41 43 45 32 28 22 43 4c 4f 53 45  GERTRACE2("CLOSE
11fb0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
11fc0 70 50 61 67 65 72 29 29 3b 0a 20 20 49 4f 54 52  pPager));.  IOTR
11fd0 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e  ACE(("CLOSE %p\n
11fe0 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 61 73  ", pPager)).  as
11ff0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
12000 72 43 6f 64 65 20 7c 7c 20 28 70 50 61 67 65 72  rCode || (pPager
12010 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
12020 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   && pPager->stmt
12030 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66  Open==0) );.  if
12040 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
12050 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  lOpen ){.    sql
12060 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61  ite3OsClose(&pPa
12070 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20  ger->jfd);.  }. 
12080 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
12090 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->aInJournal);
120a0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
120b0 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73  tmtOpen ){.    s
120c0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70  qlite3OsClose(&p
120d0 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20  Pager->stfd);.  
120e0 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f  }.  sqlite3OsClo
120f0 73 65 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b  se(&pPager->fd);
12100 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73  .  /* Temp files
12110 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
12120 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20 74 68  ly deleted by th
12130 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70 50  e OS.  ** if( pP
12140 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
12150 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33  {.  **   sqlite3
12160 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
12170 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a  >zFilename);.  *
12180 2a 20 7d 0a 20 20 2a 2f 0a 0a 23 69 66 64 65 66  * }.  */..#ifdef
12190 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
121a0 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
121b0 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65  .  /* Remove the
121c0 20 70 61 67 65 72 20 66 72 6f 6d 20 74 68 65 20   pager from the 
121d0 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 70  linked list of p
121e0 61 67 65 72 73 20 73 74 61 72 74 69 6e 67 20 61  agers starting a
121f0 74 20 0a 20 20 2a 2a 20 54 68 72 65 61 64 44 61  t .  ** ThreadDa
12200 74 61 2e 70 50 61 67 65 72 20 69 66 20 6d 65 6d  ta.pPager if mem
12210 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69  ory-management i
12220 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a  s enabled..  */.
12230 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 70 54    if( pPager==pT
12240 73 64 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20  sd->pPager ){.  
12250 20 20 70 54 73 64 2d 3e 70 50 61 67 65 72 20 3d    pTsd->pPager =
12260 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a   pPager->pNext;.
12270 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 61 67    }else{.    Pag
12280 65 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 66 6f  er *pTmp;.    fo
12290 72 28 70 54 6d 70 20 3d 20 70 54 73 64 2d 3e 70  r(pTmp = pTsd->p
122a0 50 61 67 65 72 3b 20 70 54 6d 70 2d 3e 70 4e 65  Pager; pTmp->pNe
122b0 78 74 21 3d 70 50 61 67 65 72 3b 20 70 54 6d 70  xt!=pPager; pTmp
122c0 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a  =pTmp->pNext){}.
122d0 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 20      pTmp->pNext 
122e0 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b  = pPager->pNext;
122f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
12300 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
12310 3e 61 48 61 73 68 29 3b 0a 20 20 73 71 6c 69 74  >aHash);.  sqlit
12320 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54  eFree(pPager->pT
12330 6d 70 53 70 61 63 65 29 3b 0a 20 20 73 71 6c 69  mpSpace);.  sqli
12340 74 65 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a  teFree(pPager);.
12350 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12360 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
12370 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  urn the page num
12380 62 65 72 20 66 6f 72 20 74 68 65 20 67 69 76 65  ber for the give
12390 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a  n page data..*/.
123a0 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65  Pgno sqlite3Page
123b0 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61  rPagenumber(DbPa
123c0 67 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ge *p){.  return
123d0 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a   p->pgno;.}../*.
123e0 2a 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66 28  ** The page_ref(
123f0 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65  ) function incre
12400 6d 65 6e 74 73 20 74 68 65 20 72 65 66 65 72 65  ments the refere
12410 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  nce count for a 
12420 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20  page..** If the 
12430 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c  page is currentl
12440 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  y on the freelis
12450 74 20 28 74 68 65 20 72 65 66 65 72 65 6e 63 65  t (the reference
12460 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20   count is zero) 
12470 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69  then.** remove i
12480 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  t from the freel
12490 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e  ist..**.** For n
124a0 6f 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73 2c  on-test systems,
124b0 20 70 61 67 65 5f 72 65 66 28 29 20 69 73 20 61   page_ref() is a
124c0 20 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c 6c   macro that call
124d0 73 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a  s _page_ref().**
124e0 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20 72   online of the r
124f0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69  eference count i
12500 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65 73  s zero.  For tes
12510 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f  t systems, page_
12520 72 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72 65  ref().** is a re
12530 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74  al function so t
12540 68 61 74 20 77 65 20 63 61 6e 20 73 65 74 20 62  hat we can set b
12550 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74  reakpoints and t
12560 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74  race it..*/.stat
12570 69 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65  ic void _page_re
12580 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  f(PgHdr *pPg){. 
12590 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
125a0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
125b0 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c  page is currentl
125c0 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  y on the freelis
125d0 74 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a  t.  Remove it. *
125e0 2f 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70  /.    if( pPg==p
125f0 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72  Pg->pPager->pFir
12600 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20  stSynced ){.    
12610 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67    PgHdr *p = pPg
12620 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
12630 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70     while( p && p
12640 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20  ->needSync ){ p 
12650 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20  = p->pNextFree; 
12660 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  }.      pPg->pPa
12670 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
12680 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20  d = p;.    }.   
12690 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46   if( pPg->pPrevF
126a0 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67  ree ){.      pPg
126b0 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65  ->pPrevFree->pNe
126c0 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e  xtFree = pPg->pN
126d0 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c  extFree;.    }el
126e0 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  se{.      pPg->p
126f0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
12700 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
12710 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
12720 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a  g->pNextFree ){.
12730 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
12740 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20  Free->pPrevFree 
12750 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
12760 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12770 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
12780 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72  pLast = pPg->pPr
12790 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20  evFree;.    }.  
127a0 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e    pPg->pPager->n
127b0 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67  Ref++;.  }.  pPg
127c0 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49  ->nRef++;.  REFI
127d0 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64  NFO(pPg);.}.#ifd
127e0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
127f0 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61    static void pa
12800 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50  ge_ref(PgHdr *pP
12810 67 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  g){.    if( pPg-
12820 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
12830 20 20 5f 70 61 67 65 5f 72 65 66 28 70 50 67 29    _page_ref(pPg)
12840 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12850 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a     pPg->nRef++;.
12860 20 20 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50        REFINFO(pP
12870 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  g);.    }.  }.#e
12880 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67  lse.# define pag
12890 65 5f 72 65 66 28 50 29 20 20 20 28 28 50 29 2d  e_ref(P)   ((P)-
128a0 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72  >nRef==0?_page_r
128b0 65 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29 2d  ef(P):(void)(P)-
128c0 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a  >nRef++).#endif.
128d0 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74  ./*.** Increment
128e0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
128f0 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e  ount for a page.
12900 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e    The input poin
12910 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65  ter is.** a refe
12920 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67  rence to the pag
12930 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73  e data..*/.int s
12940 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 44  qlite3PagerRef(D
12950 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 70  bPage *pPg){.  p
12960 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
12970 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12980 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
12990 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
129a0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61   other words, ma
129b0 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20  ke sure all the 
129c0 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a  pages that have.
129d0 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ** been written 
129e0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  to the journal h
129f0 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61  ave actually rea
12a00 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65  ched the surface
12a10 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e   of the.** disk.
12a20 20 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65    It is not safe
12a30 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 6f   to modify the o
12a40 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
12a50 20 66 69 6c 65 20 75 6e 74 69 6c 20 61 66 74 65   file until afte
12a60 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r.** the journal
12a70 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
12a80 2e 20 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e  .  If the origin
12a90 61 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 6d  al database is m
12aa0 6f 64 69 66 69 65 64 20 62 65 66 6f 72 65 0a 2a  odified before.*
12ab0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
12ac0 20 73 79 6e 63 65 64 20 61 6e 64 20 61 20 70 6f   synced and a po
12ad0 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
12ae0 72 73 2c 20 74 68 65 20 75 6e 73 79 6e 63 65 64  rs, the unsynced
12af0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61   journal.** data
12b00 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20 61   would be lost a
12b10 6e 64 20 77 65 20 77 6f 75 6c 64 20 62 65 20 75  nd we would be u
12b20 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74  nable to complet
12b30 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65  ely rollback the
12b40 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61  .** database cha
12b50 6e 67 65 73 2e 20 20 44 61 74 61 62 61 73 65 20  nges.  Database 
12b60 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64  corruption would
12b70 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54   occur..** .** T
12b80 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
12b90 20 75 70 64 61 74 65 73 20 74 68 65 20 6e 52 65   updates the nRe
12ba0 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 68  c field in the h
12bb0 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75  eader of the jou
12bc0 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f  rnal..** (See co
12bd0 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61  mments on the pa
12be0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72  ger_playback() r
12bf0 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74  outine for addit
12c00 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
12c10 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20 73 79  n.).** If the sy
12c20 6e 63 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c  nc mode is FULL,
12c30 20 74 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20   two syncs will 
12c40 6f 63 63 75 72 2e 20 20 46 69 72 73 74 20 74 68  occur.  First th
12c50 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a  e whole journal.
12c60 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c 20 74 68  ** is synced, th
12c70 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  en the nRec fiel
12c80 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 74 68  d is updated, th
12c90 65 6e 20 61 20 73 65 63 6f 6e 64 20 73 79 6e 63  en a second sync
12ca0 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46   occurs..**.** F
12cb0 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  or temporary dat
12cc0 61 62 61 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f  abases, we do no
12cd0 74 20 63 61 72 65 20 69 66 20 77 65 20 61 72 65  t care if we are
12ce0 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63   able to rollbac
12cf0 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20 70 6f 77  k.** after a pow
12d00 65 72 20 66 61 69 6c 75 72 65 2c 20 73 6f 20 73  er failure, so s
12d10 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ync occurs..**.*
12d20 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
12d30 6c 65 61 72 73 20 74 68 65 20 6e 65 65 64 53 79  lears the needSy
12d40 6e 63 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72  nc field of ever
12d50 79 20 70 61 67 65 20 63 75 72 72 65 6e 74 20 68  y page current h
12d60 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79  eld in.** memory
12d70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12d80 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65  syncJournal(Page
12d90 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
12da0 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
12db0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
12dc0 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a  .  /* Sync the j
12dd0 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f  ournal before mo
12de0 64 69 66 79 69 6e 67 20 74 68 65 20 6d 61 69 6e  difying the main
12df0 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 28   database.  ** (
12e00 61 73 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69  assuming there i
12e10 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  s a journal and 
12e20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  it needs to be s
12e30 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69  ynced.).  */.  i
12e40 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  f( pPager->needS
12e50 79 6e 63 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ync ){.    if( !
12e60 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
12e70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
12e80 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
12e90 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 2f  lOpen );.      /
12ea0 2a 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65  * assert( !pPage
12eb0 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20 2f 2f 20  r->noSync ); // 
12ec0 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20 62 65 20  noSync might be 
12ed0 73 65 74 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f  set if synchrono
12ee0 75 73 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20  us.      ** was 
12ef0 74 75 72 6e 65 64 20 6f 66 66 20 61 66 74 65 72  turned off after
12f00 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
12f10 20 77 61 73 20 73 74 61 72 74 65 64 2e 20 20 54   was started.  T
12f20 69 63 6b 65 74 20 23 36 31 35 20 2a 2f 0a 23 69  icket #615 */.#i
12f30 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
12f40 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20     {.        /* 
12f50 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 50  Make sure the pP
12f60 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f 75 6e 74  ager->nRec count
12f70 65 72 20 77 65 20 61 72 65 20 6b 65 65 70 69 6e  er we are keepin
12f80 67 20 61 67 72 65 65 73 0a 20 20 20 20 20 20 20  g agrees.       
12f90 20 2a 2a 20 77 69 74 68 20 74 68 65 20 6e 52 65   ** with the nRe
12fa0 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20  c computed from 
12fb0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
12fc0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
12fd0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
12fe0 20 69 36 34 20 6a 53 7a 3b 0a 20 20 20 20 20 20   i64 jSz;.      
12ff0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13000 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
13010 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a 20 20 20  >jfd, &jSz);.   
13020 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
13030 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
13040 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
13050 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
13060 6a 53 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23  jSz );.      }.#
13070 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20  endif.      {.  
13080 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
13090 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
130a0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
130b0 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69  ile header. If i
130c0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c  n.        ** ful
130d0 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f  l-synchronous mo
130e0 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  de, sync the jou
130f0 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73  rnal first. This
13100 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20   ensures that.  
13110 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74        ** all dat
13120 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74  a has really hit
13130 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65   the disk before
13140 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
13150 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20   to mark.       
13160 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64   ** it as a cand
13170 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61  idate for rollba
13180 63 6b 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ck. .        */.
13190 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
131a0 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
131b0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54            PAGERT
131c0 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72  RACE2("SYNC jour
131d0 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
131e0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
131f0 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43            IOTRAC
13200 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
13210 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
13220 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13230 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
13240 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  fd, 0);.        
13250 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
13260 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
13270 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
13280 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
13290 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20 20 20 20  ager->jfd,.     
132a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132b0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
132c0 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f  urnalHdr + sizeo
132d0 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
132e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
132f0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
13300 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
13310 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64  "JHDR %p %lld %d
13320 5c 6e 22 2c 20 70 50 61 67 65 72 2c 0a 20 20 20  \n", pPager,.   
13330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
13340 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
13350 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  r + sizeof(aJour
13360 6e 61 6c 4d 61 67 69 63 29 2c 20 34 29 29 0a 20  nalMagic), 4)). 
13370 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
13380 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
13390 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  jfd, pPager->nRe
133a0 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
133b0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
133c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
133d0 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
133e0 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
133f0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
13400 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
13410 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
13420 7d 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  }.      PAGERTRA
13430 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE2("SYNC journa
13440 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
13450 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
13460 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
13470 59 4e 43 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  YNC %d\n", pPage
13480 72 29 29 0a 20 20 20 20 20 20 72 63 20 3d 20 73  r)).      rc = s
13490 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
134a0 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
134b0 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20  ->full_fsync);. 
134c0 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
134d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
134e0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
134f0 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20  lStarted = 1;.  
13500 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
13510 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20  needSync = 0;.. 
13520 20 20 20 2f 2a 20 45 72 61 73 65 20 74 68 65 20     /* Erase the 
13530 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 66 72  needSync flag fr
13540 6f 6d 20 65 76 65 72 79 20 70 61 67 65 2e 0a 20  om every page.. 
13550 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50     */.    for(pP
13560 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
13570 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
13580 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70  extAll){.      p
13590 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
135a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
135b0 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
135c0 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73   = pPager->pFirs
135d0 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  t;.  }..#ifndef 
135e0 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74  NDEBUG.  /* If t
135f0 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e  he Pager.needSyn
13600 63 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20  c flag is clear 
13610 74 68 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e  then the PgHdr.n
13620 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61  eedSync.  ** fla
13630 67 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63  g must also be c
13640 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67  lear for all pag
13650 65 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74  es.  Verify that
13660 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72   this.  ** invar
13670 69 61 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20  iant is true..  
13680 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 66  */.  else{.    f
13690 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
136a0 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
136b0 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
136c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
136d0 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a  >needSync==0 );.
136e0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
136f0 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ( pPager->pFirst
13700 53 79 6e 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e  Synced==pPager->
13710 70 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65  pFirst );.  }.#e
13720 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
13730 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67  c;.}../*.** Merg
13740 65 20 74 77 6f 20 6c 69 73 74 73 20 6f 66 20 70  e two lists of p
13750 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  ages connected b
13760 79 20 70 44 69 72 74 79 20 61 6e 64 20 69 6e 20  y pDirty and in 
13770 70 67 6e 6f 20 6f 72 64 65 72 2e 0a 2a 2a 20 44  pgno order..** D
13780 6f 20 6e 6f 74 20 62 6f 74 68 20 66 69 78 69 6e  o not both fixin
13790 67 20 74 68 65 20 70 50 72 65 76 44 69 72 74 79  g the pPrevDirty
137a0 20 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74   pointers..*/.st
137b0 61 74 69 63 20 50 67 48 64 72 20 2a 6d 65 72 67  atic PgHdr *merg
137c0 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  e_pagelist(PgHdr
137d0 20 2a 70 41 2c 20 50 67 48 64 72 20 2a 70 42 29   *pA, PgHdr *pB)
137e0 7b 0a 20 20 50 67 48 64 72 20 72 65 73 75 6c 74  {.  PgHdr result
137f0 2c 20 2a 70 54 61 69 6c 3b 0a 20 20 70 54 61 69  , *pTail;.  pTai
13800 6c 20 3d 20 26 72 65 73 75 6c 74 3b 0a 20 20 77  l = &result;.  w
13810 68 69 6c 65 28 20 70 41 20 26 26 20 70 42 20 29  hile( pA && pB )
13820 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70 67  {.    if( pA->pg
13830 6e 6f 3c 70 42 2d 3e 70 67 6e 6f 20 29 7b 0a 20  no<pB->pgno ){. 
13840 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72       pTail->pDir
13850 74 79 20 3d 20 70 41 3b 0a 20 20 20 20 20 20 70  ty = pA;.      p
13860 54 61 69 6c 20 3d 20 70 41 3b 0a 20 20 20 20 20  Tail = pA;.     
13870 20 70 41 20 3d 20 70 41 2d 3e 70 44 69 72 74 79   pA = pA->pDirty
13880 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13890 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79     pTail->pDirty
138a0 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70 54 61   = pB;.      pTa
138b0 69 6c 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70  il = pB;.      p
138c0 42 20 3d 20 70 42 2d 3e 70 44 69 72 74 79 3b 0a  B = pB->pDirty;.
138d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
138e0 70 41 20 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d  pA ){.    pTail-
138f0 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a 20 20  >pDirty = pA;.  
13900 7d 65 6c 73 65 20 69 66 28 20 70 42 20 29 7b 0a  }else if( pB ){.
13910 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74      pTail->pDirt
13920 79 20 3d 20 70 42 3b 0a 20 20 7d 65 6c 73 65 7b  y = pB;.  }else{
13930 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72  .    pTail->pDir
13940 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ty = 0;.  }.  re
13950 74 75 72 6e 20 72 65 73 75 6c 74 2e 70 44 69 72  turn result.pDir
13960 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72  ty;.}../*.** Sor
13970 74 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61  t the list of pa
13980 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67  ges in accending
13990 20 6f 72 64 65 72 20 62 79 20 70 67 6e 6f 2e 20   order by pgno. 
139a0 20 50 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f   Pages are.** co
139b0 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74  nnected by pDirt
139c0 79 20 70 6f 69 6e 74 65 72 73 2e 20 20 54 68 65  y pointers.  The
139d0 20 70 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e   pPrevDirty poin
139e0 74 65 72 73 20 61 72 65 0a 2a 2a 20 63 6f 72 72  ters are.** corr
139f0 75 70 74 65 64 20 62 79 20 74 68 69 73 20 73 6f  upted by this so
13a00 72 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  rt..*/.#define N
13a10 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20 32 35 0a  _SORT_BUCKET 25.
13a20 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 73 6f  static PgHdr *so
13a30 72 74 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64  rt_pagelist(PgHd
13a40 72 20 2a 70 49 6e 29 7b 0a 20 20 50 67 48 64 72  r *pIn){.  PgHdr
13a50 20 2a 61 5b 4e 5f 53 4f 52 54 5f 42 55 43 4b 45   *a[N_SORT_BUCKE
13a60 54 5d 2c 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  T], *p;.  int i;
13a70 0a 20 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20  .  memset(a, 0, 
13a80 73 69 7a 65 6f 66 28 61 29 29 3b 0a 20 20 77 68  sizeof(a));.  wh
13a90 69 6c 65 28 20 70 49 6e 20 29 7b 0a 20 20 20 20  ile( pIn ){.    
13aa0 70 20 3d 20 70 49 6e 3b 0a 20 20 20 20 70 49 6e  p = pIn;.    pIn
13ab0 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20   = p->pDirty;.  
13ac0 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b    p->pDirty = 0;
13ad0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
13ae0 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 3b  N_SORT_BUCKET-1;
13af0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
13b00 20 61 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20   a[i]==0 ){.    
13b10 20 20 20 20 61 5b 69 5d 20 3d 20 70 3b 0a 20 20      a[i] = p;.  
13b20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13b30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13b40 20 20 70 20 3d 20 6d 65 72 67 65 5f 70 61 67 65    p = merge_page
13b50 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20  list(a[i], p);. 
13b60 20 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 30 3b         a[i] = 0;
13b70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13b80 20 20 20 69 66 28 20 69 3d 3d 4e 5f 53 4f 52 54     if( i==N_SORT
13b90 5f 42 55 43 4b 45 54 2d 31 20 29 7b 0a 20 20 20  _BUCKET-1 ){.   
13ba0 20 20 20 61 5b 69 5d 20 3d 20 6d 65 72 67 65 5f     a[i] = merge_
13bb0 70 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20 70  pagelist(a[i], p
13bc0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
13bd0 20 3d 20 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69   = a[0];.  for(i
13be0 3d 31 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43  =1; i<N_SORT_BUC
13bf0 4b 45 54 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  KET; i++){.    p
13c00 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73   = merge_pagelis
13c10 74 28 70 2c 20 61 5b 69 5d 29 3b 0a 20 20 7d 0a  t(p, a[i]);.  }.
13c20 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
13c30 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69 73  *.** Given a lis
13c40 74 20 6f 66 20 70 61 67 65 73 20 28 63 6f 6e 6e  t of pages (conn
13c50 65 63 74 65 64 20 62 79 20 74 68 65 20 50 67 48  ected by the PgH
13c60 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65  dr.pDirty pointe
13c70 72 29 20 77 72 69 74 65 0a 2a 2a 20 65 76 65 72  r) write.** ever
13c80 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70  y one of those p
13c90 61 67 65 73 20 6f 75 74 20 74 6f 20 74 68 65 20  ages out to the 
13ca0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
13cb0 64 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a  d mark them all.
13cc0 2a 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a  ** as clean..*/.
13cd0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
13ce0 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
13cf0 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20  PgHdr *pList){. 
13d00 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
13d10 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
13d20 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
13d30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13d40 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e  pPager = pList->
13d50 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74  pPager;..  /* At
13d60 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72   this point ther
13d70 65 20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20  e may be either 
13d80 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
13d90 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
13da0 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
13db0 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
13dc0 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45   is already an E
13dd0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74  XCLUSIVE lock, t
13de0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a  he following.  *
13df0 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
13e00 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e  e3OsLock() are n
13e10 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  o-ops..  **.  **
13e20 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b   Moving the lock
13e30 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20 74   from RESERVED t
13e40 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63 74 75  o EXCLUSIVE actu
13e50 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f  ally involves go
13e60 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68  ing.  ** through
13e70 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65   an intermediate
13e80 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e 20   state PENDING. 
13e90 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b    A PENDING lock
13ea0 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20 20   prevents new.  
13eb0 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d 20  ** readers from 
13ec0 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68 65  attaching to the
13ed0 20 64 61 74 61 62 61 73 65 20 62 75 74 20 69 73   database but is
13ee0 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66 6f   unsufficient fo
13ef0 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69  r us to.  ** wri
13f00 74 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f 66  te.  The idea of
13f10 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
13f20 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e 65  is to prevent ne
13f30 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a 20  w readers from. 
13f40 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68   ** coming in wh
13f50 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72 20  ile we wait for 
13f60 65 78 69 73 74 69 6e 67 20 72 65 61 64 65 72 73  existing readers
13f70 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a   to clear..  **.
13f80 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20 70    ** While the p
13f90 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 52  ager is in the R
13fa0 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74  ESERVED state, t
13fb0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
13fc0 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69  base file.  ** i
13fd0 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  s unchanged and 
13fe0 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20  we can rollback 
13ff0 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
14000 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a 20  o playback the. 
14010 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f   ** journal into
14020 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
14030 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e  tabase file.  On
14040 63 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e  ce we transition
14050 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49   to.  ** EXCLUSI
14060 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  VE, it means the
14070 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
14080 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20  as been changed 
14090 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b  and any rollback
140a0 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69  .  ** will requi
140b0 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61  re a journal pla
140c0 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63  yback..  */.  rc
140d0 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
140e0 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
140f0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
14100 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14110 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
14120 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69 73   rc;.  }..  pLis
14130 74 20 3d 20 73 6f 72 74 5f 70 61 67 65 6c 69 73  t = sort_pagelis
14140 74 28 70 4c 69 73 74 29 3b 0a 20 20 77 68 69 6c  t(pList);.  whil
14150 65 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  e( pList ){.    
14160 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 64  assert( pList->d
14170 69 72 74 79 20 29 3b 0a 20 20 20 20 72 63 20 3d  irty );.    rc =
14180 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
14190 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 4c 69 73  Pager->fd, (pLis
141a0 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  t->pgno-1)*(i64)
141b0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
141c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
141d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 2f  return rc;.    /
141e0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64  * If there are d
141f0 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68  irty pages in th
14200 65 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74  e page cache wit
14210 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67  h page numbers g
14220 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68  reater.    ** th
14230 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  an Pager.dbSize,
14240 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69   this means sqli
14250 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
14260 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  () was called to
14270 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65  .    ** make the
14280 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70   file smaller (p
14290 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74  resumably by aut
142a0 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20  o-vacuum code). 
142b0 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20  Do not write.   
142c0 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67   ** any such pag
142d0 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a  es to the file..
142e0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
142f0 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67  List->pgno<=pPag
14300 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
14310 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 20      char *pData 
14320 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c  = CODEC2(pPager,
14330 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
14340 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67  List), pList->pg
14350 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20 50 41  no, 6);.      PA
14360 47 45 52 54 52 41 43 45 33 28 22 53 54 4f 52 45  GERTRACE3("STORE
14370 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
14380 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
14390 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20   pList->pgno);. 
143a0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50       IOTRACE(("P
143b0 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70  GOUT %p %d\n", p
143c0 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67  Pager, pList->pg
143d0 6e 6f 29 29 0a 20 20 20 20 20 20 72 63 20 3d 20  no)).      rc = 
143e0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
143f0 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61  Pager->fd, pData
14400 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
14410 7a 65 29 3b 0a 20 20 20 20 20 20 54 45 53 54 5f  ze);.      TEST_
14420 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72  INCR(pPager->nWr
14430 69 74 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  ite);.    }.#ifn
14440 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 65  def NDEBUG.    e
14450 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52  lse{.      PAGER
14460 54 52 41 43 45 33 28 22 4e 4f 53 54 4f 52 45 20  TRACE3("NOSTORE 
14470 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
14480 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
14490 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pList->pgno);.  
144a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
144b0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
144c0 63 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 64 69  c;.    pList->di
144d0 72 74 79 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  rty = 0;.#ifdef 
144e0 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
144f0 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61  ES.    pList->pa
14500 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
14510 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a  agehash(pList);.
14520 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74  #endif.    pList
14530 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79   = pList->pDirty
14540 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
14550 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
14560 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65 72 79  ** Collect every
14570 20 64 69 72 74 79 20 70 61 67 65 20 69 6e 74 6f   dirty page into
14580 20 61 20 64 69 72 74 79 20 6c 69 73 74 20 61 6e   a dirty list an
14590 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70 6f  d.** return a po
145a0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61  inter to the hea
145b0 64 20 6f 66 20 74 68 61 74 20 6c 69 73 74 2e 20  d of that list. 
145c0 20 41 6c 6c 20 70 61 67 65 73 20 61 72 65 0a 2a   All pages are.*
145d0 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e  * collected even
145e0 20 69 66 20 74 68 65 79 20 61 72 65 20 73 74 69   if they are sti
145f0 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74  ll in use..*/.st
14600 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65  atic PgHdr *page
14610 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
14620 70 61 67 65 73 28 50 61 67 65 72 20 2a 70 50 61  pages(Pager *pPa
14630 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
14640 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a 7d  Pager->pDirty;.}
14650 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
14660 52 55 45 20 69 66 20 74 68 65 72 65 20 69 73 20  RUE if there is 
14670 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e  a hot journal on
14680 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
14690 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a 6f 75 72 6e  ..** A hot journ
146a0 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20 6e  al is one that n
146b0 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
146c0 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  d back..**.** If
146d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
146e0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
146f0 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20  e file is 0 but 
14700 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  a journal file.*
14710 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69  * exists, that i
14720 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c  s probably an ol
14730 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f  d journal left o
14740 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  ver from a prior
14750 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74  .** database wit
14760 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
14770 20 20 4a 75 73 74 20 64 65 6c 65 74 65 20 74 68    Just delete th
14780 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74  e journal..*/.st
14790 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a  atic int hasHotJ
147a0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
147b0 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50  ager){.  if( !pP
147c0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
147d0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
147e0 66 28 20 21 73 71 6c 69 74 65 33 4f 73 46 69 6c  f( !sqlite3OsFil
147f0 65 45 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e  eExists(pPager->
14800 7a 4a 6f 75 72 6e 61 6c 29 20 29 20 72 65 74 75  zJournal) ) retu
14810 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 0;.  if( sqli
14820 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
14830 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  edLock(pPager->f
14840 64 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  d) ) return 0;. 
14850 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
14860 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
14870 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  r)==0 ){.    sql
14880 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
14890 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a  ger->zJournal);.
148a0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
148b0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
148c0 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 1;.  }.}../*.*
148d0 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61 20  * Try to find a 
148e0 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
148f0 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 72 65  e that can be re
14900 63 79 63 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54  cycled. .**.** T
14910 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20  his routine may 
14920 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
14930 45 52 52 2c 20 53 51 4c 49 54 45 5f 46 55 4c 4c  ERR, SQLITE_FULL
14940 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49   or SQLITE_OK. I
14950 74 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73  t .** does not s
14960 65 74 20 74 68 65 20 70 50 61 67 65 72 2d 3e 65  et the pPager->e
14970 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e  rrCode variable.
14980 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
14990 61 67 65 72 5f 72 65 63 79 63 6c 65 28 50 61 67  ager_recycle(Pag
149a0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
149b0 73 79 6e 63 4f 6b 2c 20 50 67 48 64 72 20 2a 2a  syncOk, PgHdr **
149c0 70 70 50 67 29 7b 0a 20 20 50 67 48 64 72 20 2a  ppPg){.  PgHdr *
149d0 70 50 67 3b 0a 20 20 2a 70 70 50 67 20 3d 20 30  pPg;.  *ppPg = 0
149e0 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 20 70  ;..  /* Find a p
149f0 61 67 65 20 74 6f 20 72 65 63 79 63 6c 65 2e 20  age to recycle. 
14a00 20 54 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 61   Try to locate a
14a10 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20   page that does 
14a20 6e 6f 74 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  not.  ** require
14a30 20 75 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79   us to do an fsy
14a40 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72  nc() on the jour
14a50 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20  nal..  */.  pPg 
14a60 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  = pPager->pFirst
14a70 53 79 6e 63 65 64 3b 0a 0a 20 20 2f 2a 20 49 66  Synced;..  /* If
14a80 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69   we could not fi
14a90 6e 64 20 61 20 70 61 67 65 20 74 68 61 74 20 64  nd a page that d
14aa0 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
14ab0 61 6e 20 66 73 79 6e 63 28 29 0a 20 20 2a 2a 20  an fsync().  ** 
14ac0 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
14ad0 69 6c 65 20 74 68 65 6e 20 66 73 79 6e 63 20 74  ile then fsync t
14ae0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
14af0 20 20 54 68 69 73 20 69 73 20 61 0a 20 20 2a 2a    This is a.  **
14b00 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65 72 61   very slow opera
14b10 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b  tion, so we work
14b20 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64 20 69   hard to avoid i
14b30 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69 6d 65  t.  But sometime
14b40 73 0a 20 20 2a 2a 20 69 74 20 63 61 6e 27 74 20  s.  ** it can't 
14b50 62 65 20 68 65 6c 70 65 64 2e 0a 20 20 2a 2f 0a  be helped..  */.
14b60 20 20 69 66 28 20 70 50 67 3d 3d 30 20 26 26 20    if( pPg==0 && 
14b70 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 26  pPager->pFirst &
14b80 26 20 73 79 6e 63 4f 6b 20 26 26 20 21 4d 45 4d  & syncOk && !MEM
14b90 44 42 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  DB){.    int rc 
14ba0 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
14bb0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
14bc0 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  c!=0 ){.      re
14bd0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
14be0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66     if( pPager->f
14bf0 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  ullSync ){.     
14c00 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
14c10 79 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74 65 20  ync mode, write 
14c20 61 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 68 65  a new journal he
14c30 61 64 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20  ader into the.  
14c40 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
14c50 69 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f 6e  ile. This is don
14c60 65 20 74 6f 20 61 76 6f 69 64 20 65 76 65 72 20  e to avoid ever 
14c70 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f 75 72  modifying a jour
14c80 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 68 65 61  nal.      ** hea
14c90 64 65 72 20 74 68 61 74 20 69 73 20 69 6e 76 6f  der that is invo
14ca0 6c 76 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c  lved in the roll
14cb0 62 61 63 6b 20 6f 66 20 70 61 67 65 73 20 74 68  back of pages th
14cc0 61 74 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a  at have.      **
14cd0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
14ce0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
14cf0 61 62 61 73 65 20 28 69 6e 20 63 61 73 65 20 74  abase (in case t
14d00 68 65 20 68 65 61 64 65 72 20 69 73 0a 20 20 20  he header is.   
14d10 20 20 20 2a 2a 20 74 72 61 73 68 65 64 20 77 68     ** trashed wh
14d20 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  en the nRec fiel
14d30 64 20 69 73 20 75 70 64 61 74 65 64 29 2e 0a 20  d is updated).. 
14d40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50       */.      pP
14d50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
14d60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
14d70 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
14d80 20 3e 20 30 20 29 3b 0a 20 20 20 20 20 20 61 73   > 0 );.      as
14d90 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f  sert( pPager->do
14da0 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  NotSync==0 );.  
14db0 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
14dc0 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
14dd0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
14de0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
14df0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
14e00 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20      }.    pPg = 
14e10 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a  pPager->pFirst;.
14e20 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30    }.  if( pPg==0
14e30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
14e40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
14e50 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
14e60 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57  ef==0 );..  /* W
14e70 72 69 74 65 20 74 68 65 20 70 61 67 65 20 74 6f  rite the page to
14e80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14e90 6c 65 20 69 66 20 69 74 20 69 73 20 64 69 72 74  le if it is dirt
14ea0 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  y..  */.  if( pP
14eb0 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  g->dirty ){.    
14ec0 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73 65  int rc;.    asse
14ed0 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  rt( pPg->needSyn
14ee0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 6d 61 6b 65  c==0 );.    make
14ef0 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20  Clean(pPg);.    
14f00 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a  pPg->dirty = 1;.
14f10 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20      pPg->pDirty 
14f20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  = 0;.    rc = pa
14f30 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
14f40 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 69  st( pPg );.    i
14f50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14f60 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
14f70 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   rc;.    }.  }. 
14f80 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69   assert( pPg->di
14f90 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  rty==0 );..  /* 
14fa0 49 66 20 74 68 65 20 70 61 67 65 20 77 65 20 61  If the page we a
14fb0 72 65 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20  re recycling is 
14fc0 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73  marked as always
14fd0 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20  Rollback, then. 
14fe0 20 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62   ** set the glob
14ff0 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  al alwaysRollbac
15000 6b 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73  k flag, thus dis
15010 61 62 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  abling the.  ** 
15020 73 71 6c 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c  sqlite_dont_roll
15030 62 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74  back() optimizat
15040 69 6f 6e 20 66 6f 72 20 74 68 65 20 72 65 73 74  ion for the rest
15050 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   of this transac
15060 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49 74 20 69 73  tion..  ** It is
15070 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 6f   necessary to do
15080 20 74 68 69 73 20 62 65 63 61 75 73 65 20 74 68   this because th
15090 65 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c  e page marked al
150a0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 2a  waysRollback.  *
150b0 2a 20 6d 69 67 68 74 20 62 65 20 72 65 6c 6f 61  * might be reloa
150c0 64 65 64 20 61 74 20 61 20 6c 61 74 65 72 20 74  ded at a later t
150d0 69 6d 65 20 62 75 74 20 61 74 20 74 68 61 74 20  ime but at that 
150e0 70 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74 20 72  point we won't r
150f0 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 61  emember.  ** tha
15100 74 20 69 73 20 77 61 73 20 6d 61 72 6b 65 64 20  t is was marked 
15110 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20  alwaysRollback. 
15120 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
15130 20 61 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 0a   all pages must.
15140 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61    ** be marked a
15150 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  s alwaysRollback
15160 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75   from here on ou
15170 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  t..  */.  if( pP
15180 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
15190 6b 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  k ){.    IOTRACE
151a0 28 28 22 41 4c 57 41 59 53 5f 52 4f 4c 4c 42 41  (("ALWAYS_ROLLBA
151b0 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  CK %p\n", pPager
151c0 29 29 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  )).    pPager->a
151d0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
151e0 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c  1;.  }..  /* Unl
151f0 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67 65  ink the old page
15200 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c   from the free l
15210 69 73 74 20 61 6e 64 20 74 68 65 20 68 61 73 68  ist and the hash
15220 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 75 6e   table.  */.  un
15230 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20  linkPage(pPg);. 
15240 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65   TEST_INCR(pPage
15250 72 2d 3e 6e 4f 76 66 6c 29 3b 0a 0a 20 20 2a 70  r->nOvfl);..  *p
15260 70 50 67 20 3d 20 70 50 67 3b 0a 20 20 72 65 74  pPg = pPg;.  ret
15270 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
15280 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
15290 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
152a0 74 6f 20 66 72 65 65 20 73 75 70 65 72 66 6c 75  to free superflu
152b0 6f 75 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20  ous dynamically 
152c0 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79  allocated memory
152d0 0a 2a 2a 20 68 65 6c 64 20 62 79 20 74 68 65 20  .** held by the 
152e0 70 61 67 65 72 20 73 79 73 74 65 6d 2e 20 4d 65  pager system. Me
152f0 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 61  mory in use by a
15300 6e 79 20 53 51 4c 69 74 65 20 70 61 67 65 72 20  ny SQLite pager 
15310 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20  allocated.** by 
15320 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
15330 61 64 20 6d 61 79 20 62 65 20 73 71 6c 69 74 65  ad may be sqlite
15340 46 72 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a 20  Free()ed..**.** 
15350 6e 52 65 71 20 69 73 20 74 68 65 20 6e 75 6d 62  nReq is the numb
15360 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d  er of bytes of m
15370 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 2e 20  emory required. 
15380 4f 6e 63 65 20 74 68 69 73 20 6d 75 63 68 20 68  Once this much h
15390 61 73 0a 2a 2a 20 62 65 65 6e 20 72 65 6c 65 61  as.** been relea
153a0 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69 6f  sed, the functio
153b0 6e 20 72 65 74 75 72 6e 73 2e 20 41 20 6e 65 67  n returns. A neg
153c0 61 74 69 76 65 20 76 61 6c 75 65 20 66 6f 72 20  ative value for 
153d0 6e 52 65 71 20 6d 65 61 6e 73 0a 2a 2a 20 66 72  nReq means.** fr
153e0 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72  ee as much memor
153f0 79 20 61 73 20 70 6f 73 73 69 62 6c 65 2e 20 54  y as possible. T
15400 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
15410 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
15420 62 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74 65 73  ber .** of bytes
15430 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61   of memory relea
15440 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  sed..*/.#ifdef S
15450 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
15460 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 69  ORY_MANAGEMENT.i
15470 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
15480 65 6c 65 61 73 65 4d 65 6d 6f 72 79 28 69 6e 74  eleaseMemory(int
15490 20 6e 52 65 71 29 7b 0a 20 20 63 6f 6e 73 74 20   nReq){.  const 
154a0 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73 64  ThreadData *pTsd
154b0 72 6f 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65  ro = sqlite3Thre
154c0 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29  adDataReadOnly()
154d0 3b 0a 20 20 50 61 67 65 72 20 2a 70 3b 0a 20 20  ;.  Pager *p;.  
154e0 69 6e 74 20 6e 52 65 6c 65 61 73 65 64 20 3d 20  int nReleased = 
154f0 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f  0;.  int i;..  /
15500 2a 20 49 66 20 74 68 65 20 74 68 65 20 67 6c 6f  * If the the glo
15510 62 61 6c 20 6d 75 74 65 78 20 69 73 20 68 65 6c  bal mutex is hel
15520 64 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69  d, this subrouti
15530 6e 65 20 62 65 63 6f 6d 65 73 20 61 0a 20 20 2a  ne becomes a.  *
15540 2a 20 6f 2d 6f 70 3b 20 7a 65 72 6f 20 62 79 74  * o-op; zero byt
15550 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 61 72 65  es of memory are
15560 20 66 72 65 65 64 2e 20 20 54 68 69 73 20 69 73   freed.  This is
15570 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 73 6f   because.  ** so
15580 6d 65 20 6f 66 20 74 68 65 20 63 6f 64 65 20 69  me of the code i
15590 6e 76 6f 6b 65 64 20 62 79 20 74 68 69 73 20 66  nvoked by this f
155a0 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c 73 6f  unction may also
155b0 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 6f 62 74  .  ** try to obt
155c0 61 69 6e 20 74 68 65 20 6d 75 74 65 78 2c 20 72  ain the mutex, r
155d0 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 20 64 65  esulting in a de
155e0 61 64 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  adlock..  */.  i
155f0 66 28 20 73 71 6c 69 74 65 33 4f 73 49 6e 4d 75  f( sqlite3OsInMu
15600 74 65 78 28 30 29 20 29 7b 0a 20 20 20 20 72 65  tex(0) ){.    re
15610 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
15620 2a 20 4f 75 74 65 72 6d 6f 73 74 20 6c 6f 6f 70  * Outermost loop
15630 20 72 75 6e 73 20 66 6f 72 20 61 74 20 6d 6f 73   runs for at mos
15640 74 20 74 77 6f 20 69 74 65 72 61 74 69 6f 6e 73  t two iterations
15650 2e 20 46 69 72 73 74 20 69 74 65 72 61 74 69 6f  . First iteratio
15660 6e 20 77 65 0a 20 20 2a 2a 20 74 72 79 20 74 6f  n we.  ** try to
15670 20 66 69 6e 64 20 6d 65 6d 6f 72 79 20 74 68 61   find memory tha
15680 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65  t can be release
15690 64 20 77 69 74 68 6f 75 74 20 63 61 6c 6c 69 6e  d without callin
156a0 67 20 66 73 79 6e 63 28 29 2e 20 53 65 63 6f 6e  g fsync(). Secon
156b0 64 0a 20 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e  d.  ** iteration
156c0 20 28 77 68 69 63 68 20 6f 6e 6c 79 20 72 75 6e   (which only run
156d0 73 20 69 66 20 74 68 65 20 66 69 72 73 74 20 66  s if the first f
156e0 61 69 6c 65 64 20 74 6f 20 66 72 65 65 20 6e 52  ailed to free nR
156f0 65 71 20 62 79 74 65 73 20 6f 66 0a 20 20 2a 2a  eq bytes of.  **
15700 20 6d 65 6d 6f 72 79 29 20 69 73 20 70 65 72 6d   memory) is perm
15710 69 74 74 65 64 20 74 6f 20 63 61 6c 6c 20 66 73  itted to call fs
15720 79 6e 63 28 29 2e 20 54 68 69 73 20 69 73 20 6f  ync(). This is o
15730 66 20 63 6f 75 72 73 65 20 6d 75 63 68 20 6d 6f  f course much mo
15740 72 65 20 0a 20 20 2a 2a 20 65 78 70 65 6e 73 69  re .  ** expensi
15750 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ve..  */.  for(i
15760 3d 30 3b 20 69 3c 3d 31 3b 20 69 2b 2b 29 7b 0a  =0; i<=1; i++){.
15770 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72  .    /* Loop thr
15780 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 53 51 4c  ough all the SQL
15790 69 74 65 20 70 61 67 65 72 73 20 6f 70 65 6e 65  ite pagers opene
157a0 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74  d by the current
157b0 20 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20   thread. */.    
157c0 66 6f 72 28 70 3d 70 54 73 64 72 6f 2d 3e 70 50  for(p=pTsdro->pP
157d0 61 67 65 72 3b 20 70 20 26 26 20 28 6e 52 65 71  ager; p && (nReq
157e0 3c 30 20 7c 7c 20 6e 52 65 6c 65 61 73 65 64 3c  <0 || nReleased<
157f0 6e 52 65 71 29 3b 20 70 3d 70 2d 3e 70 4e 65 78  nReq); p=p->pNex
15800 74 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20  t){.      PgHdr 
15810 2a 70 50 67 3b 0a 20 20 20 20 20 20 69 6e 74 20  *pPg;.      int 
15820 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 6f  rc;..      /* Fo
15830 72 20 65 61 63 68 20 70 61 67 65 72 2c 20 74 72  r each pager, tr
15840 79 20 74 6f 20 66 72 65 65 20 61 73 20 6d 61 6e  y to free as man
15850 79 20 70 61 67 65 73 20 61 73 20 70 6f 73 73 69  y pages as possi
15860 62 6c 65 20 28 77 69 74 68 6f 75 74 20 0a 20 20  ble (without .  
15870 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 66      ** calling f
15880 73 79 6e 63 28 29 20 69 66 20 74 68 69 73 20 69  sync() if this i
15890 73 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  s the first iter
158a0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 75 74  ation of the out
158b0 65 72 6d 6f 73 74 20 0a 20 20 20 20 20 20 2a 2a  ermost .      **
158c0 20 6c 6f 6f 70 29 2e 0a 20 20 20 20 20 20 2a 2f   loop)..      */
158d0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 53 51  .      while( SQ
158e0 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 70  LITE_OK==(rc = p
158f0 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70 2c 20  ager_recycle(p, 
15900 69 2c 20 26 70 50 67 29 29 20 26 26 20 70 50 67  i, &pPg)) && pPg
15910 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57  ) {.        /* W
15920 65 27 76 65 20 66 6f 75 6e 64 20 61 20 70 61 67  e've found a pag
15930 65 20 74 6f 20 66 72 65 65 2e 20 41 74 20 74 68  e to free. At th
15940 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70 61 67  is point the pag
15950 65 20 68 61 73 20 62 65 65 6e 20 0a 20 20 20 20  e has been .    
15960 20 20 20 20 2a 2a 20 72 65 6d 6f 76 65 64 20 66      ** removed f
15970 72 6f 6d 20 74 68 65 20 70 61 67 65 20 68 61 73  rom the page has
15980 68 2d 74 61 62 6c 65 2c 20 66 72 65 65 2d 6c 69  h-table, free-li
15990 73 74 20 61 6e 64 20 73 79 6e 63 65 64 2d 6c 69  st and synced-li
159a0 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28  st .        ** (
159b0 70 46 69 72 73 74 53 79 6e 63 65 64 29 2e 20 49  pFirstSynced). I
159c0 74 20 69 73 20 73 74 69 6c 6c 20 69 6e 20 74 68  t is still in th
159d0 65 20 61 6c 6c 20 70 61 67 65 73 20 28 70 41 6c  e all pages (pAl
159e0 6c 29 20 6c 69 73 74 2e 20 0a 20 20 20 20 20 20  l) list. .      
159f0 20 20 2a 2a 20 52 65 6d 6f 76 65 20 69 74 20 66    ** Remove it f
15a00 72 6f 6d 20 74 68 69 73 20 6c 69 73 74 20 62 65  rom this list be
15a10 66 6f 72 65 20 66 72 65 65 69 6e 67 2e 0a 20 20  fore freeing..  
15a20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
15a30 20 2a 2a 20 54 6f 64 6f 3a 20 43 68 65 63 6b 20   ** Todo: Check 
15a40 74 68 65 20 50 61 67 65 72 2e 70 53 74 6d 74 20  the Pager.pStmt 
15a50 6c 69 73 74 20 74 6f 20 6d 61 6b 65 20 73 75 72  list to make sur
15a60 65 20 74 68 69 73 20 69 73 20 4f 6b 2e 20 49 74  e this is Ok. It
15a70 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f   .        ** pro
15a80 62 61 62 6c 79 20 69 73 20 74 68 6f 75 67 68 2e  bably is though.
15a90 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
15aa0 20 20 20 20 50 67 48 64 72 20 2a 70 54 6d 70 3b      PgHdr *pTmp;
15ab0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
15ac0 20 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20   pPg );.        
15ad0 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d  page_remove_from
15ae0 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b  _stmt_list(pPg);
15af0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 67  .        if( pPg
15b00 3d 3d 70 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20  ==p->pAll ){.   
15b10 20 20 20 20 20 20 20 20 70 2d 3e 70 41 6c 6c 20          p->pAll 
15b20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b  = pPg->pNextAll;
15b30 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
15b40 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 20 70            for( p
15b50 54 6d 70 3d 70 2d 3e 70 41 6c 6c 3b 20 70 54 6d  Tmp=p->pAll; pTm
15b60 70 2d 3e 70 4e 65 78 74 41 6c 6c 21 3d 70 50 67  p->pNextAll!=pPg
15b70 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65  ; pTmp=pTmp->pNe
15b80 78 74 41 6c 6c 20 29 7b 7d 0a 20 20 20 20 20 20  xtAll ){}.      
15b90 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41      pTmp->pNextA
15ba0 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  ll = pPg->pNextA
15bb0 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ll;.        }.  
15bc0 20 20 20 20 20 20 6e 52 65 6c 65 61 73 65 64 20        nReleased 
15bd0 2b 3d 20 73 71 6c 69 74 65 41 6c 6c 6f 63 53 69  += sqliteAllocSi
15be0 7a 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  ze(pPg);.       
15bf0 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29   sqliteFree(pPg)
15c00 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
15c10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15c20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  OK ){.        /*
15c30 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65   An error occure
15c40 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67  d whilst writing
15c50 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
15c60 20 66 69 6c 65 20 6f 72 20 0a 20 20 20 20 20 20   file or .      
15c70 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 20    ** journal in 
15c80 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 29 2e  pager_recycle().
15c90 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 6e 6f   The error is no
15ca0 74 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  t returned to th
15cb0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  e .        ** ca
15cc0 6c 6c 65 72 20 6f 66 20 74 68 69 73 20 66 75 6e  ller of this fun
15cd0 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 2c 20  ction. Instead, 
15ce0 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 65 72  set the Pager.er
15cf0 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a  rCode variable..
15d00 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65          ** The e
15d10 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65 74  rror will be ret
15d20 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65  urned to the use
15d30 72 20 28 6f 72 20 75 73 65 72 73 2c 20 69 6e 20  r (or users, in 
15d40 74 68 65 20 63 61 73 65 20 0a 20 20 20 20 20 20  the case .      
15d50 20 20 2a 2a 20 6f 66 20 61 20 73 68 61 72 65 64    ** of a shared
15d60 20 70 61 67 65 72 20 63 61 63 68 65 29 20 6f 66   pager cache) of
15d70 20 74 68 65 20 70 61 67 65 72 20 66 6f 72 20 77   the pager for w
15d80 68 69 63 68 20 74 68 65 20 65 72 72 6f 72 20 6f  hich the error o
15d90 63 63 75 72 65 64 2e 0a 20 20 20 20 20 20 20 20  ccured..        
15da0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
15db0 74 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51  t( (rc&0xff)==SQ
15dc0 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 20 72 63  LITE_IOERR || rc
15dd0 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b  ==SQLITE_FULL );
15de0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
15df0 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52   p->state>=PAGER
15e00 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20  _RESERVED );.   
15e10 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
15e20 28 70 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 7d  (p, rc);.      }
15e30 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
15e40 74 75 72 6e 20 6e 52 65 6c 65 61 73 65 64 3b 0a  turn nReleased;.
15e50 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
15e60 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
15e70 5f 4d 41 4e 41 47 45 4d 45 4e 54 20 2a 2f 0a 0a  _MANAGEMENT */..
15e80 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
15e90 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
15ea0 20 6f 62 74 61 69 6e 20 74 68 65 20 73 68 61 72   obtain the shar
15eb0 65 64 20 6c 6f 63 6b 20 72 65 71 75 69 72 65 64  ed lock required
15ec0 20 62 65 66 6f 72 65 0a 2a 2a 20 64 61 74 61 20   before.** data 
15ed0 6d 61 79 20 62 65 20 72 65 61 64 20 66 72 6f 6d  may be read from
15ee0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
15ef0 2e 20 49 66 20 74 68 65 20 73 68 61 72 65 64 20  . If the shared 
15f00 6c 6f 63 6b 20 68 61 73 20 61 6c 72 65 61 64 79  lock has already
15f10 0a 2a 2a 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  .** been obtaine
15f20 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
15f30 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
15f40 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
15f50 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72  SharedLock(Pager
15f60 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
15f70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15f80 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
15f90 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
15fa0 4f 43 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 21  OCK ){.    if( !
15fb0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 61  MEMDB ){.      a
15fc0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
15fd0 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Ref==0 );.      
15fe0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52  if( !pPager->noR
15ff0 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  eadlock ){.     
16000 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
16010 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
16020 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
16030 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
16040 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16050 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
16060 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
16070 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
16080 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
16090 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
160a0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
160b0 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
160c0 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
160d0 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e   file exists, an
160e0 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45  d there is no RE
160f0 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
16100 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
16110 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
16120 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
16130 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
16140 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
16150 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
16160 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70   hasHotJournal(p
16170 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
16180 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c    /* Get an EXCL
16190 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
161a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
161b0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   At this point i
161c0 74 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  t is.        ** 
161d0 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
161e0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
161f0 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f  s not obtained o
16200 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65  n the way to the
16210 0a 20 20 20 20 20 20 20 20 2a 2a 20 45 58 43 4c  .        ** EXCL
16220 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69  USIVE lock. If i
16230 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20  t were, another 
16240 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70  process might op
16250 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  en the.        *
16260 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
16270 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45   detect the RESE
16280 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63  RVED lock, and c
16290 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65  onclude that the
162a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
162b0 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20  base is safe to 
162c0 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20  read while this 
162d0 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
162e0 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20   rolling it .   
162f0 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20       ** back..  
16300 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
16310 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65    ** Because the
16320 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45   intermediate RE
16330 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
16340 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  ot requested, th
16350 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 63  e.        ** sec
16360 6f 6e 64 20 70 72 6f 63 65 73 73 20 77 69 6c 6c  ond process will
16370 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69   get to this poi
16380 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61  nt in the code a
16390 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20 20 20 20  nd fail to.     
163a0 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74 27     ** obtain it'
163b0 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20  s own EXCLUSIVE 
163c0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
163d0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20  base file..     
163e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63     */.        rc
163f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
16400 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43  (pPager->fd, EXC
16410 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
16420 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
16430 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16440 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63       pager_unloc
16450 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
16460 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65       return page
16470 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
16480 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rc);.        }. 
16490 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
164a0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
164b0 4c 55 53 49 56 45 3b 0a 20 0a 20 20 20 20 20 20  LUSIVE;. .      
164c0 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
164d0 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e  urnal for readin
164e0 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20  g only.  Return 
164f0 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20  SQLITE_BUSY if. 
16500 20 20 20 20 20 20 20 2a 2a 20 77 65 20 61 72 65         ** we are
16510 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20   unable to open 
16520 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
16530 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  . .        **.  
16540 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75        ** The jou
16550 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  rnal file does n
16560 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f  ot need to be lo
16570 63 6b 65 64 20 69 74 73 65 6c 66 2e 20 20 54 68  cked itself.  Th
16580 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  e.        ** jou
16590 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76  rnal file is nev
165a0 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74  er open unless t
165b0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
165c0 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20   file holds.    
165d0 20 20 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c      ** a write l
165e0 6f 63 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73  ock, so there is
165f0 20 6e 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63   never any chanc
16600 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  e of two or more
16610 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63  .        ** proc
16620 65 73 73 65 73 20 6f 70 65 6e 69 6e 67 20 74 68  esses opening th
16630 65 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 65  e journal at the
16640 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20   same time..    
16650 20 20 20 20 2a 2a 0a 09 2a 2a 20 4f 70 65 6e 20      **..** Open 
16660 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20  the journal for 
16670 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
16680 73 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  s. This is becau
16690 73 65 20 69 6e 20 0a 09 2a 2a 20 65 78 63 6c 75  se in ..** exclu
166a0 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
166b0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
166c0 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70  ptor will be kep
166d0 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20  t open and.     
166e0 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75     ** possibly u
166f0 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61  sed for a transa
16700 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20  ction later on. 
16710 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c  On some systems,
16720 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
16730 4f 73 54 72 75 6e 63 61 74 65 28 29 20 63 61 6c  OsTruncate() cal
16740 6c 20 75 73 65 64 20 69 6e 20 65 78 63 6c 75 73  l used in exclus
16750 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
16760 61 6c 73 6f 20 72 65 71 75 69 72 65 73 0a 20 20  also requires.  
16770 20 20 20 20 20 20 2a 2a 20 61 20 72 65 61 64 2f        ** a read/
16780 77 72 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c  write file handl
16790 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
167a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
167b0 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
167c0 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  if( sqlite3OsFil
167d0 65 45 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e  eExists(pPager->
167e0 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20  zJournal) ){.   
167f0 20 20 20 20 20 20 20 69 6e 74 20 72 6f 3b 0a 20         int ro;. 
16800 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
16810 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57  lite3OsOpenReadW
16820 72 69 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  rite(pPager->zJo
16830 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e  urnal, &pPager->
16840 6a 66 64 2c 20 26 72 6f 29 3b 0a 20 20 20 20 20  jfd, &ro);.     
16850 20 20 20 20 20 69 66 28 20 72 6f 20 29 7b 0a 20       if( ro ){. 
16860 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
16870 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
16880 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16890 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
168a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
168b0 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f            pager_
168c0 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
168d0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
168e0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
168f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16900 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
16910 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  pen = 1;.       
16920 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
16930 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
16940 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
16950 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
16960 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74       pPager->set
16970 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
16980 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
16990 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20  nalHdr = 0;. .  
169a0 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63        /* Playbac
169b0 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
169c0 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20   journal.  Drop 
169d0 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69  the database wri
169e0 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f  te.        ** lo
169f0 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65  ck and reacquire
16a00 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
16a10 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
16a20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
16a30 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31  ayback(pPager, 1
16a40 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
16a50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16a60 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
16a70 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
16a80 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
16a90 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
16aa0 72 74 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65  rt(pPager->state
16ab0 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c  ==PAGER_SHARED |
16ac0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  | .            (
16ad0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
16ae0 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  eMode && pPager-
16af0 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48 41  >state>PAGER_SHA
16b00 52 45 44 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  RED).        );.
16b10 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
16b20 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20  f( pPager->pAll 
16b30 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 64 72  ){.        PgHdr
16b40 20 2a 70 50 61 67 65 31 20 3d 20 70 61 67 65 72   *pPage1 = pager
16b50 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
16b60 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
16b70 70 50 61 67 65 31 20 29 7b 0a 20 20 20 20 20 20  pPage1 ){.      
16b80 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68      unlinkHashCh
16b90 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67  ain(pPager, pPag
16ba0 65 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  e1);.        }..
16bb0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16bc0 21 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50  !pager_lookup(pP
16bd0 61 67 65 72 2c 20 31 29 20 29 3b 0a 20 20 20 20  ager, 1) );.    
16be0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16bf0 50 61 67 65 72 41 63 71 75 69 72 65 28 70 50 61  PagerAcquire(pPa
16c00 67 65 72 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  ger, 1, &pPage1,
16c10 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
16c20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16c30 7b 0a 09 20 20 2f 2a 20 54 68 65 20 63 68 61 6e  {..  /* The chan
16c40 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 73 74  ge-counter is st
16c50 6f 72 65 64 20 61 74 20 6f 66 66 73 65 74 20 32  ored at offset 2
16c60 34 2e 20 53 65 65 20 61 6c 73 6f 0a 20 20 20 20  4. See also.    
16c70 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 69        ** pager_i
16c80 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
16c90 72 28 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  r()..          *
16ca0 2f 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  /.          u32 
16cb0 69 43 68 61 6e 67 65 43 6f 75 6e 74 20 3d 20 72  iChangeCount = r
16cc0 65 74 72 69 65 76 65 33 32 62 69 74 73 28 70 50  etrieve32bits(pP
16cd0 61 67 65 31 2c 20 32 34 29 3b 0a 20 20 20 20 20  age1, 24);.     
16ce0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
16cf0 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 73  f++;.          s
16d00 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
16d10 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20  (pPage1);.      
16d20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66      pPager->nRef
16d30 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  --;.          if
16d40 28 20 69 43 68 61 6e 67 65 43 6f 75 6e 74 21 3d  ( iChangeCount!=
16d50 70 50 61 67 65 72 2d 3e 69 43 68 61 6e 67 65 43  pPager->iChangeC
16d60 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ount ){.        
16d70 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
16d80 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
16d90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
16da0 50 61 67 65 72 2d 3e 69 43 68 61 6e 67 65 43 6f  Pager->iChangeCo
16db0 75 6e 74 20 3d 20 69 43 68 61 6e 67 65 43 6f 75  unt = iChangeCou
16dc0 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nt;.        }.  
16dd0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
16de0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
16df0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
16e00 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 3d   pPager->state<=
16e10 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
16e20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
16e30 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
16e40 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  OCK ){.      pPa
16e50 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
16e60 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d  ER_SHARED;.    }
16e70 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
16e80 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  c;.}../*.** Acqu
16e90 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a  ire a page..**.*
16ea0 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  * A read lock on
16eb0 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69   the disk file i
16ec0 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65 6e 20  s obtained when 
16ed0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 69  the first page i
16ee0 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20  s acquired. .** 
16ef0 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b 20 69  This read lock i
16f00 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e 20 74  s dropped when t
16f10 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 73 20  he last page is 
16f20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  released..**.** 
16f30 41 20 5f 67 65 74 20 77 6f 72 6b 73 20 66 6f 72  A _get works for
16f40 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62 65 72   any page number
16f50 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 2e   greater than 0.
16f60 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
16f70 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d 61  e.** file is sma
16f80 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  ller than the re
16f90 71 75 65 73 74 65 64 20 70 61 67 65 2c 20 74 68  quested page, th
16fa0 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64 69 73  en no actual dis
16fb0 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75 72 73  k.** read occurs
16fc0 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20   and the memory 
16fd0 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70 61 67  image of the pag
16fe0 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  e is initialized
16ff0 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73   to.** all zeros
17000 2e 20 20 54 68 65 20 65 78 74 72 61 20 64 61 74  .  The extra dat
17010 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20  a appended to a 
17020 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69  page is always i
17030 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f  nitialized.** to
17040 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72 73 74   zeros the first
17050 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20   time a page is 
17060 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f  loaded into memo
17070 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63  ry..**.** The ac
17080 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20  quisition might 
17090 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c  fail for several
170a0 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c   reasons.  In al
170b0 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61  l cases,.** an a
170c0 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
170d0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
170e0 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73  d and *ppPage is
170f0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
17100 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
17110 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
17120 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f  ).  Both this ro
17130 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b 75  utine and _looku
17140 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  p() attempt.** t
17150 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e  o find a page in
17160 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
17170 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20  ache first.  If 
17180 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
17190 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65  already.** in me
171a0 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69  mory, this routi
171b0 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20  ne goes to disk 
171c0 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68  to read it in wh
171d0 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70 28 29 0a  ereas _lookup().
171e0 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  ** just returns 
171f0 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  0.  This routine
17200 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64   acquires a read
17210 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20  -lock the first 
17220 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74  time it.** has t
17230 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e  o go to disk, an
17240 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61  d could also pla
17250 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75  yback an old jou
17260 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
17270 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f 6f  y..** Since _loo
17280 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73  kup() never goes
17290 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76   to disk, it nev
172a0 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77  er has to deal w
172b0 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20  ith locks.** or 
172c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
172d0 2a 0a 2a 2a 20 49 66 20 63 6c 72 46 6c 61 67 20  *.** If clrFlag 
172e0 69 73 20 66 61 6c 73 65 2c 20 74 68 65 20 70 61  is false, the pa
172f0 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
17300 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72  actually read fr
17310 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 49 66 20 63  om disk..** If c
17320 6c 66 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20  lfFlag is true, 
17330 69 74 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67  it means the pag
17340 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65  e is about to be
17350 20 65 72 61 73 65 64 20 61 6e 64 0a 2a 2a 20 72   erased and.** r
17360 65 77 72 69 74 74 65 6e 20 77 69 74 68 6f 75 74  ewritten without
17370 20 66 69 72 73 74 20 62 65 69 6e 67 20 72 65 61   first being rea
17380 64 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f  d so there is no
17390 20 70 6f 69 6e 74 20 69 74 20 64 6f 69 6e 67 0a   point it doing.
173a0 2a 2a 20 74 68 65 20 64 69 73 6b 20 49 2f 4f 2e  ** the disk I/O.
173b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
173c0 61 67 65 72 41 63 71 75 69 72 65 28 50 61 67 65  agerAcquire(Page
173d0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
173e0 70 67 6e 6f 2c 20 44 62 50 61 67 65 20 2a 2a 70  pgno, DbPage **p
173f0 70 50 61 67 65 2c 20 69 6e 74 20 63 6c 72 46 6c  pPage, int clrFl
17400 61 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ag){.  PgHdr *pP
17410 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  g;.  int rc;..  
17420 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
17430 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
17440 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  OCK || pPager->n
17450 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31  Ref>0 || pgno==1
17460 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61   );..  /* The ma
17470 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65  ximum page numbe
17480 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72  r is 2^31. Retur
17490 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
174a0 20 69 66 20 61 20 70 61 67 65 0a 20 20 2a 2a 20   if a page.  ** 
174b0 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74  number greater t
174c0 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65 72  han this, or zer
174d0 6f 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e  o, is requested.
174e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f  .  */.  if( pgno
174f0 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20  >PAGER_MAX_PGNO 
17500 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67  || pgno==0 || pg
17510 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
17520 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
17530 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
17540 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
17550 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
17560 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74   we have not hit
17570 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72   any critical er
17580 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73  rors..  */ .  as
17590 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
175a0 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30  );.  *ppPage = 0
175b0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
175c0 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65  errCode && pPage
175d0 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
175e0 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72  TE_FULL ){.    r
175f0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
17600 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rCode;.  }..  /*
17610 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
17620 66 69 72 73 74 20 70 61 67 65 20 61 63 63 65 73  first page acces
17630 73 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20  sed, then get a 
17640 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a  SHARED lock.  **
17650 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
17660 20 66 69 6c 65 2e 20 70 61 67 65 72 53 68 61 72   file. pagerShar
17670 65 64 4c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f  edLock() is a no
17680 2d 6f 70 20 69 66 20 0a 20 20 2a 2a 20 61 20 64  -op if .  ** a d
17690 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 69 73 20  atabase lock is 
176a0 61 6c 72 65 61 64 79 20 68 65 6c 64 2e 0a 20 20  already held..  
176b0 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 53  */.  rc = pagerS
176c0 68 61 72 65 64 4c 6f 63 6b 28 70 50 61 67 65 72  haredLock(pPager
176d0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
176e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
176f0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
17700 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
17710 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
17720 43 4b 20 29 3b 0a 0a 20 20 70 50 67 20 3d 20 70  CK );..  pPg = p
17730 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
17740 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
17750 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   pPg==0 ){.    /
17760 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
17770 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74  page is not in t
17780 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a  he page cache. *
17790 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a  /.    int nMax;.
177a0 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 54      int h;.    T
177b0 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  EST_INCR(pPager-
177c0 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 69 66 28  >nMiss);.    if(
177d0 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70   pPager->nPage<p
177e0 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c  Pager->mxPage ||
177f0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d   pPager->pFirst=
17800 3d 30 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 0a 20  =0 || MEMDB ||. 
17810 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
17820 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20  pFirstSynced==0 
17830 26 26 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  && pPager->doNot
17840 53 79 6e 63 29 0a 20 20 20 20 29 7b 0a 20 20 20  Sync).    ){.   
17850 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e     /* Create a n
17860 65 77 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ew page */.     
17870 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61   if( pPager->nPa
17880 67 65 3e 3d 70 50 61 67 65 72 2d 3e 6e 48 61 73  ge>=pPager->nHas
17890 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67  h ){.        pag
178a0 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f 74  er_resize_hash_t
178b0 61 62 6c 65 28 70 50 61 67 65 72 2c 0a 20 20 20  able(pPager,.   
178c0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
178d0 6e 48 61 73 68 3c 32 35 36 20 3f 20 32 35 36 20  nHash<256 ? 256 
178e0 3a 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2a  : pPager->nHash*
178f0 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  2);.        if( 
17900 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 3d 3d 30  pPager->nHash==0
17910 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
17920 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
17930 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  M;.        }.   
17940 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 20 3d     }.      pPg =
17950 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
17960 28 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b  ( sizeof(*pPg) +
17970 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
17980 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
17990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179a0 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20  + sizeof(u32) + 
179b0 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20  pPager->nExtra. 
179c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 4d               + M
179e0 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67 48 69  EMDB*sizeof(PgHi
179f0 73 74 6f 72 79 29 20 29 3b 0a 20 20 20 20 20 20  story) );.      
17a00 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
17a10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
17a20 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
17a30 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
17a40 70 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  pPg, 0, sizeof(*
17a50 70 50 67 29 29 3b 0a 20 20 20 20 20 20 69 66 28  pPg));.      if(
17a60 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
17a70 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
17a80 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
17a90 65 72 29 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50  er), 0, sizeof(P
17aa0 67 48 69 73 74 6f 72 79 29 29 3b 0a 20 20 20 20  gHistory));.    
17ab0 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70    }.      pPg->p
17ac0 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
17ad0 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
17ae0 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41  All = pPager->pA
17af0 6c 6c 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ll;.      pPager
17b00 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20  ->pAll = pPg;.  
17b10 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67      pPager->nPag
17b20 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e++;.      if( p
17b30 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e 70 50 61  Pager->nPage>pPa
17b40 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 20 29 7b  ger->nMaxPage ){
17b50 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
17b60 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67   pPager->nMaxPag
17b70 65 3d 3d 28 70 50 61 67 65 72 2d 3e 6e 50 61 67  e==(pPager->nPag
17b80 65 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20  e-1) );.        
17b90 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65  pPager->nMaxPage
17ba0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
17bb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
17bc0 3d 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28  = pager_recycle(
17bd0 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 29  pPager, 1, &pPg)
17be0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
17bf0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17c00 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
17c10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
17c20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
17c30 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ate>=SHARED_LOCK
17c40 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
17c50 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pPg);.    }.   
17c60 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e   pPg->pgno = pgn
17c70 6f 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  o;.    if( pPage
17c80 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26  r->aInJournal &&
17c90 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67   (int)pgno<=pPag
17ca0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
17cb0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  {.      sqlite3C
17cc0 68 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67 65  heckMemory(pPage
17cd0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->aInJournal, p
17ce0 67 6e 6f 2f 38 29 3b 0a 20 20 20 20 20 20 61 73  gno/8);.      as
17cf0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
17d00 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20  urnalOpen );.   
17d10 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
17d20 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e 61 49 6e  l = (pPager->aIn
17d30 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20  Journal[pgno/8] 
17d40 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29  & (1<<(pgno&7)))
17d50 21 3d 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  !=0;.      pPg->
17d60 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
17d70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
17d80 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
17d90 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  0;.      pPg->ne
17da0 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
17db0 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
17dc0 2d 3e 61 49 6e 53 74 6d 74 20 26 26 20 28 69 6e  ->aInStmt && (in
17dd0 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  t)pgno<=pPager->
17de0 73 74 6d 74 53 69 7a 65 0a 20 20 20 20 20 20 20  stmtSize.       
17df0 20 20 20 20 20 20 26 26 20 28 70 50 61 67 65 72        && (pPager
17e00 2d 3e 61 49 6e 53 74 6d 74 5b 70 67 6e 6f 2f 38  ->aInStmt[pgno/8
17e10 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29  ] & (1<<(pgno&7)
17e20 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ))!=0 ){.      p
17e30 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
17e40 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d  list(pPg);.    }
17e50 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 61 67 65  else{.      page
17e60 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d  _remove_from_stm
17e70 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
17e80 20 7d 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e   }.    makeClean
17e90 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e  (pPg);.    pPg->
17ea0 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 52 45  nRef = 1;.    RE
17eb0 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 20  FINFO(pPg);..   
17ec0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b   pPager->nRef++;
17ed0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
17ee0 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20 20  >nExtra>0 ){.   
17ef0 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
17f00 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50  TO_EXTRA(pPg, pP
17f10 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67 65 72  ager), 0, pPager
17f20 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 7d  ->nExtra);.    }
17f30 0a 20 20 20 20 6e 4d 61 78 20 3d 20 73 71 6c 69  .    nMax = sqli
17f40 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
17f50 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  t(pPager);.    i
17f60 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
17f70 64 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  de ){.      sqli
17f80 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
17f90 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  g);.      rc = p
17fa0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
17fb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
17fc0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50  .    }..    /* P
17fd0 6f 70 75 6c 61 74 65 20 74 68 65 20 70 61 67 65  opulate the page
17fe0 20 77 69 74 68 20 64 61 74 61 2c 20 65 69 74 68   with data, eith
17ff0 65 72 20 62 79 20 72 65 61 64 69 6e 67 20 66 72  er by reading fr
18000 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  om the database.
18010 20 20 20 20 2a 2a 20 66 69 6c 65 2c 20 6f 72 20      ** file, or 
18020 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 65  by setting the e
18030 6e 74 69 72 65 20 70 61 67 65 20 74 6f 20 7a 65  ntire page to ze
18040 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ro..    */.    i
18050 66 28 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67 6e  f( nMax<(int)pgn
18060 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 28 63  o || MEMDB || (c
18070 6c 72 46 6c 61 67 20 26 26 20 21 70 50 61 67 65  lrFlag && !pPage
18080 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
18090 6b 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  k) ){.      mems
180a0 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  et(PGHDR_TO_DATA
180b0 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72  (pPg), 0, pPager
180c0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
180d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
180e0 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29  sert( MEMDB==0 )
180f0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
18100 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
18110 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a  r->fd, (pgno-1)*
18120 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
18130 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  eSize);.      if
18140 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18150 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
18160 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
18170 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f  ager->fd, PGHDR_
18180 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 0a 20 20  TO_DATA(pPg),.  
18190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181a0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
181b0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
181c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 49 4f 54       }.      IOT
181d0 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25  RACE(("PGIN %p %
181e0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
181f0 6e 6f 29 29 0a 20 20 20 20 20 20 50 41 47 45 52  no)).      PAGER
18200 54 52 41 43 45 33 28 22 46 45 54 43 48 20 25 64  TRACE3("FETCH %d
18210 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
18220 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
18230 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
18240 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 50  CODEC1(pPager, P
18250 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
18260 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29  ), pPg->pgno, 3)
18270 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
18280 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
18290 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
182a0 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
182b0 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20      pPg->pgno = 
182c0 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
182d0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
182e0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
182f0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n rc;.      }els
18300 65 7b 0a 20 20 20 20 20 20 20 20 54 45 53 54 5f  e{.        TEST_
18310 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65  INCR(pPager->nRe
18320 61 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ad);.      }.   
18330 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20   }..    /* Link 
18340 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68  the page into th
18350 65 20 70 61 67 65 20 68 61 73 68 20 74 61 62 6c  e page hash tabl
18360 65 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67 6e  e */.    h = pgn
18370 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61  o & (pPager->nHa
18380 73 68 2d 31 29 3b 0a 20 20 20 20 61 73 73 65 72  sh-1);.    asser
18390 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20  t( pgno!=0 );.  
183a0 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
183b0 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68   = pPager->aHash
183c0 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  [h];.    pPager-
183d0 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b  >aHash[h] = pPg;
183e0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e  .    if( pPg->pN
183f0 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20  extHash ){.     
18400 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e   assert( pPg->pN
18410 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61  extHash->pPrevHa
18420 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  sh==0 );.      p
18430 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
18440 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a  PrevHash = pPg;.
18450 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
18460 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
18470 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
18480 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
18490 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
184a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
184b0 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70   The requested p
184c0 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 70 61  age is in the pa
184d0 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  ge cache. */.   
184e0 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
184f0 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d  nRef>0 || pgno==
18500 31 29 3b 0a 20 20 20 20 54 45 53 54 5f 49 4e 43  1);.    TEST_INC
18510 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b  R(pPager->nHit);
18520 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28 70 50  .    page_ref(pP
18530 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67  g);.  }.  *ppPag
18540 65 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72  e = pPg;.  retur
18550 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
18560 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
18570 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c  page if it is al
18580 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d  ready in the in-
18590 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44  memory cache.  D
185a0 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68  o.** not read th
185b0 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b  e page from disk
185c0 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
185d0 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c  ter to the page,
185e0 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20  .** or 0 if the 
185f0 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
18600 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  ache..**.** See 
18610 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
18620 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66  rGet().  The dif
18630 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
18640 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
18650 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
18660 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67  Get() is that _g
18670 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20  et() will go to 
18680 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61  the disk and rea
18690 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65  d.** in the page
186a0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
186b0 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63  not already in c
186c0 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
186d0 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e  ine.** returns N
186e0 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20  ULL if the page 
186f0 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
18700 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f  or if a disk I/O
18710 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65   error .** has e
18720 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f  ver happened..*/
18730 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33  .DbPage *sqlite3
18740 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65  PagerLookup(Page
18750 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
18760 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
18770 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pPg;..  assert( 
18780 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
18790 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
187a0 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
187b0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
187c0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
187d0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 70 41 6c  rt( !pPager->pAl
187e0 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 78 63  l || pPager->exc
187f0 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a 20 20  lusiveMode );.  
18800 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
18810 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
18820 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  rCode && pPager-
18830 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
18840 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74  _FULL ){.    ret
18850 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67  urn 0;.  }.  pPg
18860 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
18870 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
18880 20 69 66 28 20 70 50 67 3d 3d 30 20 29 20 72 65   if( pPg==0 ) re
18890 74 75 72 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72  turn 0;.  page_r
188a0 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72  ef(pPg);.  retur
188b0 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n pPg;.}../*.** 
188c0 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a  Release a page..
188d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  **.** If the num
188e0 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
188f0 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72  s to the page dr
18900 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  op to zero, then
18910 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20   the.** page is 
18920 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55  added to the LRU
18930 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c   list.  When all
18940 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
18950 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20  ll pages.** are 
18960 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c  released, a roll
18970 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20  back occurs and 
18980 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
18990 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72  database is.** r
189a0 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  emoved..*/.int s
189b0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
189c0 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 0a  (DbPage *pPg){..
189d0 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
189e0 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
189f0 6e 74 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  nt for this page
18a00 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
18a10 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pPg->nRef>0 );. 
18a20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20   pPg->nRef--;.  
18a30 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20  REFINFO(pPg);.. 
18a40 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29   CHECK_PAGE(pPg)
18a50 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  ;..  /* When the
18a60 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
18a70 65 6e 63 65 73 20 74 6f 20 61 20 70 61 67 65 20  ences to a page 
18a80 72 65 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68  reach 0, call th
18a90 65 0a 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f  e.  ** destructo
18aa0 72 20 61 6e 64 20 61 64 64 20 74 68 65 20 70 61  r and add the pa
18ab0 67 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ge to the freeli
18ac0 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
18ad0 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Pg->nRef==0 ){. 
18ae0 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
18af0 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 70  ;.    pPager = p
18b00 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20  Pg->pPager;.    
18b10 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  pPg->pNextFree =
18b20 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72   0;.    pPg->pPr
18b30 65 76 46 72 65 65 20 3d 20 70 50 61 67 65 72 2d  evFree = pPager-
18b40 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70 50 61 67  >pLast;.    pPag
18b50 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b  er->pLast = pPg;
18b60 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50  .    if( pPg->pP
18b70 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20  revFree ){.     
18b80 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d   pPg->pPrevFree-
18b90 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
18ba0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18bb0 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
18bc0 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20  t = pPg;.    }. 
18bd0 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64     if( pPg->need
18be0 53 79 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65  Sync==0 && pPage
18bf0 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d  r->pFirstSynced=
18c00 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  =0 ){.      pPag
18c10 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
18c20 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
18c30 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44    if( pPager->xD
18c40 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20  estructor ){.   
18c50 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74     pPager->xDest
18c60 72 75 63 74 6f 72 28 70 50 67 2c 20 70 50 61 67  ructor(pPg, pPag
18c70 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
18c80 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57     }.  .    /* W
18c90 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65  hen all pages re
18ca0 61 63 68 20 74 68 65 20 66 72 65 65 6c 69 73 74  ach the freelist
18cb0 2c 20 64 72 6f 70 20 74 68 65 20 72 65 61 64 20  , drop the read 
18cc0 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  lock from.    **
18cd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18ce0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  le..    */.    p
18cf0 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  Pager->nRef--;. 
18d00 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
18d10 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20  r->nRef>=0 );.  
18d20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52    if( pPager->nR
18d30 65 66 3d 3d 30 20 26 26 20 28 21 70 50 61 67 65  ef==0 && (!pPage
18d40 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
18d50 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
18d60 6e 61 6c 4f 66 66 3e 30 29 20 29 7b 0a 20 20 20  nalOff>0) ){.   
18d70 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e     pagerUnlockAn
18d80 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
18d90 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
18da0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18db0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
18dc0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
18dd0 66 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68 65  for pPager.  The
18de0 72 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  re should alread
18df0 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44 0a  y be a RESERVED.
18e00 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ** or EXCLUSIVE 
18e10 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
18e20 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74  base file when t
18e30 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
18e40 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  alled..**.** Ret
18e50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
18e60 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65   everything.  Re
18e70 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
18e80 64 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74  de and release t
18e90 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b  he.** write lock
18ea0 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
18eb0 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
18ec0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65  ic int pager_ope
18ed0 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  n_journal(Pager 
18ee0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
18ef0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d  rc;.  assert( !M
18f00 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
18f10 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
18f20 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
18f30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
18f40 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
18f50 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
18f60 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
18f70 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
18f80 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
18f90 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69  nal==0 );.  sqli
18fa0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
18fb0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  t(pPager);.  pPa
18fc0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
18fd0 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
18fe0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38  pPager->dbSize/8
18ff0 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50   + 1 );.  if( pP
19000 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
19010 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
19020 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
19030 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f    goto failed_to
19040 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20  _open_journal;. 
19050 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
19060 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  3OsOpenExclusive
19070 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
19080 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  l, &pPager->jfd,
19090 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
190a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190b0 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
190c0 6c 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  le);.  pPager->j
190d0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
190e0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
190f0 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  er = 0;.  pPager
19100 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
19110 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
19120 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
19130 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  o failed_to_open
19140 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20  _journal;.  }.  
19150 73 71 6c 69 74 65 33 4f 73 53 65 74 46 75 6c 6c  sqlite3OsSetFull
19160 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
19170 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66  , pPager->full_f
19180 73 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  sync);.  sqlite3
19190 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63 28 70 50  OsSetFullSync(pP
191a0 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
191b0 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20  ->full_fsync);. 
191c0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69   sqlite3OsOpenDi
191d0 72 65 63 74 6f 72 79 28 70 50 61 67 65 72 2d 3e  rectory(pPager->
191e0 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 7a 44 69  jfd, pPager->zDi
191f0 72 65 63 74 6f 72 79 29 3b 0a 20 20 70 50 61 67  rectory);.  pPag
19200 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
19210 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  = 1;.  pPager->j
19220 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
19230 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  0;.  pPager->nee
19240 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61  dSync = 0;.  pPa
19250 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
19260 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ack = 0;.  pPage
19270 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69  r->nRec = 0;.  i
19280 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
19290 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  de ){.    rc = p
192a0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
192b0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f      goto failed_
192c0 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b  to_open_journal;
192d0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f  .  }.  pPager->o
192e0 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67  rigDbSize = pPag
192f0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72  er->dbSize;..  r
19300 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
19310 48 64 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  Hdr(pPager);..  
19320 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
19330 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d  Autoopen && rc==
19340 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19350 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
19360 65 72 53 74 6d 74 42 65 67 69 6e 28 70 50 61 67  erStmtBegin(pPag
19370 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  er);.  }.  if( r
19380 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
19390 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc!=SQLITE_NOMEM
193a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
193b0 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
193c0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
193d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
193e0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
193f0 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
19400 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
19410 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f  .failed_to_open_
19420 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74  journal:.  sqlit
19430 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49  eFree(pPager->aI
19440 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61  nJournal);.  pPa
19450 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
19460 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  = 0;.  if( rc==S
19470 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
19480 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61     /* If this wa
19490 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  s a malloc() fai
194a0 6c 75 72 65 2c 20 74 68 65 6e 20 77 65 20 77 69  lure, then we wi
194b0 6c 6c 20 6e 6f 74 20 62 65 20 63 6c 6f 73 69 6e  ll not be closin
194c0 67 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20  g the pager.    
194d0 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 64 65 6c 65  ** file. So dele
194e0 74 65 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66  te any journal f
194f0 69 6c 65 20 77 65 20 6d 61 79 20 68 61 76 65 20  ile we may have 
19500 6a 75 73 74 20 63 72 65 61 74 65 64 2e 20 4f 74  just created. Ot
19510 68 65 72 77 69 73 65 2c 0a 20 20 20 20 2a 2a 20  herwise,.    ** 
19520 74 68 65 20 73 79 73 74 65 6d 20 77 69 6c 6c 20  the system will 
19530 67 65 74 20 63 6f 6e 66 75 73 65 64 2c 20 77 65  get confused, we
19540 20 68 61 76 65 20 61 20 72 65 61 64 2d 6c 6f 63   have a read-loc
19550 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e  k on the file an
19560 64 20 61 0a 20 20 20 20 2a 2a 20 6d 79 73 74 65  d a.    ** myste
19570 72 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 61  rious journal ha
19580 73 20 61 70 70 65 61 72 65 64 20 69 6e 20 74 68  s appeared in th
19590 65 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a 20 20  e filesystem..  
195a0 20 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 71 6c 69    */.    /* sqli
195b0 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
195c0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 20 2a  er->zJournal); *
195d0 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  /.  }else{.    p
195e0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
195f0 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
19600 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63   rc;.}../*.** Ac
19610 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f  quire a write-lo
19620 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
19630 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73  se.  The lock is
19640 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a   removed when.**
19650 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20   the any of the 
19660 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e  following happen
19670 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  :.**.**   *  sql
19680 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 28  ite3PagerCommit(
19690 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
196a0 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65    *  sqlite3Page
196b0 72 52 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63  rRollback() is c
196c0 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
196d0 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
196e0 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
196f0 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67     *  sqlite3Pag
19700 65 72 55 6e 72 65 66 28 29 20 69 73 20 63 61 6c  erUnref() is cal
19710 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20  led to on every 
19720 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
19730 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
19740 74 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74  t parameter to t
19750 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
19760 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20   pointer to any 
19770 6f 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65  open page of the
19780 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
19790 65 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e  e.  Nothing chan
197a0 67 65 73 20 61 62 6f 75 74 20 74 68 65 20 70 61  ges about the pa
197b0 67 65 20 2d 20 69 74 20 69 73 20 75 73 65 64 20  ge - it is used 
197c0 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71  merely to.** acq
197d0 75 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74  uire a pointer t
197e0 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  o the Pager stru
197f0 63 74 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f  cture and as pro
19800 6f 66 20 74 68 61 74 20 74 68 65 72 65 20 69 73  of that there is
19810 0a 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65  .** already a re
19820 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad-lock on the d
19830 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
19840 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
19850 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f  ter indicates ho
19860 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20  w much space in 
19870 62 79 74 65 73 20 74 6f 20 72 65 73 65 72 76 65  bytes to reserve
19880 20 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72   for a.** master
19890 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61   journal file-na
198a0 6d 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  me at the start 
198b0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  of the journal w
198c0 68 65 6e 20 69 74 20 69 73 20 63 72 65 61 74 65  hen it is create
198d0 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e  d..**.** A journ
198e0 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  al file is opene
198f0 64 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74  d if this is not
19900 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
19910 65 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  e.  For temporar
19920 79 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20  y.** files, the 
19930 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a  opening of the j
19940 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64  ournal file is d
19950 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68  eferred until th
19960 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74  ere is an.** act
19970 75 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74  ual need to writ
19980 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
19990 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
199a0 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61  atabase is alrea
199b0 64 79 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  dy reserved for 
199c0 77 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f  writing, this ro
199d0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
199e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61  ..**.** If exFla
199f0 67 20 69 73 20 74 72 75 65 2c 20 67 6f 20 61 68  g is true, go ah
19a00 65 61 64 20 61 6e 64 20 67 65 74 20 61 6e 20 45  ead and get an E
19a10 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
19a20 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d   the file.** imm
19a30 65 64 69 61 74 65 6c 79 20 69 6e 73 74 65 61 64  ediately instead
19a40 20 6f 66 20 77 61 69 74 69 6e 67 20 75 6e 74 69   of waiting unti
19a50 6c 20 77 65 20 74 72 79 20 74 6f 20 66 6c 75 73  l we try to flus
19a60 68 20 74 68 65 20 63 61 63 68 65 2e 20 20 54 68  h the cache.  Th
19a70 65 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73 20 69  e.** exFlag is i
19a80 67 6e 6f 72 65 64 20 69 66 20 61 20 74 72 61 6e  gnored if a tran
19a90 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
19aa0 64 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e  dy active..*/.in
19ab0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  t sqlite3PagerBe
19ac0 67 69 6e 28 44 62 50 61 67 65 20 2a 70 50 67 2c  gin(DbPage *pPg,
19ad0 20 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20   int exFlag){.  
19ae0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
19af0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
19b00 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
19b10 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  K;.  assert( pPg
19b20 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73  ->nRef>0 );.  as
19b30 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
19b40 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
19b50 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  K );.  if( pPage
19b60 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
19b70 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73  SHARED ){.    as
19b80 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
19b90 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
19ba0 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
19bb0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
19bc0 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
19bd0 55 53 49 56 45 3b 0a 20 20 20 20 20 20 70 50 61  USIVE;.      pPa
19be0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
19bf0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
19c00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19c10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
19c20 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
19c30 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
19c40 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
19c50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19c60 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
19c70 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52  te = PAGER_RESER
19c80 56 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28  VED;.        if(
19c90 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20   exFlag ){.     
19ca0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
19cb0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
19cc0 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
19cd0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OCK);.        }.
19ce0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
19cf0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19d00 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
19d10 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
19d20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
19d30 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20  yCache = 0;.    
19d40 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 54    PAGERTRACE2("T
19d50 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22  RANSACTION %d\n"
19d60 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
19d70 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ));.      if( pP
19d80 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
19d90 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
19da0 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  pFile ){.       
19db0 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
19dc0 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
19dd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19de0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
19df0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
19e00 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
19e10 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  alOff==0 ){.    
19e20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  /* This happens 
19e30 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 77  when the pager w
19e40 61 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  as in exclusive-
19e50 61 63 63 65 73 73 20 6d 6f 64 65 20 6c 61 73 74  access mode last
19e60 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20 61 20 28  .    ** time a (
19e70 72 65 61 64 20 6f 72 20 77 72 69 74 65 29 20 74  read or write) t
19e80 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73  ransaction was s
19e90 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63  uccessfully conc
19ea0 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  luded.    ** by 
19eb0 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  this connection.
19ec0 20 49 6e 73 74 65 61 64 20 6f 66 20 64 65 6c 65   Instead of dele
19ed0 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ting the journal
19ee0 20 66 69 6c 65 20 69 74 20 77 61 73 20 0a 20 20   file it was .  
19ef0 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61    ** kept open a
19f00 6e 64 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  nd truncated to 
19f10 30 20 62 79 74 65 73 2e 0a 20 20 20 20 2a 2f 0a  0 bytes..    */.
19f20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
19f30 65 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20  er->nRec==0 );. 
19f40 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
19f50 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30  r->origDbSize==0
19f60 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
19f70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
19f80 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
19f90 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
19fa0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
19fb0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
19fc0 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d  ournal = sqliteM
19fd0 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64  alloc( pPager->d
19fe0 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20  bSize/8 + 1 );. 
19ff0 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
1a000 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  aInJournal ){.  
1a010 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1a020 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
1a030 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  {.      rc = wri
1a040 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
1a050 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
1a060 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
1a070 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c  r->journalOpen |
1a080 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
1a090 6c 4f 66 66 3e 30 20 7c 7c 20 72 63 21 3d 53 51  lOff>0 || rc!=SQ
1a0a0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74  LITE_OK );.  ret
1a0b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1a0c0 20 4d 61 6b 65 20 61 20 70 61 67 65 20 64 69 72   Make a page dir
1a0d0 74 79 2e 20 20 53 65 74 20 69 74 73 20 64 69 72  ty.  Set its dir
1a0e0 74 79 20 66 6c 61 67 20 61 6e 64 20 61 64 64 20  ty flag and add 
1a0f0 69 74 20 74 6f 20 74 68 65 20 64 69 72 74 79 0a  it to the dirty.
1a100 2a 2a 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f  ** page list..*/
1a110 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b  .static void mak
1a120 65 44 69 72 74 79 28 50 67 48 64 72 20 2a 70 50  eDirty(PgHdr *pP
1a130 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64  g){.  if( pPg->d
1a140 69 72 74 79 3d 3d 30 20 29 7b 0a 20 20 20 20 50  irty==0 ){.    P
1a150 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1a160 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20  Pg->pPager;.    
1a170 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a  pPg->dirty = 1;.
1a180 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20      pPg->pDirty 
1a190 3d 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79  = pPager->pDirty
1a1a0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
1a1b0 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20 20  ->pDirty ){.    
1a1c0 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
1a1d0 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 70  ->pPrevDirty = p
1a1e0 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  Pg;.    }.    pP
1a1f0 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20  g->pPrevDirty = 
1a200 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  0;.    pPager->p
1a210 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20 20 7d  Dirty = pPg;.  }
1a220 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
1a230 20 70 61 67 65 20 63 6c 65 61 6e 2e 20 20 43 6c   page clean.  Cl
1a240 65 61 72 20 69 74 73 20 64 69 72 74 79 20 62 69  ear its dirty bi
1a250 74 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 20  t and remove it 
1a260 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 64 69 72 74  from the.** dirt
1a270 79 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a  y page list..*/.
1a280 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65  static void make
1a290 43 6c 65 61 6e 28 50 67 48 64 72 20 2a 70 50 67  Clean(PgHdr *pPg
1a2a0 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69  ){.  if( pPg->di
1a2b0 72 74 79 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  rty ){.    pPg->
1a2c0 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69  dirty = 0;.    i
1a2d0 66 28 20 70 50 67 2d 3e 70 44 69 72 74 79 20 29  f( pPg->pDirty )
1a2e0 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 44 69  {.      pPg->pDi
1a2f0 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20  rty->pPrevDirty 
1a300 3d 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74  = pPg->pPrevDirt
1a310 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  y;.    }.    if(
1a320 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79   pPg->pPrevDirty
1a330 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
1a340 50 72 65 76 44 69 72 74 79 2d 3e 70 44 69 72 74  PrevDirty->pDirt
1a350 79 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b  y = pPg->pDirty;
1a360 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a370 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
1a380 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 44 69  Dirty = pPg->pDi
1a390 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  rty;.    }.  }.}
1a3a0 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  .../*.** Mark a 
1a3b0 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
1a3c0 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67  teable.  The pag
1a3d0 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
1a3e0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a  o the journal .*
1a3f0 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  * if it is not t
1a400 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54  here already.  T
1a410 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
1a420 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
1a430 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e  e making.** chan
1a440 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a  ges to a page..*
1a450 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
1a460 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ime this routine
1a470 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
1a480 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61 20  pager creates a 
1a490 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  new.** journal a
1a4a0 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 52 45  nd acquires a RE
1a4b0 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
1a4c0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
1a4d0 20 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a   the RESERVED.**
1a4e0 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20   lock could not 
1a4f0 62 65 20 61 63 71 75 69 72 65 64 2c 20 74 68 69  be acquired, thi
1a500 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1a510 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  s SQLITE_BUSY.  
1a520 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72  The.** calling r
1a530 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63  outine must chec
1a540 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74 75 72  k for that retur
1a550 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63  n value and be c
1a560 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a  areful not to.**
1a570 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65   change any page
1a580 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73   data until this
1a590 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1a5a0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
1a5b0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
1a5c0 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20   file could not 
1a5d0 62 65 20 77 72 69 74 74 65 6e 20 62 65 63 61 75  be written becau
1a5e0 73 65 20 74 68 65 20 64 69 73 6b 20 69 73 20 66  se the disk is f
1a5f0 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69  ull,.** then thi
1a600 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1a610 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e  s SQLITE_FULL an
1a620 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69  d does an immedi
1a630 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ate rollback..**
1a640 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   All subsequent 
1a650 77 72 69 74 65 20 61 74 74 65 6d 70 74 73 20 61  write attempts a
1a660 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54  lso return SQLIT
1a670 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65  E_FULL until the
1a680 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20  re.** is a call 
1a690 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
1a6a0 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74  ommit() or sqlit
1a6b0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1a6c0 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a  ) to.** reset..*
1a6d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1a6e0 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a  er_write(PgHdr *
1a6f0 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44  pPg){.  void *pD
1a700 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44  ata = PGHDR_TO_D
1a710 41 54 41 28 70 50 67 29 3b 0a 20 20 50 61 67 65  ATA(pPg);.  Page
1a720 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1a730 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
1a740 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
1a750 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65    /* Check for e
1a760 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28  rrors.  */.  if(
1a770 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1a780 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20   ){ .    return 
1a790 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
1a7a0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
1a7b0 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  r->readOnly ){. 
1a7c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a7d0 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73  _PERM;.  }..  as
1a7e0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73  sert( !pPager->s
1a7f0 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43  etMaster );..  C
1a800 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a  HECK_PAGE(pPg);.
1a810 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70  .  /* Mark the p
1a820 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49  age as dirty.  I
1a830 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61  f the page has a
1a840 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
1a850 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ten.  ** to the 
1a860 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20  journal then we 
1a870 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74  can return right
1a880 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d 61   away..  */.  ma
1a890 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20  keDirty(pPg);.  
1a8a0 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  if( pPg->inJourn
1a8b0 61 6c 20 26 26 20 28 70 50 67 2d 3e 69 6e 53 74  al && (pPg->inSt
1a8c0 6d 74 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  mt || pPager->st
1a8d0 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20  mtInUse==0) ){. 
1a8e0 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
1a8f0 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 7d 65 6c  Cache = 1;.  }el
1a900 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77  se{..    /* If w
1a910 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20  e get this far, 
1a920 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
1a930 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20  e page needs to 
1a940 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65  be.    ** writte
1a950 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63  n to the transac
1a960 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  tion journal or 
1a970 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a  the ckeckpoint j
1a980 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72  ournal.    ** or
1a990 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20   both..    **.  
1a9a0 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b    ** First check
1a9b0 20 74 6f 20 73 65 65 20 74 68 61 74 20 74 68 65   to see that the
1a9c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
1a9d0 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a  rnal exists and.
1a9e0 20 20 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74      ** create it
1a9f0 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e   if it does not.
1aa00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
1aa10 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1aa20 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
1aa30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
1aa40 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 50  te3PagerBegin(pP
1aa50 67 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  g, 0);.    if( r
1aa60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1aa70 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1aa80 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1aa90 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1aaa0 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
1aab0 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61   );.    if( !pPa
1aac0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1aad0 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a   && pPager->useJ
1aae0 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
1aaf0 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f  rc = pager_open_
1ab00 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  journal(pPager);
1ab10 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1ab20 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1ab30 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1ab40 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1ab50 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21  journalOpen || !
1ab60 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
1ab70 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  al );.    pPager
1ab80 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31  ->dirtyCache = 1
1ab90 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20  ;.  .    /* The 
1aba0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
1abb0 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61  nal now exists a
1abc0 6e 64 20 77 65 20 68 61 76 65 20 61 20 52 45 53  nd we have a RES
1abd0 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20  ERVED or an.    
1abe0 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
1abf0 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  k on the main da
1ac00 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72  tabase file.  Wr
1ac10 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
1ac20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74  page to.    ** t
1ac30 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
1ac40 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20  ournal if it is 
1ac50 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64  not there alread
1ac60 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
1ac70 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  ( !pPg->inJourna
1ac80 6c 20 26 26 20 28 70 50 61 67 65 72 2d 3e 75 73  l && (pPager->us
1ac90 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 4d 45 4d 44  eJournal || MEMD
1aca0 42 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  B) ){.      if( 
1acb0 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c  (int)pPg->pgno <
1acc0 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
1acd0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1ace0 69 6e 74 20 73 7a 50 67 3b 0a 20 20 20 20 20 20  int szPg;.      
1acf0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
1ad00 20 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f           PgHisto
1ad10 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
1ad20 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
1ad30 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
1ad40 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 4a    PAGERTRACE3("J
1ad50 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
1ad60 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1ad70 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
1ad80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
1ad90 65 72 74 28 20 70 48 69 73 74 2d 3e 70 4f 72 69  ert( pHist->pOri
1ada0 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  g==0 );.        
1adb0 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d    pHist->pOrig =
1adc0 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
1add0 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ( pPager->pageSi
1ade0 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ze );.          
1adf0 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  if( pHist->pOrig
1ae00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1ae10 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 4f  memcpy(pHist->pO
1ae20 72 69 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  rig, PGHDR_TO_DA
1ae30 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d  TA(pPg), pPager-
1ae40 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1ae50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ae60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1ae70 20 75 33 32 20 63 6b 73 75 6d 2c 20 73 61 76 65   u32 cksum, save
1ae80 64 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  d;.          cha
1ae90 72 20 2a 70 44 61 74 61 32 2c 20 2a 70 45 6e 64  r *pData2, *pEnd
1aea0 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ;.          /* W
1aeb0 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77  e should never w
1aec0 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
1aed0 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67  nal file the pag
1aee0 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20  e that.         
1aef0 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   ** contains the
1af00 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e   database locks.
1af10 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
1af20 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a  assert verifies.
1af30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
1af40 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a  t we do not. */.
1af50 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1af60 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47  ( pPg->pgno!=PAG
1af70 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
1af80 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r) );.          
1af90 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28  pData2 = CODEC2(
1afa0 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
1afb0 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20  Pg->pgno, 7);.  
1afc0 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20          cksum = 
1afd0 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
1afe0 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29  er, (u8*)pData2)
1aff0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 6e 64  ;.          pEnd
1b000 20 3d 20 70 44 61 74 61 32 20 2b 20 70 50 61 67   = pData2 + pPag
1b010 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
1b020 20 20 20 20 20 20 20 20 70 44 61 74 61 32 20 2d          pData2 -
1b030 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 73  = 4;.          s
1b040 61 76 65 64 20 3d 20 2a 28 75 33 32 2a 29 70 45  aved = *(u32*)pE
1b050 6e 64 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75  nd;.          pu
1b060 74 33 32 62 69 74 73 28 70 45 6e 64 2c 20 63 6b  t32bits(pEnd, ck
1b070 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  sum);.          
1b080 73 7a 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70  szPg = pPager->p
1b090 61 67 65 53 69 7a 65 2b 38 3b 0a 20 20 20 20 20  ageSize+8;.     
1b0a0 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28 70       put32bits(p
1b0b0 44 61 74 61 32 2c 20 70 50 67 2d 3e 70 67 6e 6f  Data2, pPg->pgno
1b0c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
1b0d0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
1b0e0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44  (pPager->jfd, pD
1b0f0 61 74 61 32 2c 20 73 7a 50 67 29 3b 0a 20 20 20  ata2, szPg);.   
1b100 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
1b110 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64  "JOUT %p %d %lld
1b120 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
1b130 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20  pPg->pgno,.     
1b140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
1b150 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1b160 2c 20 73 7a 50 67 29 29 0a 20 20 20 20 20 20 20  , szPg)).       
1b170 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1b180 61 6c 4f 66 66 20 2b 3d 20 73 7a 50 67 3b 0a 20  alOff += szPg;. 
1b190 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52           PAGERTR
1b1a0 41 43 45 34 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE4("JOURNAL %d
1b1b0 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
1b1c0 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
1b1d0 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
1b1e0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
1b1f0 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64  >pgno, pPg->need
1b200 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20  Sync);.         
1b210 20 2a 28 75 33 32 2a 29 70 45 6e 64 20 3d 20 73   *(u32*)pEnd = s
1b220 61 76 65 64 3b 0a 0a 09 20 20 2f 2a 20 41 6e 20  aved;...  /* An 
1b230 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65  error has occure
1b240 64 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  d writing to the
1b250 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
1b260 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  he .          **
1b270 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
1b280 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l be rolled back
1b290 20 62 79 20 74 68 65 20 6c 61 79 65 72 20 61 62   by the layer ab
1b2a0 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ove..          *
1b2b0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
1b2c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1b2d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
1b2e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1b2f0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 70    }..          p
1b300 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20  Pager->nRec++;. 
1b310 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1b320 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1b330 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  nal!=0 );.      
1b340 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
1b350 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f  ournal[pPg->pgno
1b360 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
1b370 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20  pgno&7);.       
1b380 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
1b390 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = !pPager->noSy
1b3a0 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  nc;.          if
1b3b0 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
1b3c0 55 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Use ){.         
1b3d0 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
1b3e0 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  mt[pPg->pgno/8] 
1b3f0 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
1b400 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  &7);.           
1b410 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
1b420 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
1b430 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b440 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
1b450 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65          pPg->nee
1b460 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d  dSync = !pPager-
1b470 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
1b480 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
1b490 6e 63 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45  nc;.        PAGE
1b4a0 52 54 52 41 43 45 34 28 22 41 50 50 45 4e 44 20  RTRACE4("APPEND 
1b4b0 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
1b4c0 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ync=%d\n",.     
1b4d0 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
1b4e0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
1b4f0 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64  >pgno, pPg->need
1b500 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Sync);.      }. 
1b510 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65       if( pPg->ne
1b520 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
1b530 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
1b540 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  nc = 1;.      }.
1b550 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
1b560 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rnal = 1;.    }.
1b570 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
1b580 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
1b590 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74  al is open and t
1b5a0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
1b5b0 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  n it,.    ** the
1b5c0 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  n write the curr
1b5d0 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20  ent page to the 
1b5e0 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
1b5f0 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20  l.  Note that.  
1b600 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
1b610 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  nt journal forma
1b620 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74  t differs from t
1b630 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72  he standard jour
1b640 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a  nal format.    *
1b650 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69  * in that it omi
1b660 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  ts the checksums
1b670 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e   and the header.
1b680 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1b690 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1b6a0 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d  e && !pPg->inStm
1b6b0 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70  t && (int)pPg->p
1b6c0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d  gno<=pPager->stm
1b6d0 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 61  tSize ){.      a
1b6e0 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f  ssert( pPg->inJo
1b6f0 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50  urnal || (int)pP
1b700 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
1b710 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20  origDbSize );.  
1b720 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
1b730 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f  .        PgHisto
1b740 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
1b750 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
1b760 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
1b770 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70  assert( pHist->p
1b780 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Stmt==0 );.     
1b790 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20     pHist->pStmt 
1b7a0 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
1b7b0 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  w( pPager->pageS
1b7c0 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ize );.        i
1b7d0 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  f( pHist->pStmt 
1b7e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
1b7f0 63 70 79 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  cpy(pHist->pStmt
1b800 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
1b810 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  pPg), pPager->pa
1b820 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
1b830 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45 52   }.        PAGER
1b840 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55  TRACE3("STMT-JOU
1b850 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
1b860 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1b870 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  er), pPg->pgno);
1b880 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1b890 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
1b8a0 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67  a2 = CODEC2(pPag
1b8b0 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
1b8c0 70 67 6e 6f 2c 20 37 29 2d 34 3b 0a 20 20 20 20  pgno, 7)-4;.    
1b8d0 20 20 20 20 70 75 74 33 32 62 69 74 73 28 70 44      put32bits(pD
1b8e0 61 74 61 32 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ata2, pPg->pgno)
1b8f0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
1b900 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
1b910 61 67 65 72 2d 3e 73 74 66 64 2c 20 70 44 61 74  ager->stfd, pDat
1b920 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
1b930 53 69 7a 65 2b 34 29 3b 0a 20 20 20 20 20 20 20  Size+4);.       
1b940 20 50 41 47 45 52 54 52 41 43 45 33 28 22 53 54   PAGERTRACE3("ST
1b950 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
1b960 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
1b970 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
1b980 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  pgno);.        i
1b990 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b9a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1b9b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1b9c0 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
1b9d0 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20  r->stmtNRec++;. 
1b9e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1b9f0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d  Pager->aInStmt!=
1ba00 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  0 );.        pPa
1ba10 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67  ger->aInStmt[pPg
1ba20 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
1ba30 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
1ba40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67       }.      pag
1ba50 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
1ba60 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  st(pPg);.    }. 
1ba70 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20   }..  /* Update 
1ba80 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
1ba90 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20  e and return..  
1baa0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
1bab0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1bac0 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69 66  R_SHARED );.  if
1bad0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
1bae0 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20  <(int)pPg->pgno 
1baf0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
1bb00 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e  bSize = pPg->pgn
1bb10 6f 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  o;.    if( !MEMD
1bb20 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53  B && pPager->dbS
1bb30 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ize==PENDING_BYT
1bb40 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  E/pPager->pageSi
1bb50 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  ze ){.      pPag
1bb60 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20  er->dbSize++;.  
1bb70 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1bb80 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1bb90 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
1bba0 73 65 64 20 74 6f 20 6d 61 72 6b 20 61 20 64 61  sed to mark a da
1bbb0 74 61 2d 70 61 67 65 20 61 73 20 77 72 69 74 61  ta-page as writa
1bbc0 62 6c 65 2e 20 49 74 20 75 73 65 73 20 0a 2a 2a  ble. It uses .**
1bbd0 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 74   pager_write() t
1bbe0 6f 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c  o open a journal
1bbf0 20 66 69 6c 65 20 28 69 66 20 69 74 20 69 73 20   file (if it is 
1bc00 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
1bc10 29 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74  ).** and write t
1bc20 68 65 20 70 61 67 65 20 2a 70 44 61 74 61 20 74  he page *pData t
1bc30 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  o the journal..*
1bc40 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
1bc50 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
1bc60 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61   function and pa
1bc70 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 74  ger_write() is t
1bc80 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  hat this.** func
1bc90 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20  tion also deals 
1bca0 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c  with the special
1bcb0 20 63 61 73 65 20 77 68 65 72 65 20 32 20 6f 72   case where 2 or
1bcc0 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66   more pages.** f
1bcd0 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64  it on a single d
1bce0 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74  isk sector. In t
1bcf0 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d  his case all co-
1bd00 72 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a  resident pages.*
1bd10 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  * must have been
1bd20 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1bd30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66  journal file bef
1bd40 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
1bd50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
1bd60 65 72 57 72 69 74 65 28 44 62 50 61 67 65 20 2a  erWrite(DbPage *
1bd70 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  pDbPage){.  int 
1bd80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1bd90 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
1bda0 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72  pDbPage;.  Pager
1bdb0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
1bdc0 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e  pPager;.  Pgno n
1bdd0 50 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20  PagePerSector = 
1bde0 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
1bdf0 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65  ize/pPager->page
1be00 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 21 4d  Size);..  if( !M
1be10 45 4d 44 42 20 26 26 20 6e 50 61 67 65 50 65 72  EMDB && nPagePer
1be20 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20  Sector>1 ){.    
1be30 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b  Pgno nPageCount;
1be40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
1be50 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
1be60 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66  es in database f
1be70 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  ile */.    Pgno 
1be80 70 67 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  pg1;            
1be90 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
1bea0 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
1beb0 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
1bec0 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  on. */.    int n
1bed0 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
1bee0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1bef0 66 20 70 61 67 65 73 20 73 74 61 72 74 69 6e 67  f pages starting
1bf00 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e   at pg1 to journ
1bf10 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  al */.    int ii
1bf20 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  ;..    /* Set th
1bf30 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67  e doNotSync flag
1bf40 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62   to 1. This is b
1bf50 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74  ecause we cannot
1bf60 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e 61 6c   allow a journal
1bf70 0a 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74  .    ** header t
1bf80 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 74  o be written bet
1bf90 77 65 65 6e 20 74 68 65 20 70 61 67 65 73 20 6a  ween the pages j
1bfa0 6f 75 72 6e 61 6c 65 64 20 62 79 20 74 68 69 73  ournaled by this
1bfb0 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a   function..    *
1bfc0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
1bfd0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d  ager->doNotSync=
1bfe0 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
1bff0 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b  ->doNotSync = 1;
1c000 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72  ..    /* This tr
1c010 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74  ick assumes that
1c020 20 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73   both the page-s
1c030 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
1c040 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61  ize are.    ** a
1c050 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20  n integer power 
1c060 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20 76 61  of 2. It sets va
1c070 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68  riable pg1 to th
1c080 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20  e identifier.   
1c090 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74   ** of the first
1c0a0 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63   page of the sec
1c0b0 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74  tor pPg is locat
1c0c0 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ed on..    */.  
1c0d0 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70    pg1 = ((pPg->p
1c0e0 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65  gno-1) & ~(nPage
1c0f0 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20  PerSector-1)) + 
1c100 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65 43 6f 75  1;..    nPageCou
1c110 6e 74 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  nt = sqlite3Page
1c120 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
1c130 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  r);.    if( pPg-
1c140 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74  >pgno>nPageCount
1c150 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20   ){.      nPage 
1c160 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70  = (pPg->pgno - p
1c170 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  g1)+1;.    }else
1c180 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50   if( (pg1+nPageP
1c190 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67  erSector-1)>nPag
1c1a0 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20  eCount ){.      
1c1b0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75  nPage = nPageCou
1c1c0 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65  nt+1-pg1;.    }e
1c1d0 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65  lse{.      nPage
1c1e0 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f   = nPagePerSecto
1c1f0 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  r;.    }.    ass
1c200 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20  ert(nPage>0);.  
1c210 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50    assert(pg1<=pP
1c220 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73  g->pgno);.    as
1c230 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29  sert((pg1+nPage)
1c240 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20  >pPg->pgno);..  
1c250 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
1c260 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49  Page && rc==SQLI
1c270 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20  TE_OK; ii++){.  
1c280 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67      Pgno pg = pg
1c290 31 2b 69 69 3b 0a 20 20 20 20 20 20 69 66 28 20  1+ii;.      if( 
1c2a0 21 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  !pPager->aInJour
1c2b0 6e 61 6c 20 7c 7c 20 70 67 3d 3d 70 50 67 2d 3e  nal || pg==pPg->
1c2c0 70 67 6e 6f 20 7c 7c 20 0a 20 20 20 20 20 20 20  pgno || .       
1c2d0 20 20 20 70 67 3e 70 50 61 67 65 72 2d 3e 6f 72     pg>pPager->or
1c2e0 69 67 44 62 53 69 7a 65 20 7c 7c 20 21 28 70 50  igDbSize || !(pP
1c2f0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1c300 5b 70 67 2f 38 5d 26 28 31 3c 3c 28 70 67 26 37  [pg/8]&(1<<(pg&7
1c310 29 29 29 0a 20 20 20 20 20 20 29 20 7b 0a 20 20  ))).      ) {.  
1c320 20 20 20 20 20 20 69 66 28 20 70 67 21 3d 50 41        if( pg!=PA
1c330 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
1c340 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  er) ){.         
1c350 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20   PgHdr *pPage;. 
1c360 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1c370 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
1c380 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65  ager, pg, &pPage
1c390 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1c3a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1c3b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
1c3c0 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70   = pager_write(p
1c3d0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1c3e0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
1c3f0 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
1c400 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c410 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1c420 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ..    assert( pP
1c430 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d  ager->doNotSync=
1c440 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =1 );.    pPager
1c450 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b  ->doNotSync = 0;
1c460 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
1c470 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70   = pager_write(p
1c480 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  DbPage);.  }.  r
1c490 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1c4a0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
1c4b0 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  f the page given
1c4c0 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
1c4d0 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
1c4e0 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c  passed.** to sql
1c4f0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
1c500 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
1c510 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69  s, return TRUE i
1c520 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f  f it is ok.** to
1c530 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74   change the cont
1c540 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
1c550 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
1c560 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  UG.int sqlite3Pa
1c570 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 44  gerIswriteable(D
1c580 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
1c590 65 74 75 72 6e 20 70 50 67 2d 3e 64 69 72 74 79  eturn pPg->dirty
1c5a0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
1c5b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1c5c0 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 52 65 70  VACUUM./*.** Rep
1c5d0 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  lace the content
1c5e0 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   of a single pag
1c5f0 65 20 77 69 74 68 20 74 68 65 20 69 6e 66 6f 72  e with the infor
1c600 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 74 68  mation in the th
1c610 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  ird.** argument.
1c620 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1c630 61 67 65 72 4f 76 65 72 77 72 69 74 65 28 50 61  agerOverwrite(Pa
1c640 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
1c650 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 70 44  o pgno, void *pD
1c660 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
1c670 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  Pg;.  int rc;.. 
1c680 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1c690 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67  erGet(pPager, pg
1c6a0 6e 6f 2c 20 26 70 50 67 29 3b 0a 20 20 69 66 28  no, &pPg);.  if(
1c6b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1c6c0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1c6d0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67  e3PagerWrite(pPg
1c6e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1c6f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c700 20 20 6d 65 6d 63 70 79 28 73 71 6c 69 74 65 33    memcpy(sqlite3
1c710 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 67  PagerGetData(pPg
1c720 29 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72  ), pData, pPager
1c730 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
1c740 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61   }.    sqlite3Pa
1c750 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
1c760 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1c770 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1c780 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  A call to this r
1c790 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65  outine tells the
1c7a0 20 70 61 67 65 72 20 74 68 61 74 20 69 74 20 69   pager that it i
1c7b0 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
1c7c0 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20  to.** write the 
1c7d0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70  information on p
1c7e0 61 67 65 20 22 70 67 6e 6f 22 20 62 61 63 6b 20  age "pgno" back 
1c7f0 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65  to the disk, eve
1c800 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74  n though.** that
1c810 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d   page might be m
1c820 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a  arked as dirty..
1c830 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79  **.** The overly
1c840 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79  ing software lay
1c850 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
1c860 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f  utine when all o
1c870 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e  f the data.** on
1c880 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
1c890 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20  is unused.  The 
1c8a0 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20  pager marks the 
1c8b0 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f  page as clean so
1c8c0 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73  .** that it does
1c8d0 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e   not get written
1c8e0 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
1c8f0 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20  Tests show that 
1c900 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
1c910 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68  n, together with
1c920 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50   the.** sqlite3P
1c930 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
1c940 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74  () below, more t
1c950 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73  han double the s
1c960 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65  peed.** of large
1c970 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f   INSERT operatio
1c980 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65  ns and quadruple
1c990 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61   the speed of la
1c9a0 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a  rge DELETEs..**.
1c9b0 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75  ** When this rou
1c9c0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
1c9d0 73 65 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f  set the alwaysRo
1c9e0 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74  llback flag to t
1c9f0 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65  rue..** Subseque
1ca00 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  nt calls to sqli
1ca10 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c  te3PagerDontRoll
1ca20 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73  back() for the s
1ca30 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c  ame page.** will
1ca40 20 74 68 65 72 65 61 66 74 65 72 20 62 65 20 69   thereafter be i
1ca50 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73  gnored.  This is
1ca60 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 76   necessary to av
1ca70 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a  oid a problem.**
1ca80 20 77 68 65 72 65 20 61 20 70 61 67 65 20 77 69   where a page wi
1ca90 74 68 20 64 61 74 61 20 69 73 20 61 64 64 65 64  th data is added
1caa0 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
1cab0 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74   during one part
1cac0 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63   of.** a transac
1cad0 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65  tion then remove
1cae0 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  d from the freel
1caf0 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74  ist during a lat
1cb00 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68  er part.** of th
1cb10 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69  e same transacti
1cb20 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f  on and reused fo
1cb30 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72  r some other pur
1cb40 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a  pose.  When it.*
1cb50 2a 20 69 73 20 66 69 72 73 74 20 61 64 64 65 64  * is first added
1cb60 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
1cb70 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1cb80 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20  s called.  When 
1cb90 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 64  reused,.** the d
1cba0 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 72  ont_rollback() r
1cbb0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1cbc0 2e 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74  .  But because t
1cbd0 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  he page contains
1cbe0 0a 2a 2a 20 63 72 69 74 69 63 61 6c 20 64 61 74  .** critical dat
1cbf0 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64  a, we still need
1cc00 20 74 6f 20 62 65 20 73 75 72 65 20 69 74 20 67   to be sure it g
1cc10 65 74 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ets rolled back 
1cc20 69 6e 20 73 70 69 74 65 0a 2a 2a 20 6f 66 20 74  in spite.** of t
1cc30 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  he dont_rollback
1cc40 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64  () call..*/.void
1cc50 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
1cc60 74 57 72 69 74 65 28 50 61 67 65 72 20 2a 70 50  tWrite(Pager *pP
1cc70 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
1cc80 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
1cc90 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 20 72  .  if( MEMDB ) r
1cca0 65 74 75 72 6e 3b 0a 0a 20 20 70 50 67 20 3d 20  eturn;..  pPg = 
1ccb0 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
1ccc0 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73  ger, pgno);.  as
1ccd0 73 65 72 74 28 20 70 50 67 21 3d 30 20 29 3b 20  sert( pPg!=0 ); 
1cce0 20 2f 2a 20 57 65 20 6e 65 76 65 72 20 63 61 6c   /* We never cal
1ccf0 6c 20 5f 64 6f 6e 74 5f 77 72 69 74 65 20 75 6e  l _dont_write un
1cd00 6c 65 73 73 20 74 68 65 20 70 61 67 65 20 69 73  less the page is
1cd10 20 69 6e 20 6d 65 6d 20 2a 2f 0a 20 20 70 50 67   in mem */.  pPg
1cd20 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1cd30 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d   = 1;.  if( pPg-
1cd40 3e 64 69 72 74 79 20 26 26 20 21 70 50 61 67 65  >dirty && !pPage
1cd50 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
1cd60 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1cd70 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1cd80 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69  _SHARED );.    i
1cd90 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
1cda0 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  e==(int)pPg->pgn
1cdb0 6f 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69  o && pPager->ori
1cdc0 67 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e  gDbSize<pPager->
1cdd0 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  dbSize ){.      
1cde0 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 73  /* If this pages
1cdf0 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67   is the last pag
1ce00 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e  e in the file an
1ce10 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 67  d the file has g
1ce20 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75  rown.      ** du
1ce30 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ring the current
1ce40 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
1ce50 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74  en do NOT mark t
1ce60 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
1ce70 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20  ..      ** When 
1ce80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ce90 65 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74  e grows, we must
1cea0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1ceb0 74 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20  the last page.  
1cec0 20 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74      ** gets writ
1ced0 74 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63  ten at least onc
1cee0 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 64 69  e so that the di
1cef0 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  sk file will be 
1cf00 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20  the correct.    
1cf10 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f    ** size. If yo
1cf20 75 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74  u do not write t
1cf30 68 69 73 20 70 61 67 65 20 61 6e 64 20 74 68 65  his page and the
1cf40 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
1cf50 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68  e.      ** on th
1cf60 65 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62  e disk ends up b
1cf70 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20  eing too small, 
1cf80 74 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f  that can lead to
1cf90 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
1cfa0 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75  ** corruption du
1cfb0 72 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72  ring the next tr
1cfc0 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
1cfd0 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
1cfe0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
1cff0 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67  ("DONT_WRITE pag
1d000 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  e %d of %d\n", p
1d010 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
1d020 67 65 72 29 29 3b 0a 20 20 20 20 20 20 49 4f 54  ger));.      IOT
1d030 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20  RACE(("CLEAN %p 
1d040 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
1d050 67 6e 6f 29 29 0a 20 20 20 20 20 20 6d 61 6b 65  gno)).      make
1d060 43 6c 65 61 6e 28 70 50 67 29 3b 0a 23 69 66 64  Clean(pPg);.#ifd
1d070 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
1d080 50 41 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d  PAGES.      pPg-
1d090 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
1d0a0 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
1d0b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
1d0c0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c  }.}../*.** A cal
1d0d0 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  l to this routin
1d0e0 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65  e tells the page
1d0f0 72 20 74 68 61 74 20 69 66 20 61 20 72 6f 6c 6c  r that if a roll
1d100 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  back occurs,.** 
1d110 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  it is not necess
1d120 61 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74  ary to restore t
1d130 68 65 20 64 61 74 61 20 6f 6e 20 74 68 65 20 67  he data on the g
1d140 69 76 65 6e 20 70 61 67 65 2e 20 20 54 68 69 73  iven page.  This
1d150 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74  .** means that t
1d160 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f  he pager does no
1d170 74 20 68 61 76 65 20 74 6f 20 72 65 63 6f 72 64  t have to record
1d180 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
1d190 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61  in the.** rollba
1d1a0 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 76  ck journal..*/.v
1d1b0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
1d1c0 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 44 62 50  DontRollback(DbP
1d1d0 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  age *pPg){.  Pag
1d1e0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1d1f0 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 61 73 73  ->pPager;..  ass
1d200 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1d210 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
1d220 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ED );.  if( pPag
1d230 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
1d240 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
1d250 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  f( pPg->alwaysRo
1d260 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65 72  llback || pPager
1d270 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1d280 20 7c 7c 20 4d 45 4d 44 42 20 29 20 72 65 74 75   || MEMDB ) retu
1d290 72 6e 3b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e  rn;.  if( !pPg->
1d2a0 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e  inJournal && (in
1d2b0 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70  t)pPg->pgno <= p
1d2c0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1d2d0 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
1d2e0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1d2f0 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  nal!=0 );.    pP
1d300 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1d310 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
1d320 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
1d330 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  );.    pPg->inJo
1d340 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 69  urnal = 1;.    i
1d350 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
1d360 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 70 50  nUse ){.      pP
1d370 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
1d380 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
1d390 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
1d3a0 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74        page_add_t
1d3b0 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
1d3c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 50 41 47 45  ;.    }.    PAGE
1d3d0 52 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f  RTRACE3("DONT_RO
1d3e0 4c 4c 42 41 43 4b 20 70 61 67 65 20 25 64 20 6f  LLBACK page %d o
1d3f0 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67  f %d\n", pPg->pg
1d400 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
1d410 65 72 29 29 3b 0a 20 20 20 20 49 4f 54 52 41 43  er));.    IOTRAC
1d420 45 28 28 22 47 41 52 42 41 47 45 20 25 70 20 25  E(("GARBAGE %p %
1d430 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
1d440 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 7d 0a 20 20  g->pgno)).  }.  
1d450 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
1d460 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69  InUse && !pPg->i
1d470 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50  nStmt && (int)pP
1d480 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  g->pgno<=pPager-
1d490 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20  >stmtSize ){.   
1d4a0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
1d4b0 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29  Journal || (int)
1d4c0 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
1d4d0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a  ->origDbSize );.
1d4e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1d4f0 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29  er->aInStmt!=0 )
1d500 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
1d510 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
1d520 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
1d530 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 61 67 65  gno&7);.    page
1d540 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
1d550 74 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  t(pPg);.  }.}...
1d560 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c  /*.** Commit all
1d570 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
1d580 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c  database and rel
1d590 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
1d5a0 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
1d5b0 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66  e commit fails f
1d5c0 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61  or any reason, a
1d5d0 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70   rollback attemp
1d5e0 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64  t is made.** and
1d5f0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
1d600 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20  s returned.  If 
1d610 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65  the commit worke
1d620 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  d, SQLITE_OK.** 
1d630 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1d640 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1d650 43 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50  Commit(Pager *pP
1d660 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1d670 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
1d680 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
1d690 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74  rCode ){.    ret
1d6a0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
1d6b0 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ode;.  }.  if( p
1d6c0 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47  Pager->state<PAG
1d6d0 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
1d6e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1d6f0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 50 41  _ERROR;.  }.  PA
1d700 47 45 52 54 52 41 43 45 32 28 22 43 4f 4d 4d 49  GERTRACE2("COMMI
1d710 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  T %d\n", PAGERID
1d720 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
1d730 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50   MEMDB ){.    pP
1d740 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c  g = pager_get_al
1d750 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50  l_dirty_pages(pP
1d760 61 67 65 72 29 3b 0a 20 20 20 20 77 68 69 6c 65  ager);.    while
1d770 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 63  ( pPg ){.      c
1d780 6c 65 61 72 48 69 73 74 6f 72 79 28 50 47 48 44  learHistory(PGHD
1d790 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
1d7a0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 70  Pager));.      p
1d7b0 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
1d7c0 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
1d7d0 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
1d7e0 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Pg->inStmt = 0;.
1d7f0 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
1d800 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ync = 0;.      p
1d810 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  Pg->pPrevStmt = 
1d820 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  pPg->pNextStmt =
1d830 20 30 3b 0a 20 20 20 20 20 20 70 50 67 20 3d 20   0;.      pPg = 
1d840 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  pPg->pDirty;.   
1d850 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
1d860 44 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 6e 64  Dirty = 0;.#ifnd
1d870 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 66 6f  ef NDEBUG.    fo
1d880 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
1d890 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
1d8a0 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
1d8b0 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
1d8c0 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
1d8d0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
1d8e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1d8f0 21 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  !pPg->alwaysRoll
1d900 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 61 73  back );.      as
1d910 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 4f  sert( !pHist->pO
1d920 72 69 67 20 29 3b 0a 20 20 20 20 20 20 61 73 73  rig );.      ass
1d930 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 53 74  ert( !pHist->pSt
1d940 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  mt );.    }.#end
1d950 69 66 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  if.    pPager->p
1d960 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50  Stmt = 0;.    pP
1d970 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
1d980 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20  GER_SHARED;.    
1d990 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1d9a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
1d9b0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d  er->dirtyCache==
1d9c0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 45 78 69 74  0 ){.    /* Exit
1d9d0 20 65 61 72 6c 79 20 28 77 69 74 68 6f 75 74 20   early (without 
1d9e0 64 6f 69 6e 67 20 74 68 65 20 74 69 6d 65 2d 63  doing the time-c
1d9f0 6f 6e 73 75 6d 69 6e 67 20 73 71 6c 69 74 65 33  onsuming sqlite3
1da00 4f 73 53 79 6e 63 28 29 20 63 61 6c 6c 73 29 0a  OsSync() calls).
1da10 20 20 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20      ** if there 
1da20 68 61 76 65 20 62 65 65 6e 20 6e 6f 20 63 68 61  have been no cha
1da30 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
1da40 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
1da50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1da60 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b  ->needSync==0 );
1da70 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1da80 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
1da90 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
1daa0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1dab0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
1dac0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1dad0 33 50 61 67 65 72 53 79 6e 63 28 70 50 61 67 65  3PagerSync(pPage
1dae0 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  r, 0, 0);.    if
1daf0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1db00 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
1db10 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
1db20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
1db30 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65   }.  return page
1db40 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
1db50 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  rc);.}../*.** Ro
1db60 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67  llback all chang
1db70 65 73 2e 20 20 54 68 65 20 64 61 74 61 62 61 73  es.  The databas
1db80 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20  e falls back to 
1db90 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64  PAGER_SHARED mod
1dba0 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d  e..** All in-mem
1dbb0 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20  ory cache pages 
1dbc0 72 65 76 65 72 74 20 74 6f 20 74 68 65 69 72 20  revert to their 
1dbd0 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f  original data co
1dbe0 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a  ntents..** The j
1dbf0 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65  ournal is delete
1dc00 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
1dc10 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69  utine cannot fai
1dc20 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74  l unless some ot
1dc30 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e  her process is n
1dc40 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  ot following.** 
1dc50 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
1dc60 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28 53 51  ing protocol (SQ
1dc70 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f  LITE_PROTOCOL) o
1dc80 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74  r unless some ot
1dc90 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69  her.** process i
1dca0 73 20 77 72 69 74 69 6e 67 20 74 72 61 73 68 20  s writing trash 
1dcb0 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
1dcc0 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f   file (SQLITE_CO
1dcd0 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c  RRUPT) or.** unl
1dce0 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c  ess a prior mall
1dcf0 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c  oc() failed (SQL
1dd00 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70  ITE_NOMEM).  App
1dd10 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a  ropriate error.*
1dd20 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65 74 75  * codes are retu
1dd30 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65  rned for all the
1dd40 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f  se occasions.  O
1dd50 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c  therwise,.** SQL
1dd60 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1dd70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
1dd80 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1dd90 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1dda0 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 41 47 45    int rc;.  PAGE
1ddb0 52 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43  RTRACE2("ROLLBAC
1ddc0 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  K %d\n", PAGERID
1ddd0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
1dde0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67   MEMDB ){.    Pg
1ddf0 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  Hdr *p;.    for(
1de00 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  p=pPager->pAll; 
1de10 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c  p; p=p->pNextAll
1de20 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  ){.      PgHisto
1de30 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20  ry *pHist;.     
1de40 20 61 73 73 65 72 74 28 20 21 70 2d 3e 61 6c 77   assert( !p->alw
1de50 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20  aysRollback );. 
1de60 20 20 20 20 20 69 66 28 20 21 70 2d 3e 64 69 72       if( !p->dir
1de70 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ty ){.        as
1de80 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74 6f  sert( !((PgHisto
1de90 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49  ry *)PGHDR_TO_HI
1dea0 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e  ST(p, pPager))->
1deb0 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 20  pOrig );.       
1dec0 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48 69   assert( !((PgHi
1ded0 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f  story *)PGHDR_TO
1dee0 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29  _HIST(p, pPager)
1def0 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20  )->pStmt );.    
1df00 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1df10 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 48 69      }..      pHi
1df20 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
1df30 53 54 28 70 2c 20 70 50 61 67 65 72 29 3b 0a 20  ST(p, pPager);. 
1df40 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e       if( pHist->
1df50 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20  pOrig ){.       
1df60 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f   memcpy(PGHDR_TO
1df70 5f 44 41 54 41 28 70 29 2c 20 70 48 69 73 74 2d  _DATA(p), pHist-
1df80 3e 70 4f 72 69 67 2c 20 70 50 61 67 65 72 2d 3e  >pOrig, pPager->
1df90 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
1dfa0 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
1dfb0 52 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25 64  ROLLBACK-PAGE %d
1dfc0 20 6f 66 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67   of %d\n", p->pg
1dfd0 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
1dfe0 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  er));.      }els
1dff0 65 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  e{.        PAGER
1e000 54 52 41 43 45 33 28 22 50 41 47 45 20 25 64 20  TRACE3("PAGE %d 
1e010 69 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e  is clean on %d\n
1e020 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45  ", p->pgno, PAGE
1e030 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1e040 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65 61      }.      clea
1e050 72 48 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b  rHistory(pHist);
1e060 0a 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79 20  .      p->dirty 
1e070 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e  = 0;.      p->in
1e080 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
1e090 20 20 20 70 2d 3e 69 6e 53 74 6d 74 20 3d 20 30     p->inStmt = 0
1e0a0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76  ;.      p->pPrev
1e0b0 53 74 6d 74 20 3d 20 70 2d 3e 70 4e 65 78 74 53  Stmt = p->pNextS
1e0c0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  tmt = 0;.      i
1e0d0 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  f( pPager->xRein
1e0e0 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iter ){.        
1e0f0 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
1e100 72 28 70 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  r(p, pPager->pag
1e110 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  eSize);.      }.
1e120 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
1e130 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
1e140 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
1e150 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
1e160 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
1e170 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20  ->origDbSize;.  
1e180 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65    memoryTruncate
1e190 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
1e1a0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1e1b0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
1e1c0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
1e1d0 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72  HARED;.    retur
1e1e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1e1f0 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
1e200 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21  >dirtyCache || !
1e210 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1e220 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
1e230 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
1e240 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  k(pPager);.    r
1e250 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
1e260 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1e270 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
1e280 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
1e290 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20  FULL ){.    if( 
1e2a0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1e2b0 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
1e2c0 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c  {.      pager_pl
1e2d0 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30  ayback(pPager, 0
1e2e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
1e2f0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
1e300 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ode;.  }.  if( p
1e310 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
1e320 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
1e330 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20      int rc2;.   
1e340 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
1e350 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
1e360 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72  .    rc2 = pager
1e370 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
1e380 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
1e390 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e3a0 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
1e3b0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1e3c0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
1e3d0 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29  yback(pPager, 0)
1e3e0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1e3f0 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20  dbSize = -1;..  
1e400 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
1e410 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 52  ccurs during a R
1e420 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20  OLLBACK, we can 
1e430 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20  no longer trust 
1e440 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 63  the pager.  ** c
1e450 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61  ache. So call pa
1e460 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74  ger_error() on t
1e470 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61  he way out to ma
1e480 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20 20  ke any error .  
1e490 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20  ** persistent.. 
1e4a0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 61 67   */.  return pag
1e4b0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
1e4c0 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   rc);.}../*.** R
1e4d0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
1e4e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1e4f0 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f  is opened read-o
1e500 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  nly.  Return FAL
1e510 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74  SE.** if the dat
1e520 61 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65  abase is (in the
1e530 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a  ory) writable..*
1e540 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
1e550 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 50 61 67  erIsreadonly(Pag
1e560 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
1e570 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65  eturn pPager->re
1e580 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  adOnly;.}../*.**
1e590 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1e5a0 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
1e5b0 20 74 6f 20 74 68 65 20 70 61 67 65 72 2e 0a 2a   to the pager..*
1e5c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
1e5d0 65 72 52 65 66 63 6f 75 6e 74 28 50 61 67 65 72  erRefcount(Pager
1e5e0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
1e5f0 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  urn pPager->nRef
1e600 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
1e610 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68  TE_TEST./*.** Th
1e620 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
1e630 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
1e640 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
1e650 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65  ..*/.int *sqlite
1e660 33 50 61 67 65 72 53 74 61 74 73 28 50 61 67 65  3PagerStats(Page
1e670 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74  r *pPager){.  st
1e680 61 74 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a  atic int a[11];.
1e690 20 20 61 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d    a[0] = pPager-
1e6a0 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20  >nRef;.  a[1] = 
1e6b0 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20  pPager->nPage;. 
1e6c0 20 61 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[2] = pPager->
1e6d0 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d  mxPage;.  a[3] =
1e6e0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
1e6f0 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72  .  a[4] = pPager
1e700 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20  ->state;.  a[5] 
1e710 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
1e720 65 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67  e;.  a[6] = pPag
1e730 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d  er->nHit;.  a[7]
1e740 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73   = pPager->nMiss
1e750 3b 0a 20 20 61 5b 38 5d 20 3d 20 70 50 61 67 65  ;.  a[8] = pPage
1e760 72 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 61 5b 39 5d  r->nOvfl;.  a[9]
1e770 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64   = pPager->nRead
1e780 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67  ;.  a[10] = pPag
1e790 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65  er->nWrite;.  re
1e7a0 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66  turn a;.}.#endif
1e7b0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1e7c0 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61  statement rollba
1e7d0 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  ck point..**.** 
1e7e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  This routine sho
1e7f0 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69  uld be called wi
1e800 74 68 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  th the transacti
1e810 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61  on journal alrea
1e820 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e  dy.** open.  A n
1e830 65 77 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  ew statement jou
1e840 72 6e 61 6c 20 69 73 20 63 72 65 61 74 65 64 20  rnal is created 
1e850 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
1e860 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20   to rollback.** 
1e870 63 68 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e  changes of a sin
1e880 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20  gle SQL command 
1e890 77 69 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20  within a larger 
1e8a0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
1e8b0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1e8c0 53 74 6d 74 42 65 67 69 6e 28 50 61 67 65 72 20  StmtBegin(Pager 
1e8d0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1e8e0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  rc;.  assert( !p
1e8f0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1e900 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1e910 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
1e920 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 61  ER_SHARED );.  a
1e930 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
1e940 62 53 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 50 41  bSize>=0 );.  PA
1e950 47 45 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d  GERTRACE2("STMT-
1e960 42 45 47 49 4e 20 25 64 5c 6e 22 2c 20 50 41 47  BEGIN %d\n", PAG
1e970 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1e980 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
1e990 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
1e9a0 55 73 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  Use = 1;.    pPa
1e9b0 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
1e9c0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
1e9d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e9e0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
1e9f0 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
1ea00 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70 50 61 67  Open ){.    pPag
1ea10 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e  er->stmtAutoopen
1ea20 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
1ea30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1ea40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1ea50 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
1ea60 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  .  pPager->aInSt
1ea70 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  mt = sqliteMallo
1ea80 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  c( pPager->dbSiz
1ea90 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28  e/8 + 1 );.  if(
1eaa0 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
1eab0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71  ==0 ){.    /* sq
1eac0 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
1ead0 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c  er->fd, SHARED_L
1eae0 4f 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74  OCK); */.    ret
1eaf0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1eb00 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44  ;.  }.#ifndef ND
1eb10 45 42 55 47 0a 20 20 72 63 20 3d 20 73 71 6c 69  EBUG.  rc = sqli
1eb20 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
1eb30 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67  ager->jfd, &pPag
1eb40 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a  er->stmtJSize);.
1eb50 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
1eb60 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65  stmt_begin_faile
1eb70 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  d;.  assert( pPa
1eb80 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
1eb90 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
1eba0 6c 4f 66 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20  lOff );.#endif. 
1ebb0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
1ebc0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ze = pPager->jou
1ebd0 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65  rnalOff;.  pPage
1ebe0 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50  r->stmtSize = pP
1ebf0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
1ec00 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
1ec10 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ff = 0;.  pPager
1ec20 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50  ->stmtCksum = pP
1ec30 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b  ager->cksumInit;
1ec40 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
1ec50 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20  stmtOpen ){.    
1ec60 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1ec70 72 4f 70 65 6e 74 65 6d 70 28 26 70 50 61 67 65  rOpentemp(&pPage
1ec80 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 69 66  r->stfd);.    if
1ec90 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74  ( rc ) goto stmt
1eca0 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20  _begin_failed;. 
1ecb0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f     pPager->stmtO
1ecc0 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  pen = 1;.    pPa
1ecd0 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20  ger->stmtNRec = 
1ece0 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
1ecf0 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a  >stmtInUse = 1;.
1ed00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ed10 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e  OK;. .stmt_begin
1ed20 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70  _failed:.  if( p
1ed30 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29  Pager->aInStmt )
1ed40 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
1ed50 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74  (pPager->aInStmt
1ed60 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
1ed70 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  InStmt = 0;.  }.
1ed80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ed90 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73  /*.** Commit a s
1eda0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  tatement..*/.int
1edb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
1edc0 74 43 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70  tCommit(Pager *p
1edd0 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
1ede0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1edf0 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  ){.    PgHdr *pP
1ee00 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 50  g, *pNext;.    P
1ee10 41 47 45 52 54 52 41 43 45 32 28 22 53 54 4d 54  AGERTRACE2("STMT
1ee20 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50  -COMMIT %d\n", P
1ee30 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1ee40 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20  .    if( !MEMDB 
1ee50 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1ee60 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 73  OsSeek(pPager->s
1ee70 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f  tfd, 0);.      /
1ee80 2a 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  * sqlite3OsTrunc
1ee90 61 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64  ate(pPager->stfd
1eea0 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73  , 0); */.      s
1eeb0 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65  qliteFree( pPage
1eec0 72 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a 20 20  r->aInStmt );.  
1eed0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
1eee0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  tmt = 0;.    }. 
1eef0 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
1ef00 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70  r->pStmt; pPg; p
1ef10 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  Pg=pNext){.     
1ef20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e   pNext = pPg->pN
1ef30 65 78 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 61  extStmt;.      a
1ef40 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 53 74  ssert( pPg->inSt
1ef50 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  mt );.      pPg-
1ef60 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  >inStmt = 0;.   
1ef70 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d     pPg->pPrevStm
1ef80 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  t = pPg->pNextSt
1ef90 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  mt = 0;.      if
1efa0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
1efb0 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
1efc0 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
1efd0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
1efe0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1eff0 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d  Free(pHist->pStm
1f000 74 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73  t);.        pHis
1f010 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t->pStmt = 0;.  
1f020 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1f030 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
1f040 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
1f050 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
1f060 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
1f070 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50  mt = 0;.  }.  pP
1f080 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70  ager->stmtAutoop
1f090 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  en = 0;.  return
1f0a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1f0b0 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20  *.** Rollback a 
1f0c0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e  statement..*/.in
1f0d0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74  t sqlite3PagerSt
1f0e0 6d 74 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  mtRollback(Pager
1f0f0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
1f100 20 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65   rc;.  if( pPage
1f110 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
1f120 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28      PAGERTRACE2(
1f130 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25  "STMT-ROLLBACK %
1f140 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1f150 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20  ager));.    if( 
1f160 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 50  MEMDB ){.      P
1f170 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20  gHdr *pPg;.     
1f180 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
1f190 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67  >pStmt; pPg; pPg
1f1a0 3d 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 29  =pPg->pNextStmt)
1f1b0 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74  {.        PgHist
1f1c0 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
1f1d0 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
1f1e0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1f1f0 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d   if( pHist->pStm
1f200 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  t ){.          m
1f210 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44  emcpy(PGHDR_TO_D
1f220 41 54 41 28 70 50 67 29 2c 20 70 48 69 73 74 2d  ATA(pPg), pHist-
1f230 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72 2d 3e  >pStmt, pPager->
1f240 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
1f250 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
1f260 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  pHist->pStmt);. 
1f270 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e           pHist->
1f280 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  pStmt = 0;.     
1f290 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1f2a0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
1f2b0 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  e = pPager->stmt
1f2c0 53 69 7a 65 3b 0a 20 20 20 20 20 20 6d 65 6d 6f  Size;.      memo
1f2d0 72 79 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  ryTruncate(pPage
1f2e0 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  r);.      rc = S
1f2f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
1f300 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1f310 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62  pager_stmt_playb
1f320 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
1f330 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61   }.    sqlite3Pa
1f340 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50  gerStmtCommit(pP
1f350 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ager);.  }else{.
1f360 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1f370 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  OK;.  }.  pPager
1f380 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d  ->stmtAutoopen =
1f390 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
1f3a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1f3b0 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
1f3c0 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
1f3d0 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  se file..*/.cons
1f3e0 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50  t char *sqlite3P
1f3f0 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 50 61 67  agerFilename(Pag
1f400 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
1f410 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46  eturn pPager->zF
1f420 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ilename;.}../*.*
1f430 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 72  * Return the dir
1f440 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61  ectory of the da
1f450 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
1f460 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
1f470 74 65 33 50 61 67 65 72 44 69 72 6e 61 6d 65 28  te3PagerDirname(
1f480 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1f490 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
1f4a0 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a  >zDirectory;.}..
1f4b0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1f4c0 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   full pathname o
1f4d0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1f4e0 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
1f4f0 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4a  r *sqlite3PagerJ
1f500 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72  ournalname(Pager
1f510 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
1f520 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  urn pPager->zJou
1f530 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rnal;.}../*.** R
1f540 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 66 73  eturn true if fs
1f550 79 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20  ync() calls are 
1f560 64 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69  disabled for thi
1f570 73 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e  s pager.  Return
1f580 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79   FALSE.** if fsy
1f590 6e 63 28 29 73 20 61 72 65 20 65 78 65 63 75 74  nc()s are execut
1f5a0 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a  ed normally..*/.
1f5b0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1f5c0 4e 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50  Nosync(Pager *pP
1f5d0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
1f5e0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
1f5f0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
1f600 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20   codec for this 
1f610 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71  pager.*/.void sq
1f620 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 6f 64  lite3PagerSetCod
1f630 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ec(.  Pager *pPa
1f640 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ger,.  void *(*x
1f650 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
1f660 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20  d*,Pgno,int),.  
1f670 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a  void *pCodecArg.
1f680 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  ){.  pPager->xCo
1f690 64 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20  dec = xCodec;.  
1f6a0 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72  pPager->pCodecAr
1f6b0 67 20 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d  g = pCodecArg;.}
1f6c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1f6d0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
1f6e0 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  o increment the 
1f6f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
1f700 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a  ange-counter,.**
1f710 20 73 74 6f 72 65 64 20 61 74 20 62 79 74 65 20   stored at byte 
1f720 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  24 of the pager 
1f730 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
1f740 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  int pager_incr_c
1f750 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67  hangecounter(Pag
1f760 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
1f770 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20  gHdr *pPgHdr;.  
1f780 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  u32 change_count
1f790 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
1f7a0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63 68   if( !pPager->ch
1f7b0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 7b  angeCountDone ){
1f7c0 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67  .    /* Open pag
1f7d0 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20  e 1 of the file 
1f7e0 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a  for writing. */.
1f7f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f800 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
1f810 20 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20   1, &pPgHdr);.  
1f820 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f830 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1f840 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1f850 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 48  3PagerWrite(pPgH
1f860 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  dr);.    if( rc!
1f870 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1f880 75 72 6e 20 72 63 3b 0a 20 20 0a 20 20 20 20 2f  urn rc;.  .    /
1f890 2a 20 52 65 61 64 20 74 68 65 20 63 75 72 72 65  * Read the curre
1f8a0 6e 74 20 76 61 6c 75 65 20 61 74 20 62 79 74 65  nt value at byte
1f8b0 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e   24. */.    chan
1f8c0 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 72 65 74  ge_counter = ret
1f8d0 72 69 65 76 65 33 32 62 69 74 73 28 70 50 67 48  rieve32bits(pPgH
1f8e0 64 72 2c 20 32 34 29 3b 0a 20 20 0a 20 20 20 20  dr, 24);.  .    
1f8f0 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
1f900 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64   value just read
1f910 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61   and write it ba
1f920 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a  ck to byte 24. *
1f930 2f 0a 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75  /.    change_cou
1f940 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 70 75 74 33  nter++;.    put3
1f950 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 50 47  2bits(((char*)PG
1f960 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 48  HDR_TO_DATA(pPgH
1f970 64 72 29 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f  dr))+24, change_
1f980 63 6f 75 6e 74 65 72 29 3b 0a 20 20 20 20 70 50  counter);.    pP
1f990 61 67 65 72 2d 3e 69 43 68 61 6e 67 65 43 6f 75  ager->iChangeCou
1f9a0 6e 74 20 3d 20 63 68 61 6e 67 65 5f 63 6f 75 6e  nt = change_coun
1f9b0 74 65 72 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52  ter;.  .    /* R
1f9c0 65 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20  elease the page 
1f9d0 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20  reference. */.  
1f9e0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1f9f0 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 20  ref(pPgHdr);.   
1fa00 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
1fa10 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20  ountDone = 1;.  
1fa20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1fa30 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
1fa40 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
1fa50 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61   file for the pa
1fa60 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73  ger pPager. zMas
1fa70 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ter points to th
1fa80 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d  e name.** of a m
1fa90 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1faa0 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  le that should b
1fab0 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
1fac0 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a  he individual.**
1fad0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a   journal file. z
1fae0 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55  Master may be NU
1faf0 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74  LL, which is int
1fb00 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d  erpreted as no m
1fb10 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  aster.** journal
1fb20 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62   (a single datab
1fb30 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
1fb40 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1fb50 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61  tine ensures tha
1fb60 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
1fb70 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72   synced, all dir
1fb80 74 79 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  ty pages written
1fb90 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62  .** to the datab
1fba0 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  ase file and the
1fbb0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
1fbc0 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20  ynced. The only 
1fbd0 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65  thing that.** re
1fbe0 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20  mains to commit 
1fbf0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1fc00 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  is to delete the
1fc10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
1fc20 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72  r.** master jour
1fc30 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63  nal file if spec
1fc40 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  ified)..**.** No
1fc50 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74  te that if zMast
1fc60 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64  er==NULL, this d
1fc70 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74  oes not overwrit
1fc80 65 20 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c  e a previous val
1fc90 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20  ue.** passed to 
1fca0 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  an sqlite3PagerS
1fcb0 79 6e 63 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a  ync() call..**.*
1fcc0 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e  * If parameter n
1fcd0 54 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72  Trunc is non-zer
1fce0 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  o, then the page
1fcf0 72 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61  r file is trunca
1fd00 74 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63  ted to.** nTrunc
1fd10 20 70 61 67 65 73 20 28 74 68 69 73 20 69 73 20   pages (this is 
1fd20 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63  used by auto-vac
1fd30 75 75 6d 20 64 61 74 61 62 61 73 65 73 29 2e 0a  uum databases)..
1fd40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
1fd50 67 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70  gerSync(Pager *p
1fd60 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
1fd70 72 20 2a 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f  r *zMaster, Pgno
1fd80 20 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20   nTrunc){.  int 
1fd90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1fda0 0a 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22  .  PAGERTRACE4("
1fdb0 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46  DATABASE SYNC: F
1fdc0 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25  ile=%s zMaster=%
1fdd0 73 20 6e 54 72 75 6e 63 3d 25 64 5c 6e 22 2c 20  s nTrunc=%d\n", 
1fde0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  .      pPager->z
1fdf0 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65  Filename, zMaste
1fe00 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 0a 20 20 2f  r, nTrunc);..  /
1fe10 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
1fe20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72  in-memory db, or
1fe30 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20 62   no pages have b
1fe40 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20  een written to, 
1fe50 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  or this.  ** fun
1fe60 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
1fe70 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69  y been called, i
1fe80 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  t is a no-op..  
1fe90 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
1fea0 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59  >state!=PAGER_SY
1feb0 4e 43 45 44 20 26 26 20 21 4d 45 4d 44 42 20 26  NCED && !MEMDB &
1fec0 26 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43  & pPager->dirtyC
1fed0 61 63 68 65 20 29 7b 0a 20 20 20 20 50 67 48 64  ache ){.    PgHd
1fee0 72 20 2a 70 50 67 3b 0a 20 20 20 20 61 73 73 65  r *pPg;.    asse
1fef0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
1ff00 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20  nalOpen );..    
1ff10 2f 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  /* If a master j
1ff20 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
1ff30 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1ff40 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
1ff50 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
1ff60 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79  file, then no sy
1ff70 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  nc is required. 
1ff80 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65  This happens whe
1ff90 6e 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77  n it is.    ** w
1ffa0 72 69 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65  ritten, then the
1ffb0 20 70 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74   process fails t
1ffc0 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61  o upgrade from a
1ffd0 20 52 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a   RESERVED to an.
1ffe0 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
1fff0 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20   lock. The next 
20000 74 69 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73  time the process
20010 20 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74   tries to commit
20020 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
20030 73 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20  saction the m-j 
20040 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61  name will have a
20050 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
20060 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ten..    */.    
20070 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74  if( !pPager->set
20080 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Master ){.      
20090 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f  rc = pager_incr_
200a0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50  changecounter(pP
200b0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
200c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
200d0 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
200e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
200f0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
20100 20 20 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63        if( nTrunc
20110 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  !=0 ){.        /
20120 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e 73 61  * If this transa
20130 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74  ction has made t
20140 68 65 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c  he database smal
20150 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61  ler, then all pa
20160 67 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  ges.        ** b
20170 65 69 6e 67 20 64 69 73 63 61 72 64 65 64 20 62  eing discarded b
20180 79 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e  y the truncation
20190 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e   must be written
201a0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   to the journal.
201b0 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e          ** file.
201c0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
201d0 20 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20      Pgno i;.    
201e0 20 20 20 20 69 6e 74 20 69 53 6b 69 70 20 3d 20      int iSkip = 
201f0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
20200 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 66  ager);.        f
20210 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20  or( i=nTrunc+1; 
20220 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  i<=pPager->origD
20230 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20  bSize; i++ ){.  
20240 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70 50          if( !(pP
20250 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
20260 5b 69 2f 38 5d 20 26 20 28 31 3c 3c 28 69 26 37  [i/8] & (1<<(i&7
20270 29 29 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20  ))) && i!=iSkip 
20280 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
20290 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
202a0 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26  Get(pPager, i, &
202b0 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pPg);.          
202c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
202d0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
202e0 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20  exit;.          
202f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
20300 67 65 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20  gerWrite(pPg);. 
20310 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
20320 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
20330 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
20340 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20350 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
20360 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
20370 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20         } .      
20380 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  }.#endif.      r
20390 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65 72 4a  c = writeMasterJ
203a0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a  ournal(pPager, z
203b0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69  Master);.      i
203c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
203d0 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
203e0 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79  t;.      rc = sy
203f0 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
20400 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
20410 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
20420 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
20430 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
20440 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
20450 55 4d 0a 20 20 20 20 69 66 28 20 6e 54 72 75 6e  UM.    if( nTrun
20460 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  c!=0 ){.      rc
20470 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
20480 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
20490 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 69  nTrunc);.      i
204a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
204b0 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
204c0 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  t;.    }.#endif.
204d0 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c  .    /* Write al
204e0 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  l dirty pages to
204f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20500 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  le */.    pPg = 
20510 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69  pager_get_all_di
20520 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72  rty_pages(pPager
20530 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
20540 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
20550 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  (pPg);.    if( r
20560 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
20570 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a  oto sync_exit;..
20580 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
20590 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
205a0 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  /.    if( !pPage
205b0 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
205c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
205d0 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64  sSync(pPager->fd
205e0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
205f0 49 4f 54 52 41 43 45 28 28 22 44 42 53 59 4e 43  IOTRACE(("DBSYNC
20600 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
20610 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ..    pPager->st
20620 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43  ate = PAGER_SYNC
20630 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ED;.  }else if( 
20640 4d 45 4d 44 42 20 26 26 20 6e 54 72 75 6e 63 21  MEMDB && nTrunc!
20650 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
20660 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
20670 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75  ate(pPager, nTru
20680 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65  nc);.  }..sync_e
20690 78 69 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  xit:.  return rc
206a0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
206b0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
206c0 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  UUM./*.** Move t
206d0 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66 69  he page identifi
206e0 65 64 20 62 79 20 70 44 61 74 61 20 74 6f 20 6c  ed by pData to l
206f0 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20  ocation pgno in 
20700 74 68 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  the file. .**.**
20710 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e   There must be n
20720 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  o references to 
20730 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
20740 20 70 67 6e 6f 2e 20 49 66 20 63 75 72 72 65 6e   pgno. If curren
20750 74 20 70 61 67 65 0a 2a 2a 20 70 67 6e 6f 20 69  t page.** pgno i
20760 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e  s not already in
20770 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
20780 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74  urnal, it is not
20790 20 77 72 69 74 74 65 6e 20 74 68 65 72 65 20 62   written there b
207a0 79 0a 2a 2a 20 62 79 20 74 68 69 73 20 72 6f 75  y.** by this rou
207b0 74 69 6e 65 2e 20 54 68 65 20 73 61 6d 65 20 61  tine. The same a
207c0 70 70 6c 69 65 73 20 74 6f 20 74 68 65 20 70 61  pplies to the pa
207d0 67 65 20 70 44 61 74 61 20 72 65 66 65 72 73 20  ge pData refers 
207e0 74 6f 20 6f 6e 20 65 6e 74 72 79 20 74 6f 0a 2a  to on entry to.*
207f0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
20800 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73  **.** References
20810 20 74 6f 20 74 68 65 20 70 61 67 65 20 72 65 66   to the page ref
20820 65 72 65 64 20 74 6f 20 62 79 20 70 44 61 74 61  ered to by pData
20830 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55   remain valid. U
20840 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d  pdating any.** m
20850 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61  eta-data associa
20860 74 65 64 20 77 69 74 68 20 70 61 67 65 20 70 44  ted with page pD
20870 61 74 61 20 28 69 2e 65 2e 20 64 61 74 61 20 73  ata (i.e. data s
20880 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78  tored in the nEx
20890 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c  tra bytes.** all
208a0 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74  ocated along wit
208b0 68 20 74 68 65 20 70 61 67 65 29 20 69 73 20 74  h the page) is t
208c0 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
208d0 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e  y of the caller.
208e0 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63  .**.** A transac
208f0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74  tion must be act
20900 69 76 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ive when this ro
20910 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
20920 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a   It used to be.*
20930 2a 20 72 65 71 75 69 72 65 64 20 74 68 61 74 20  * required that 
20940 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
20950 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20  saction was not 
20960 61 63 74 69 76 65 2c 20 62 75 74 20 74 68 69 73  active, but this
20970 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20   restriction.** 
20980 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64  has been removed
20990 20 28 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e   (CREATE INDEX n
209a0 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70  eeds to move a p
209b0 61 67 65 20 77 68 65 6e 20 61 20 73 74 61 74 65  age when a state
209c0 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ment.** transact
209d0 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a  ion is active)..
209e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
209f0 67 65 72 4d 6f 76 65 70 61 67 65 28 50 61 67 65  gerMovepage(Page
20a00 72 20 2a 70 50 61 67 65 72 2c 20 44 62 50 61 67  r *pPager, DbPag
20a10 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e  e *pPg, Pgno pgn
20a20 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
20a30 4f 6c 64 3b 20 0a 20 20 69 6e 74 20 68 3b 0a 20  Old; .  int h;. 
20a40 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67   Pgno needSyncPg
20a50 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  no = 0;..  asser
20a60 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
20a70 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 35  ;..  PAGERTRACE5
20a80 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25  ("MOVE %d page %
20a90 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20  d (needSync=%d) 
20aa0 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20  moves to %d\n", 
20ab0 0a 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70  .      PAGERID(p
20ac0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
20ad0 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  o, pPg->needSync
20ae0 2c 20 70 67 6e 6f 29 3b 0a 20 20 49 4f 54 52 41  , pgno);.  IOTRA
20af0 43 45 28 28 22 4d 4f 56 45 20 25 70 20 25 64 20  CE(("MOVE %p %d 
20b00 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
20b10 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29  Pg->pgno, pgno))
20b20 0a 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65  ..  if( pPg->nee
20b30 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 6e 65 65  dSync ){.    nee
20b40 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d  dSyncPgno = pPg-
20b50 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72  >pgno;.    asser
20b60 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  t( pPg->inJourna
20b70 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  l );.    assert(
20b80 20 70 50 67 2d 3e 64 69 72 74 79 20 29 3b 0a 20   pPg->dirty );. 
20b90 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
20ba0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20  r->needSync );. 
20bb0 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20   }..  /* Unlink 
20bc0 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61  pPg from it's ha
20bd0 73 68 2d 63 68 61 69 6e 20 2a 2f 0a 20 20 75 6e  sh-chain */.  un
20be0 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50  linkHashChain(pP
20bf0 61 67 65 72 2c 20 70 50 67 29 3b 0a 0a 20 20 2f  ager, pPg);..  /
20c00 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20 63  * If the cache c
20c10 6f 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20 77  ontains a page w
20c20 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  ith page-number 
20c30 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a  pgno, remove it.
20c40 20 20 2a 2a 20 66 72 6f 6d 20 69 74 27 73 20 68    ** from it's h
20c50 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c  ash chain. Also,
20c60 20 69 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65   if the PgHdr.ne
20c70 65 64 53 79 6e 63 20 77 61 73 20 73 65 74 20 66  edSync was set f
20c80 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67  or .  ** page pg
20c90 6e 6f 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d  no before the 'm
20ca0 6f 76 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20  ove' operation, 
20cb0 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  it needs to be r
20cc0 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f  etained .  ** fo
20cd0 72 20 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64  r the page moved
20ce0 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70   there..  */.  p
20cf0 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f  PgOld = pager_lo
20d00 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
20d10 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64  o);.  if( pPgOld
20d20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
20d30 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20  pPgOld->nRef==0 
20d40 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73  );.    unlinkHas
20d50 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70  hChain(pPager, p
20d60 50 67 4f 6c 64 29 3b 0a 20 20 20 20 6d 61 6b 65  PgOld);.    make
20d70 43 6c 65 61 6e 28 70 50 67 4f 6c 64 29 3b 0a 20  Clean(pPgOld);. 
20d80 20 20 20 69 66 28 20 70 50 67 4f 6c 64 2d 3e 6e     if( pPgOld->n
20d90 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
20da0 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d   assert( pPgOld-
20db0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  >inJournal );.  
20dc0 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
20dd0 61 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50  al = 1;.      pP
20de0 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  g->needSync = 1;
20df0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20e00 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
20e10 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
20e20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 61  /* Change the pa
20e30 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 50  ge number for pP
20e40 67 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20  g and insert it 
20e50 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 68 61 73  into the new has
20e60 68 2d 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 61 73  h-chain. */.  as
20e70 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
20e80 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70  .  pPg->pgno = p
20e90 67 6e 6f 3b 0a 20 20 68 20 3d 20 70 67 6e 6f 20  gno;.  h = pgno 
20ea0 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  & (pPager->nHash
20eb0 2d 31 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  -1);.  if( pPage
20ec0 72 2d 3e 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20  r->aHash[h] ){. 
20ed0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
20ee0 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72  r->aHash[h]->pPr
20ef0 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
20f00 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
20f10 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  ]->pPrevHash = p
20f20 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  Pg;.  }.  pPg->p
20f30 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65  NextHash = pPage
20f40 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 70  r->aHash[h];.  p
20f50 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20  Pager->aHash[h] 
20f60 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 70 50  = pPg;.  pPg->pP
20f70 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 0a 20 20  revHash = 0;..  
20f80 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  makeDirty(pPg);.
20f90 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
20fa0 61 63 68 65 20 3d 20 31 3b 0a 0a 20 20 69 66 28  ache = 1;..  if(
20fb0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b   needSyncPgno ){
20fc0 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53  .    /* If needS
20fd0 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a  yncPgno is non-z
20fe0 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ero, then the jo
20ff0 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73  urnal file needs
21000 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73   to be .    ** s
21010 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 61  ync()ed before a
21020 6e 79 20 64 61 74 61 20 69 73 20 77 72 69 74 74  ny data is writt
21030 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20 66  en to database f
21040 69 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e  ile page needSyn
21050 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75  cPgno..    ** Cu
21060 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68  rrently, no such
21070 20 70 61 67 65 20 65 78 69 73 74 73 20 69 6e 20   page exists in 
21080 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61  the page-cache a
21090 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 50  nd the .    ** P
210a0 61 67 65 72 2e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ager.aInJournal 
210b0 62 69 74 20 68 61 73 20 62 65 65 6e 20 73 65 74  bit has been set
210c0 2e 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20  . This needs to 
210d0 62 65 20 72 65 6d 65 64 69 65 64 20 62 79 20 6c  be remedied by l
210e0 6f 61 64 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  oading.    ** th
210f0 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
21100 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20  pager-cache and 
21110 73 65 74 74 69 6e 67 20 74 68 65 20 50 67 48 64  setting the PgHd
21120 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 2e  r.needSync flag.
21130 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
21140 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  he sqlite3PagerG
21150 65 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61  et() call may ca
21160 75 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  use the journal 
21170 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65  to sync. So make
21180 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65  .    ** sure the
21190 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20   Pager.needSync 
211a0 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e  flag is set too.
211b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
211c0 72 63 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 70  rc;.    PgHdr *p
211d0 50 67 48 64 72 3b 0a 20 20 20 20 61 73 73 65 72  PgHdr;.    asser
211e0 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
211f0 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ync );.    rc = 
21200 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
21210 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e 63  pPager, needSync
21220 50 67 6e 6f 2c 20 26 70 50 67 48 64 72 29 3b 0a  Pgno, &pPgHdr);.
21230 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
21240 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
21250 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  c;.    pPager->n
21260 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
21270 20 70 50 67 48 64 72 2d 3e 6e 65 65 64 53 79 6e   pPgHdr->needSyn
21280 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 48 64  c = 1;.    pPgHd
21290 72 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  r->inJournal = 1
212a0 3b 0a 20 20 20 20 6d 61 6b 65 44 69 72 74 79 28  ;.    makeDirty(
212b0 70 50 67 48 64 72 29 3b 0a 20 20 20 20 73 71 6c  pPgHdr);.    sql
212c0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
212d0 50 67 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 72  PgHdr);.  }..  r
212e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
212f0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
21300 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
21310 72 20 74 6f 20 74 68 65 20 64 61 74 61 20 66 6f  r to the data fo
21320 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
21330 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  page..*/.void *s
21340 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
21350 74 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ta(DbPage *pPg){
21360 0a 20 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f  .  return PGHDR_
21370 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a  TO_DATA(pPg);.}.
21380 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
21390 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50  pointer to the P
213a0 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65  ager.nExtra byte
213b0 73 20 6f 66 20 22 65 78 74 72 61 22 20 73 70 61  s of "extra" spa
213c0 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  ce .** allocated
213d0 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
213e0 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a  specified page..
213f0 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
21400 50 61 67 65 72 47 65 74 45 78 74 72 61 28 44 62  PagerGetExtra(Db
21410 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61  Page *pPg){.  Pa
21420 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
21430 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 72 65 74  g->pPager;.  ret
21440 75 72 6e 20 28 70 50 61 67 65 72 3f 50 47 48 44  urn (pPager?PGHD
21450 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20  R_TO_EXTRA(pPg, 
21460 70 50 61 67 65 72 29 3a 30 29 3b 0a 7d 0a 0a 2f  pPager):0);.}../
21470 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65  *.** Get/set the
21480 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f   locking-mode fo
21490 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 50 61  r this pager. Pa
214a0 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75  rameter eMode mu
214b0 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20  st be one.** of 
214c0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
214d0 45 5f 51 55 45 52 59 2c 20 50 41 47 45 52 5f 4c  E_QUERY, PAGER_L
214e0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
214f0 4c 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c  L or .** PAGER_L
21500 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
21510 53 49 56 45 2e 20 49 66 20 74 68 65 20 70 61 72  SIVE. If the par
21520 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51  ameter is not _Q
21530 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  UERY, then.** th
21540 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69  e locking-mode i
21550 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
21560 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a  ue specified..**
21570 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
21580 20 76 61 6c 75 65 20 69 73 20 65 69 74 68 65 72   value is either
21590 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
215a0 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20  DE_NORMAL or.** 
215b0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
215c0 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 69 6e 64  E_EXCLUSIVE, ind
215d0 69 63 61 74 69 6e 67 20 74 68 65 20 63 75 72 72  icating the curr
215e0 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70  ent (possibly up
215f0 64 61 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e  dated).** lockin
21600 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  g-mode..*/.int s
21610 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69  qlite3PagerLocki
21620 6e 67 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50  ngMode(Pager *pP
21630 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29  ager, int eMode)
21640 7b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30  {.  if( eMode>=0
21650 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
21660 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
21670 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74  eMode;.  }.  ret
21680 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d  urn (int)pPager-
21690 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a  >exclusiveMode;.
216a0 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
216b0 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
216c0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
216d0 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
216e0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  n the current st
216f0 61 74 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ate of the file 
21700 6c 6f 63 6b 20 66 6f 72 20 74 68 65 20 67 69 76  lock for the giv
21710 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 54 68 65  en pager..** The
21720 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
21730 20 6f 6e 65 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c   one of NO_LOCK,
21740 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
21750 53 45 52 56 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20  SERVED_LOCK,.** 
21760 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72  PENDING_LOCK, or
21770 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e   EXCLUSIVE_LOCK.
21780 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
21790 61 67 65 72 4c 6f 63 6b 73 74 61 74 65 28 50 61  agerLockstate(Pa
217a0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
217b0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
217c0 4c 6f 63 6b 53 74 61 74 65 28 70 50 61 67 65 72  LockState(pPager
217d0 2d 3e 66 64 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ->fd);.}.#endif.
217e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
217f0 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  EBUG./*.** Print
21800 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c   a listing of al
21810 6c 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  l referenced pag
21820 65 73 20 61 6e 64 20 74 68 65 69 72 20 72 65 66  es and their ref
21830 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20   count..*/.void 
21840 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 64  sqlite3PagerRefd
21850 75 6d 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  ump(Pager *pPage
21860 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
21870 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
21880 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
21890 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
218a0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  ){.    if( pPg->
218b0 6e 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e  nRef<=0 ) contin
218c0 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  ue;.    sqlite3D
218d0 65 62 75 67 50 72 69 6e 74 66 28 22 50 41 47 45  ebugPrintf("PAGE
218e0 20 25 33 64 20 61 64 64 72 3d 25 70 20 6e 52 65   %3d addr=%p nRe
218f0 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  f=%d\n", .      
21900 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 47 48 44   pPg->pgno, PGHD
21910 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
21920 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a  pPg->nRef);.  }.
21930 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66  }.#endif..#endif
21940 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
21950 44 49 53 4b 49 4f 20 2a 2f 0a                    DISKIO */.