/ Hex Artifact Content
Login

Artifact a193f8f0783e33ea0aa1965e951c3daa2b2c9c4e:


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 34  : pager.c,v 1.34
0350: 32 20 32 30 30 37 2f 30 35 2f 32 34 20 30 39 3a  2 2007/05/24 09:
0360: 34 31 3a 32 31 20 64 61 6e 69 65 6c 6b 31 39 37  41:21 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 6f 72 0a 2a 2a 20 20 20 20 20  emove or.**     
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d70: 20 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a    truncate the j
0d80: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20  ournal file and 
0d90: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
0da0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0db0: 20 20 20 20 20 20 20 20 20 20 77 69 6c 6c 20 62            will b
0dc0: 65 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a  e committed..**.
0dd0: 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63 68  ** The page cach
0de0: 65 20 63 6f 6d 65 73 20 75 70 20 69 6e 20 50 41  e comes up in PA
0df0: 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65  GER_UNLOCK.  The
0e00: 20 66 69 72 73 74 20 74 69 6d 65 20 61 0a 2a 2a   first time a.**
0e10: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
0e20: 28 29 20 6f 63 63 75 72 73 2c 20 74 68 65 20 73  () occurs, the s
0e30: 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73  tate transitions
0e40: 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
0e50: 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 70  ..** After all p
0e60: 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 72  ages have been r
0e70: 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73 71  eleased using sq
0e80: 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72 65 66 28  lite_page_unref(
0e90: 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  ),.** the state 
0ea0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 61 63 6b  transitions back
0eb0: 20 74 6f 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b   to PAGER_UNLOCK
0ec0: 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  .  The first tim
0ed0: 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69 74 65  e.** that sqlite
0ee0: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73  3PagerWrite() is
0ef0: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 73 74 61   called, the sta
0f00: 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  te transitions t
0f10: 6f 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52  o.** PAGER_RESER
0f20: 56 45 44 2e 20 20 28 4e 6f 74 65 20 74 68 61 74  VED.  (Note that
0f30: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
0f40: 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62 65  te() can only be
0f50: 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e  .** called on an
0f60: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
0f70: 65 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68  e which means th
0f80: 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 75 73  at the pager mus
0f90: 74 0a 2a 2a 20 62 65 20 69 6e 20 50 41 47 45 52  t.** be in PAGER
0fa0: 5f 53 48 41 52 45 44 20 62 65 66 6f 72 65 20 69  _SHARED before i
0fb0: 74 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f  t transitions to
0fc0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
0fd0: 29 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52  ).** PAGER_RESER
0fe0: 56 45 44 20 6d 65 61 6e 73 20 74 68 61 74 20 74  VED means that t
0ff0: 68 65 72 65 20 69 73 20 61 6e 20 6f 70 65 6e 20  here is an open 
1000: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1010: 2e 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73 69 74  ..** The transit
1020: 69 6f 6e 20 74 6f 20 50 41 47 45 52 5f 45 58 43  ion to PAGER_EXC
1030: 4c 55 53 49 56 45 20 6f 63 63 75 72 73 20 62 65  LUSIVE occurs be
1040: 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73  fore any changes
1050: 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20  .** are made to 
1060: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1070: 65 2c 20 74 68 6f 75 67 68 20 77 72 69 74 65 73  e, though writes
1080: 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   to the rollback
1090: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f 63 63 75  .** journal occu
10a0: 72 73 20 77 69 74 68 20 6a 75 73 74 20 50 41 47  rs with just PAG
10b0: 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 41 66  ER_RESERVED.  Af
10c0: 74 65 72 20 61 6e 20 73 71 6c 69 74 65 33 50 61  ter an sqlite3Pa
10d0: 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a  gerRollback().**
10e0: 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67 65 72   or sqlite3Pager
10f0: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
1100: 2c 20 74 68 65 20 73 74 61 74 65 20 63 61 6e 20  , the state can 
1110: 67 6f 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  go back to PAGER
1120: 5f 53 48 41 52 45 44 2c 0a 2a 2a 20 6f 72 20 69  _SHARED,.** or i
1130: 74 20 63 61 6e 20 73 74 61 79 20 61 74 20 50 41  t can stay at PA
1140: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 69 66  GER_EXCLUSIVE if
1150: 20 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c 75   we are in exclu
1160: 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65  sive access mode
1170: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
1180: 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30  ER_UNLOCK      0
1190: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
11a0: 48 41 52 45 44 20 20 20 20 20 20 31 20 20 20 2f  HARED      1   /
11b0: 2a 20 73 61 6d 65 20 61 73 20 53 48 41 52 45 44  * same as SHARED
11c0: 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65  _LOCK */.#define
11d0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
11e0: 20 20 20 32 20 20 20 2f 2a 20 73 61 6d 65 20 61     2   /* same a
11f0: 73 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  s RESERVED_LOCK 
1200: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
1210: 5f 45 58 43 4c 55 53 49 56 45 20 20 20 34 20 20  _EXCLUSIVE   4  
1220: 20 2f 2a 20 73 61 6d 65 20 61 73 20 45 58 43 4c   /* same as EXCL
1230: 55 53 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64  USIVE_LOCK */.#d
1240: 65 66 69 6e 65 20 50 41 47 45 52 5f 53 59 4e 43  efine PAGER_SYNC
1250: 45 44 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a  ED      5../*.**
1260: 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 42   If the SQLITE_B
1270: 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43  USY_RESERVED_LOC
1280: 4b 20 6d 61 63 72 6f 20 69 73 20 73 65 74 20 74  K macro is set t
1290: 6f 20 74 72 75 65 20 61 74 20 63 6f 6d 70 69 6c  o true at compil
12a0: 65 2d 74 69 6d 65 2c 0a 2a 2a 20 74 68 65 6e 20  e-time,.** then 
12b0: 66 61 69 6c 65 64 20 61 74 74 65 6d 70 74 73 20  failed attempts 
12c0: 74 6f 20 67 65 74 20 61 20 72 65 73 65 72 76 65  to get a reserve
12d0: 64 20 6c 6f 63 6b 20 77 69 6c 6c 20 69 6e 76 6f  d lock will invo
12e0: 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ke the busy call
12f0: 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 69 73  back..** This is
1300: 20 6f 66 66 20 62 79 20 64 65 66 61 75 6c 74 2e   off by default.
1310: 20 20 54 6f 20 73 65 65 20 77 68 79 2c 20 63 6f    To see why, co
1320: 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
1330: 77 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a 2a  wing scenario:.*
1340: 2a 20 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68  * .** Suppose th
1350: 72 65 61 64 20 41 20 61 6c 72 65 61 64 79 20 68  read A already h
1360: 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  as a shared lock
1370: 20 61 6e 64 20 77 61 6e 74 73 20 61 20 72 65 73   and wants a res
1380: 65 72 76 65 64 20 6c 6f 63 6b 2e 0a 2a 2a 20 54  erved lock..** T
1390: 68 72 65 61 64 20 42 20 61 6c 72 65 61 64 79 20  hread B already 
13a0: 68 61 73 20 61 20 72 65 73 65 72 76 65 64 20 6c  has a reserved l
13b0: 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73 20 61 6e  ock and wants an
13c0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
13d0: 20 20 49 66 0a 2a 2a 20 62 6f 74 68 20 74 68 72    If.** both thr
13e0: 65 61 64 73 20 61 72 65 20 75 73 69 6e 67 20 74  eads are using t
13f0: 68 65 69 72 20 62 75 73 79 20 63 61 6c 6c 62 61  heir busy callba
1400: 63 6b 73 2c 20 69 74 20 6d 69 67 68 74 20 62 65  cks, it might be
1410: 20 61 20 6c 6f 6e 67 20 74 69 6d 65 0a 2a 2a 20   a long time.** 
1420: 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  be for one of th
1430: 65 20 74 68 72 65 61 64 73 20 67 69 76 65 20 75  e threads give u
1440: 70 20 61 6e 64 20 61 6c 6c 6f 77 73 20 74 68 65  p and allows the
1450: 20 6f 74 68 65 72 20 74 6f 20 70 72 6f 63 65 65   other to procee
1460: 64 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65  d..** But if the
1470: 20 74 68 72 65 61 64 20 74 72 79 69 6e 67 20 74   thread trying t
1480: 6f 20 67 65 74 20 74 68 65 20 72 65 73 65 72 76  o get the reserv
1490: 65 64 20 6c 6f 63 6b 20 67 69 76 65 73 20 75 70  ed lock gives up
14a0: 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 28 69 66 20   quickly.** (if 
14b0: 69 74 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 73  it never invokes
14c0: 20 69 74 73 20 62 75 73 79 20 63 61 6c 6c 62 61   its busy callba
14d0: 63 6b 29 20 74 68 65 6e 20 74 68 65 20 63 6f 6e  ck) then the con
14e0: 74 65 6e 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a  tention will be.
14f0: 2a 2a 20 72 65 73 6f 6c 76 65 64 20 71 75 69 63  ** resolved quic
1500: 6b 6c 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  kly..*/.#ifndef 
1510: 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45  SQLITE_BUSY_RESE
1520: 52 56 45 44 5f 4c 4f 43 4b 0a 23 20 64 65 66 69  RVED_LOCK.# defi
1530: 6e 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52  ne SQLITE_BUSY_R
1540: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 30 0a 23  ESERVED_LOCK 0.#
1550: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1560: 73 20 6d 61 63 72 6f 20 72 6f 75 6e 64 73 20 76  s macro rounds v
1570: 61 6c 75 65 73 20 75 70 20 73 6f 20 74 68 61 74  alues up so that
1580: 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73   if the value is
1590: 20 61 6e 20 61 64 64 72 65 73 73 20 69 74 0a 2a   an address it.*
15a0: 2a 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  * is guaranteed 
15b0: 74 6f 20 62 65 20 61 6e 20 61 64 64 72 65 73 73  to be an address
15c0: 20 74 68 61 74 20 69 73 20 61 6c 69 67 6e 65 64   that is aligned
15d0: 20 74 6f 20 61 6e 20 38 2d 62 79 74 65 20 62 6f   to an 8-byte bo
15e0: 75 6e 64 61 72 79 2e 0a 2a 2f 0a 23 64 65 66 69  undary..*/.#defi
15f0: 6e 65 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45  ne FORCE_ALIGNME
1600: 4e 54 28 58 29 20 20 20 28 28 28 58 29 2b 37 29  NT(X)   (((X)+7)
1610: 26 7e 37 29 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  &~7)../*.** Each
1620: 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65   in-memory image
1630: 20 6f 66 20 61 20 70 61 67 65 20 62 65 67 69 6e   of a page begin
1640: 73 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  s with the follo
1650: 77 69 6e 67 20 68 65 61 64 65 72 2e 0a 2a 2a 20  wing header..** 
1660: 54 68 69 73 20 68 65 61 64 65 72 20 69 73 20 6f  This header is o
1670: 6e 6c 79 20 76 69 73 69 62 6c 65 20 74 6f 20 74  nly visible to t
1680: 68 69 73 20 70 61 67 65 72 20 6d 6f 64 75 6c 65  his pager module
1690: 2e 20 20 54 68 65 20 63 6c 69 65 6e 74 0a 2a 2a  .  The client.**
16a0: 20 63 6f 64 65 20 74 68 61 74 20 63 61 6c 6c 73   code that calls
16b0: 20 70 61 67 65 72 20 73 65 65 73 20 6f 6e 6c 79   pager sees only
16c0: 20 74 68 65 20 64 61 74 61 20 74 68 61 74 20 66   the data that f
16d0: 6f 6c 6c 6f 77 73 20 74 68 65 20 68 65 61 64 65  ollows the heade
16e0: 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20  r..**.** Client 
16f0: 63 6f 64 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c  code should call
1700: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1710: 74 65 28 29 20 6f 6e 20 61 20 70 61 67 65 20 70  te() on a page p
1720: 72 69 6f 72 20 74 6f 20 6d 61 6b 69 6e 67 0a 2a  rior to making.*
1730: 2a 20 61 6e 79 20 6d 6f 64 69 66 69 63 61 74 69  * any modificati
1740: 6f 6e 73 20 74 6f 20 74 68 61 74 20 70 61 67 65  ons to that page
1750: 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  .  The first tim
1760: 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  e sqlite3PagerWr
1770: 69 74 65 28 29 0a 2a 2a 20 69 73 20 63 61 6c 6c  ite().** is call
1780: 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ed, the original
1790: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
17a0: 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  re written into 
17b0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  the rollback.** 
17c0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48 64  journal and PgHd
17d0: 72 2e 69 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64 20  r.inJournal and 
17e0: 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 61  PgHdr.needSync a
17f0: 72 65 20 73 65 74 2e 20 20 4c 61 74 65 72 2c 20  re set.  Later, 
1800: 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  once.** the jour
1810: 6e 61 6c 20 70 61 67 65 20 68 61 73 20 6d 61 64  nal page has mad
1820: 65 20 69 74 20 6f 6e 74 6f 20 74 68 65 20 64 69  e it onto the di
1830: 73 6b 20 73 75 72 66 61 63 65 2c 20 50 67 48 64  sk surface, PgHd
1840: 72 2e 6e 65 65 64 53 79 6e 63 0a 2a 2a 20 69 73  r.needSync.** is
1850: 20 63 6c 65 61 72 65 64 2e 20 20 54 68 65 20 6d   cleared.  The m
1860: 6f 64 69 66 69 65 64 20 70 61 67 65 20 63 61 6e  odified page can
1870: 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62  not be written b
1880: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  ack into the ori
1890: 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ginal.** databas
18a0: 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65  e file until the
18b0: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 73 20 68   journal pages h
18c0: 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74  as been synced t
18d0: 6f 20 64 69 73 6b 20 61 6e 64 20 74 68 65 0a 2a  o disk and the.*
18e0: 2a 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  * PgHdr.needSync
18f0: 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65   has been cleare
1900: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 67 48  d..**.** The PgH
1910: 64 72 2e 64 69 72 74 79 20 66 6c 61 67 20 69 73  dr.dirty flag is
1920: 20 73 65 74 20 77 68 65 6e 20 73 71 6c 69 74 65   set when sqlite
1930: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73  3PagerWrite() is
1940: 20 63 61 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 69   called and.** i
1950: 73 20 63 6c 65 61 72 65 64 20 61 67 61 69 6e 20  s cleared again 
1960: 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 63 6f  when the page co
1970: 6e 74 65 6e 74 20 69 73 20 77 72 69 74 74 65 6e  ntent is written
1980: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6f 72 69   back to the ori
1990: 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ginal.** databas
19a0: 65 20 66 69 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64  e file..*/.typed
19b0: 65 66 20 73 74 72 75 63 74 20 50 67 48 64 72 20  ef struct PgHdr 
19c0: 50 67 48 64 72 3b 0a 73 74 72 75 63 74 20 50 67  PgHdr;.struct Pg
19d0: 48 64 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70  Hdr {.  Pager *p
19e0: 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20  Pager;          
19f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1a00: 67 65 72 20 74 6f 20 77 68 69 63 68 20 74 68 69  ger to which thi
1a10: 73 20 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a  s page belongs *
1a20: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a40: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
1a50: 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 70  umber for this p
1a60: 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  age */.  PgHdr *
1a70: 70 4e 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65  pNextHash, *pPre
1a80: 76 48 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20  vHash;  /* Hash 
1a90: 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20  collision chain 
1aa0: 66 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a  for PgHdr.pgno *
1ab0: 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74  /.  PgHdr *pNext
1ac0: 46 72 65 65 2c 20 2a 70 50 72 65 76 46 72 65 65  Free, *pPrevFree
1ad0: 3b 20 20 2f 2a 20 46 72 65 65 6c 69 73 74 20 6f  ;  /* Freelist o
1ae0: 66 20 70 61 67 65 73 20 77 68 65 72 65 20 6e 52  f pages where nR
1af0: 65 66 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72  ef==0 */.  PgHdr
1b00: 20 2a 70 4e 65 78 74 41 6c 6c 3b 20 20 20 20 20   *pNextAll;     
1b10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6c            /* A l
1b20: 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
1b30: 20 2a 2f 0a 20 20 75 38 20 69 6e 4a 6f 75 72 6e   */.  u8 inJourn
1b40: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
1b50: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20       /* TRUE if 
1b60: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
1b70: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   to journal */. 
1b80: 20 75 38 20 64 69 72 74 79 3b 20 20 20 20 20 20   u8 dirty;      
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 2f 2a 20 54 52 55 45 20 69 66 20 77 65 20 6e 65  /* TRUE if we ne
1bb0: 65 64 20 74 6f 20 77 72 69 74 65 20 62 61 63 6b  ed to write back
1bc0: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 75 38   changes */.  u8
1bd0: 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20   needSync;      
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bf0: 53 79 6e 63 20 6a 6f 75 72 6e 61 6c 20 62 65 66  Sync journal bef
1c00: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 68 69 73  ore writing this
1c10: 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 61 6c   page */.  u8 al
1c20: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20  waysRollback;   
1c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73            /* Dis
1c40: 61 62 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62 61 63  able DontRollbac
1c50: 6b 28 29 20 66 6f 72 20 74 68 69 73 20 70 61 67  k() for this pag
1c60: 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 52 65  e */.  u8 needRe
1c70: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ad;             
1c80: 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 63 6f        /* Read co
1c90: 6e 74 65 6e 74 20 69 66 20 50 61 67 65 72 57 72  ntent if PagerWr
1ca0: 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
1cb0: 2a 2f 0a 20 20 73 68 6f 72 74 20 69 6e 74 20 6e  */.  short int n
1cc0: 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
1cd0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ce0: 20 75 73 65 72 73 20 6f 66 20 74 68 69 73 20 70   users of this p
1cf0: 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  age */.  PgHdr *
1d00: 70 44 69 72 74 79 2c 20 2a 70 50 72 65 76 44 69  pDirty, *pPrevDi
1d10: 72 74 79 3b 20 20 20 20 2f 2a 20 44 69 72 74 79  rty;    /* Dirty
1d20: 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 33 32 20   pages */.  u32 
1d30: 6e 6f 74 55 73 65 64 3b 20 20 20 20 20 20 20 20  notUsed;        
1d40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
1d50: 66 66 65 72 20 73 70 61 63 65 20 2a 2f 0a 23 69  ffer space */.#i
1d60: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
1d70: 4b 5f 50 41 47 45 53 0a 20 20 75 33 32 20 70 61  K_PAGES.  u32 pa
1d80: 67 65 48 61 73 68 3b 0a 23 65 6e 64 69 66 0a 20  geHash;.#endif. 
1d90: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65   /* pPager->page
1da0: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 70 61  Size bytes of pa
1db0: 67 65 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74  ge data follow t
1dc0: 68 69 73 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  his header */.  
1dd0: 2f 2a 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20  /* Pager.nExtra 
1de0: 62 79 74 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64  bytes of local d
1df0: 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70  ata follow the p
1e00: 61 67 65 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a  age data */.};..
1e10: 2f 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d  /*.** For an in-
1e20: 6d 65 6d 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61  memory only data
1e30: 62 61 73 65 2c 20 73 6f 6d 65 20 65 78 74 72 61  base, some extra
1e40: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
1e50: 72 65 63 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a  recorded about.*
1e60: 2a 20 65 61 63 68 20 70 61 67 65 20 73 6f 20 74  * each page so t
1e70: 68 61 74 20 63 68 61 6e 67 65 73 20 63 61 6e 20  hat changes can 
1e80: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  be rolled back. 
1e90: 20 28 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20   (Journal files 
1ea0: 61 72 65 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20  are not.** used 
1eb0: 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  for in-memory da
1ec0: 74 61 62 61 73 65 73 2e 29 20 20 54 68 65 20 66  tabases.)  The f
1ed0: 6f 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61  ollowing informa
1ee0: 74 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f  tion is added to
1ef0: 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 65  .** the end of e
1f00: 76 65 72 79 20 45 58 54 52 41 20 62 6c 6f 63 6b  very EXTRA block
1f10: 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   for in-memory d
1f20: 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20  atabases..**.** 
1f30: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
1f40: 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   could have been
1f50: 20 61 64 64 65 64 20 64 69 72 65 63 74 6c 79 20   added directly 
1f60: 74 6f 20 74 68 65 20 50 67 48 64 72 20 73 74 72  to the PgHdr str
1f70: 75 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74  ucture..** But t
1f80: 68 65 6e 20 69 74 20 77 6f 75 6c 64 20 74 61 6b  hen it would tak
1f90: 65 20 75 70 20 61 6e 20 65 78 74 72 61 20 38 20  e up an extra 8 
1fa0: 62 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65  bytes of storage
1fb0: 20 6f 6e 20 65 76 65 72 79 20 50 67 48 64 72 0a   on every PgHdr.
1fc0: 2a 2a 20 65 76 65 6e 20 66 6f 72 20 64 69 73 6b  ** even for disk
1fd0: 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65 73  -based databases
1fe0: 2e 20 20 53 70 6c 69 74 74 69 6e 67 20 69 74 20  .  Splitting it 
1ff0: 6f 75 74 20 73 61 76 65 73 20 38 20 62 79 74 65  out saves 8 byte
2000: 73 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f  s.  This.** is o
2010: 6e 6c 79 20 61 20 73 61 76 69 6e 67 73 20 6f 66  nly a savings of
2020: 20 30 2e 38 25 20 62 75 74 20 74 68 6f 73 65 20   0.8% but those 
2030: 70 65 72 63 65 6e 74 61 67 65 73 20 61 64 64 20  percentages add 
2040: 75 70 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  up..*/.typedef s
2050: 74 72 75 63 74 20 50 67 48 69 73 74 6f 72 79 20  truct PgHistory 
2060: 50 67 48 69 73 74 6f 72 79 3b 0a 73 74 72 75 63  PgHistory;.struc
2070: 74 20 50 67 48 69 73 74 6f 72 79 20 7b 0a 20 20  t PgHistory {.  
2080: 75 38 20 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f  u8 *pOrig;     /
2090: 2a 20 4f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  * Original page 
20a0: 74 65 78 74 2e 20 20 52 65 73 74 6f 72 65 20 74  text.  Restore t
20b0: 6f 20 74 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c  o this on a full
20c0: 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75   rollback */.  u
20d0: 38 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a  8 *pStmt;     /*
20e0: 20 54 65 78 74 20 61 73 20 69 74 20 77 61 73 20   Text as it was 
20f0: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
2100: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
2110: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 50  statement */.  P
2120: 67 48 64 72 20 2a 70 4e 65 78 74 53 74 6d 74 2c  gHdr *pNextStmt,
2130: 20 2a 70 50 72 65 76 53 74 6d 74 3b 20 20 2f 2a   *pPrevStmt;  /*
2140: 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69   List of pages i
2150: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
2160: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20  journal */.  u8 
2170: 69 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20  inStmt;         
2180: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2190: 52 55 45 20 69 66 20 69 6e 20 74 68 65 20 73 74  RUE if in the st
21a0: 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e  atement subjourn
21b0: 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  al */.};../*.** 
21c0: 41 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72  A macro used for
21d0: 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f   invoking the co
21e0: 64 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20  dec if there is 
21f0: 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  one.*/.#ifdef SQ
2200: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23  LITE_HAS_CODEC.#
2210: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50   define CODEC1(P
2220: 2c 44 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78  ,D,N,X) if( P->x
2230: 43 6f 64 65 63 21 3d 30 20 29 7b 20 50 2d 3e 78  Codec!=0 ){ P->x
2240: 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41  Codec(P->pCodecA
2250: 72 67 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64  rg,D,N,X); }.# d
2260: 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44  efine CODEC2(P,D
2270: 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 28 50  ,N,X) ((char*)(P
2280: 2d 3e 78 43 6f 64 65 63 21 3d 30 3f 50 2d 3e 78  ->xCodec!=0?P->x
2290: 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41  Codec(P->pCodecA
22a0: 72 67 2c 44 2c 4e 2c 58 29 3a 44 29 29 0a 23 65  rg,D,N,X):D)).#e
22b0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  lse.# define COD
22c0: 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20  EC1(P,D,N,X) /* 
22d0: 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e  NO-OP */.# defin
22e0: 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58  e CODEC2(P,D,N,X
22f0: 29 20 28 28 63 68 61 72 2a 29 44 29 0a 23 65 6e  ) ((char*)D).#en
2300: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  dif../*.** Conve
2310: 72 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rt a pointer to 
2320: 61 20 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70  a PgHdr into a p
2330: 6f 69 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61  ointer to its da
2340: 74 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61  ta.** and back a
2350: 67 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  gain..*/.#define
2360: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50   PGHDR_TO_DATA(P
2370: 29 20 20 28 28 76 6f 69 64 2a 29 28 26 28 50 29  )  ((void*)(&(P)
2380: 5b 31 5d 29 29 0a 23 64 65 66 69 6e 65 20 44 41  [1])).#define DA
2390: 54 41 5f 54 4f 5f 50 47 48 44 52 28 44 29 20 20  TA_TO_PGHDR(D)  
23a0: 28 26 28 28 50 67 48 64 72 2a 29 28 44 29 29 5b  (&((PgHdr*)(D))[
23b0: 2d 31 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48  -1]).#define PGH
23c0: 44 52 5f 54 4f 5f 45 58 54 52 41 28 47 2c 50 29  DR_TO_EXTRA(G,P)
23d0: 20 28 28 76 6f 69 64 2a 29 26 28 28 63 68 61 72   ((void*)&((char
23e0: 2a 29 28 26 28 47 29 5b 31 5d 29 29 5b 28 50 29  *)(&(G)[1]))[(P)
23f0: 2d 3e 70 61 67 65 53 69 7a 65 5d 29 0a 23 64 65  ->pageSize]).#de
2400: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 48 49  fine PGHDR_TO_HI
2410: 53 54 28 50 2c 50 47 52 29 20 20 5c 0a 20 20 20  ST(P,PGR)  \.   
2420: 20 20 20 20 20 20 20 20 20 28 28 50 67 48 69 73           ((PgHis
2430: 74 6f 72 79 2a 29 26 28 28 63 68 61 72 2a 29 28  tory*)&((char*)(
2440: 26 28 50 29 5b 31 5d 29 29 5b 28 50 47 52 29 2d  &(P)[1]))[(PGR)-
2450: 3e 70 61 67 65 53 69 7a 65 2b 28 50 47 52 29 2d  >pageSize+(PGR)-
2460: 3e 6e 45 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a  >nExtra])../*.**
2470: 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63   A open page cac
2480: 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  he is an instanc
2490: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
24a0: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ng structure..**
24b0: 0a 2a 2a 20 50 61 67 65 72 2e 65 72 72 43 6f 64  .** Pager.errCod
24c0: 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  e may be set to 
24d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
24e0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72  LITE_CORRUPT, or
24f0: 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  .** or SQLITE_FU
2500: 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f 66 20  LL. Once one of 
2510: 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20  the first three 
2520: 65 72 72 6f 72 73 20 6f 63 63 75 72 73 2c 20 69  errors occurs, i
2530: 74 20 70 65 72 73 69 73 74 73 0a 2a 2a 20 61 6e  t persists.** an
2540: 64 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 73  d is returned as
2550: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 65   the result of e
2560: 76 65 72 79 20 6d 61 6a 6f 72 20 70 61 67 65 72  very major pager
2570: 20 41 50 49 20 63 61 6c 6c 2e 20 20 54 68 65 0a   API call.  The.
2580: 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 72  ** SQLITE_FULL r
2590: 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 6c  eturn code is sl
25a0: 69 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74  ightly different
25b0: 2e 20 49 74 20 70 65 72 73 69 73 74 73 20 6f 6e  . It persists on
25c0: 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20  ly until the.** 
25d0: 6e 65 78 74 20 73 75 63 63 65 73 73 66 75 6c 20  next successful 
25e0: 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70 65 72 66  rollback is perf
25f0: 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 70 61 67  ormed on the pag
2600: 65 72 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 0a  er cache. Also,.
2610: 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64  ** SQLITE_FULL d
2620: 6f 65 73 20 6e 6f 74 20 61 66 66 65 63 74 20 74  oes not affect t
2630: 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  he sqlite3PagerG
2640: 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  et() and sqlite3
2650: 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a  PagerLookup().**
2660: 20 41 50 49 73 2c 20 74 68 65 79 20 6d 61 79 20   APIs, they may 
2670: 73 74 69 6c 6c 20 62 65 20 75 73 65 64 20 73 75  still be used su
2680: 63 63 65 73 73 66 75 6c 6c 79 2e 0a 2a 2f 0a 73  ccessfully..*/.s
2690: 74 72 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20  truct Pager {.  
26a0: 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20  u8 journalOpen; 
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 6a 6f 75 72 6e 61 6c 20 66  rue if journal f
26d0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
26e0: 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 75 38  is valid */.  u8
26f0: 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 3b   journalStarted;
2700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2710: 65 20 69 66 20 68 65 61 64 65 72 20 6f 66 20 6a  e if header of j
2720: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
2730: 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75 72   */.  u8 useJour
2740: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
2750: 20 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62    /* Use a rollb
2760: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74  ack journal on t
2770: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  his file */.  u8
2780: 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20   noReadlock;    
2790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
27a0: 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f 20 6f 62  not bother to ob
27b0: 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a  tain readlocks *
27c0: 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70 65 6e 3b  /.  u8 stmtOpen;
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73  /* True if the s
27f0: 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72  tatement subjour
2800: 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a 2f 0a 20  nal is open */. 
2810: 20 75 38 20 73 74 6d 74 49 6e 55 73 65 3b 20 20   u8 stmtInUse;  
2820: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2830: 54 72 75 65 20 77 65 20 61 72 65 20 69 6e 20 61  True we are in a
2840: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   statement subtr
2850: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 75  ansaction */.  u
2860: 38 20 73 74 6d 74 41 75 74 6f 6f 70 65 6e 3b 20  8 stmtAutoopen; 
2870: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
2880: 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e 61 6c 20  en stmt journal 
2890: 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61  when main journa
28a0: 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f 0a 20 20  l is opened*/.  
28b0: 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20  u8 noSync;      
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
28d0: 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a  o not sync the j
28e0: 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a  ournal if true *
28f0: 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b  /.  u8 fullSync;
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2910: 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63  /* Do extra sync
2920: 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
2930: 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20   for robustness 
2940: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 5f 66 73 79  */.  u8 full_fsy
2950: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
2960: 20 2f 2a 20 55 73 65 20 46 5f 46 55 4c 4c 46 53   /* Use F_FULLFS
2970: 59 4e 43 20 77 68 65 6e 20 61 76 61 69 6c 61 62  YNC when availab
2980: 6c 65 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65  le */.  u8 state
2990: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29a0: 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c      /* PAGER_UNL
29b0: 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52  OCK, _SHARED, _R
29c0: 45 53 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f  ESERVED, etc. */
29d0: 0a 20 20 75 38 20 74 65 6d 70 46 69 6c 65 3b 20  .  u8 tempFile; 
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29f0: 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 61  * zFilename is a
2a00: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
2a10: 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c 79  */.  u8 readOnly
2a20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a30: 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72   /* True for a r
2a40: 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73  ead-only databas
2a50: 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79  e */.  u8 needSy
2a60: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
2a70: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e     /* True if an
2a80: 20 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64   fsync() is need
2a90: 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed on the journa
2aa0: 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 43  l */.  u8 dirtyC
2ab0: 61 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20  ache;           
2ac0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61     /* True if ca
2ad0: 63 68 65 64 20 70 61 67 65 73 20 68 61 76 65 20  ched pages have 
2ae0: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 38 20  changed */.  u8 
2af0: 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20  alwaysRollback; 
2b00: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61           /* Disa
2b10: 62 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  ble DontRollback
2b20: 28 29 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73  () for all pages
2b30: 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20   */.  u8 memDb; 
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b50: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68    /* True to inh
2b60: 69 62 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f  ibit all file I/
2b70: 4f 20 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73  O */.  u8 setMas
2b80: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
2b90: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
2ba0: 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65  m-j name has bee
2bb0: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e  n written to jrn
2bc0: 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53  l */.  u8 doNotS
2bd0: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
2be0: 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 57     /* Boolean. W
2bf0: 68 69 6c 65 20 74 72 75 65 2c 20 64 6f 20 6e 6f  hile true, do no
2c00: 74 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68  t spill the cach
2c10: 65 20 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75 73  e */.  u8 exclus
2c20: 69 76 65 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  iveMode;        
2c30: 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54     /* Boolean. T
2c40: 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d  rue if locking_m
2c50: 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a  ode==EXCLUSIVE *
2c60: 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f 75  /.  u8 changeCou
2c70: 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 20  ntDone;         
2c80: 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e 63  /* Set after inc
2c90: 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 68  rementing the ch
2ca0: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a  ange-counter */.
2cb0: 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20    int errCode;  
2cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2cd0: 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20   One of several 
2ce0: 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20  kinds of errors 
2cf0: 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 3b  */.  int dbSize;
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d10: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2d20: 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ges in the file 
2d30: 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44 62 53  */.  int origDbS
2d40: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
2d50: 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72   /* dbSize befor
2d60: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68  e the current ch
2d70: 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 74  ange */.  int st
2d80: 6d 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  mtSize;         
2d90: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2da0: 20 64 61 74 61 62 61 73 65 20 28 69 6e 20 70 61   database (in pa
2db0: 67 65 73 29 20 61 74 20 73 74 6d 74 5f 62 65 67  ges) at stmt_beg
2dc0: 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  in() */.  int nR
2dd0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
2de0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2df0: 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  of pages written
2e00: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
2e10: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e  */.  u32 cksumIn
2e20: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
2e30: 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d   /* Quasi-random
2e40: 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20   value added to 
2e50: 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a  every checksum *
2e60: 2f 0a 20 20 69 6e 74 20 73 74 6d 74 4e 52 65 63  /.  int stmtNRec
2e70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e80: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  /* Number of rec
2e90: 6f 72 64 73 20 69 6e 20 73 74 6d 74 20 73 75 62  ords in stmt sub
2ea0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
2eb0: 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20 20   nExtra;        
2ec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
2ed0: 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
2ee0: 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
2ef0: 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  y page */.  int 
2f00: 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20  pageSize;       
2f10: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2f20: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20  r of bytes in a 
2f30: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  page */.  int nP
2f40: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2f50: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
2f60: 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
2f70: 72 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  ry pages */.  in
2f80: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
2f90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2fa0: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
2fb0: 20 70 61 67 65 73 20 77 69 74 68 20 50 67 48 64   pages with PgHd
2fc0: 72 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e  r.nRef>0 */.  in
2fd0: 74 20 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20  t mxPage;       
2fe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
2ff0: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70  imum number of p
3000: 61 67 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20  ages to hold in 
3010: 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  cache */.  Pgno 
3020: 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  mxPgno;         
3030: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
3040: 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f  m allowed size o
3050: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  f the database *
3060: 2f 0a 20 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e  /.  u8 *aInJourn
3070: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
3080: 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65  /* One bit for e
3090: 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20  ach page in the 
30a0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
30b0: 0a 20 20 75 38 20 2a 61 49 6e 53 74 6d 74 3b 20  .  u8 *aInStmt; 
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30d0: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
30e0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
30f0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61  atabase */.  cha
3100: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20  r *zFilename;   
3110: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
3120: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
3130: 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
3140: 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  *zJournal;      
3150: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
3160: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
3170: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44  le */.  char *zD
3180: 69 72 65 63 74 6f 72 79 3b 20 20 20 20 20 20 20  irectory;       
3190: 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79      /* Directory
31a0: 20 68 6f 6c 64 20 64 61 74 61 62 61 73 65 20 61   hold database a
31b0: 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nd journal files
31c0: 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 66 64   */.  OsFile *fd
31d0: 2c 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20  , *jfd;         
31e0: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
31f0: 70 74 6f 72 73 20 66 6f 72 20 64 61 74 61 62 61  ptors for databa
3200: 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a  se and journal *
3210: 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 73 74 66 64  /.  OsFile *stfd
3220: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3230: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
3240: 6f 72 20 66 6f 72 20 74 68 65 20 73 74 61 74 65  or for the state
3250: 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a  ment subjournal*
3260: 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 72 20  /.  BusyHandler 
3270: 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 20 20  *pBusyHandler;  
3280: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
3290: 6c 69 74 65 2e 62 75 73 79 48 61 6e 64 6c 65 72  lite.busyHandler
32a0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69   */.  PgHdr *pFi
32b0: 72 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20  rst, *pLast;    
32c0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65    /* List of fre
32d0: 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48  e pages */.  PgH
32e0: 64 72 20 2a 70 46 69 72 73 74 53 79 6e 63 65 64  dr *pFirstSynced
32f0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ;        /* Firs
3300: 74 20 66 72 65 65 20 70 61 67 65 20 77 69 74 68  t free page with
3310: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d   PgHdr.needSync=
3320: 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  =0 */.  PgHdr *p
3330: 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  All;            
3340: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61      /* List of a
3350: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67  ll pages */.  Pg
3360: 48 64 72 20 2a 70 53 74 6d 74 3b 20 20 20 20 20  Hdr *pStmt;     
3370: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
3380: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
3390: 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a  e statement subj
33a0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64  ournal */.  PgHd
33b0: 72 20 2a 70 44 69 72 74 79 3b 20 20 20 20 20 20  r *pDirty;      
33c0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
33d0: 6f 66 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  of all dirty pag
33e0: 65 73 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  es */.  i64 jour
33f0: 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20  nalOff;         
3400: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62      /* Current b
3410: 79 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68  yte offset in th
3420: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
3430: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48  /.  i64 journalH
3440: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
3450: 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 74  /* Byte offset t
3460: 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e  o previous journ
3470: 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  al header */.  i
3480: 36 34 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20  64 stmtHdrOff;  
3490: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
34a0: 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
34b0: 65 72 20 77 72 69 74 74 65 6e 20 74 68 69 73 20  er written this 
34c0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
34d0: 36 34 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20  64 stmtCksum;   
34e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b             /* ck
34f0: 73 75 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61  sumInit when sta
3500: 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74  tement was start
3510: 65 64 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74  ed */.  i64 stmt
3520: 4a 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  JSize;          
3530: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a      /* Size of j
3540: 6f 75 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62  ournal at stmt_b
3550: 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  egin() */.  int 
3560: 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20  sectorSize;     
3570: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d          /* Assum
3580: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64  ed sector size d
3590: 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a  uring rollback *
35a0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
35b0: 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c  TEST.  int nHit,
35c0: 20 6e 4d 69 73 73 3b 20 20 20 20 20 20 20 20 20   nMiss;         
35d0: 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73     /* Cache hits
35e0: 20 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a   and missing */.
35f0: 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72    int nRead, nWr
3600: 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ite;          /*
3610: 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20   Database pages 
3620: 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a  read/written */.
3630: 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a  #endif.  void (*
3640: 78 44 65 73 74 72 75 63 74 6f 72 29 28 44 62 50  xDestructor)(DbP
3650: 61 67 65 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61  age*,int); /* Ca
3660: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
3670: 77 68 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67  when freeing pag
3680: 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  es */.  void (*x
3690: 52 65 69 6e 69 74 65 72 29 28 44 62 50 61 67 65  Reiniter)(DbPage
36a0: 2a 2c 69 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c  *,int);   /* Cal
36b0: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
36c0: 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61  hen reloading pa
36d0: 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ges */.#ifdef SQ
36e0: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
36f0: 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29   void *(*xCodec)
3700: 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
3710: 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69  o,int); /* Routi
3720: 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69  ne for en/decodi
3730: 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ng data */.  voi
3740: 64 20 2a 70 43 6f 64 65 63 41 72 67 3b 20 20 20  d *pCodecArg;   
3750: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
3760: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43  t argument to xC
3770: 6f 64 65 63 28 29 20 2a 2f 0a 23 65 6e 64 69 66  odec() */.#endif
3780: 0a 20 20 69 6e 74 20 6e 48 61 73 68 3b 20 20 20  .  int nHash;   
3790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37a0: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61  * Size of the pa
37b0: 67 65 72 20 68 61 73 68 20 74 61 62 6c 65 20 2a  ger hash table *
37c0: 2f 0a 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73  /.  PgHdr **aHas
37d0: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
37e0: 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 74 6f  /* Hash table to
37f0: 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72   map page number
3800: 20 74 6f 20 50 67 48 64 72 20 2a 2f 0a 23 69 66   to PgHdr */.#if
3810: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
3820: 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
3830: 45 4e 54 0a 20 20 50 61 67 65 72 20 2a 70 4e 65  ENT.  Pager *pNe
3840: 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  xt;             
3850: 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74    /* Linked list
3860: 20 6f 66 20 70 61 67 65 72 73 20 69 6e 20 74 68   of pagers in th
3870: 69 73 20 74 68 72 65 61 64 20 2a 2f 0a 23 65 6e  is thread */.#en
3880: 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70  dif.  char *pTmp
3890: 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
38a0: 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53    /* Pager.pageS
38b0: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  ize bytes of spa
38c0: 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a  ce for tmp use *
38d0: 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65 56  /.  char dbFileV
38e0: 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20 20  ers[16];        
38f0: 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65  /* Changes whene
3900: 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  ver database fil
3910: 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 7d 3b 0a  e changes */.};.
3920: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
3930: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
3940: 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74  ables hold count
3950: 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20  ers used for.** 
3960: 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
3970: 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20 76 61   only.  These va
3980: 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65  riables do not e
3990: 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e  xist in.** a non
39a0: 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64 2e 20  -testing build. 
39b0: 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73   These variables
39c0: 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61 64 2d   are not thread-
39d0: 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  safe..*/.#ifdef 
39e0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
39f0: 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
3a00: 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20  addb_count = 0; 
3a10: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3a20: 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20  full pages read 
3a30: 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73  from DB */.int s
3a40: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
3a50: 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20  tedb_count = 0; 
3a60: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
3a70: 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74 74 65  ull pages writte
3a80: 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73  n to DB */.int s
3a90: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
3aa0: 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  tej_count = 0;  
3ab0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
3ac0: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
3ad0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 69 6e 74 20 73  journal */.int s
3ae0: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66  qlite3_pager_pgf
3af0: 72 65 65 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  ree_count = 0;  
3b00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
3b10: 61 63 68 65 20 70 61 67 65 73 20 66 72 65 65 64  ache pages freed
3b20: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47   */.# define PAG
3b30: 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a  ER_INCR(v)  v++.
3b40: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50  #else.# define P
3b50: 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e  AGER_INCR(v).#en
3b60: 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75  dif..../*.** Jou
3b70: 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e  rnal files begin
3b80: 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
3b90: 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67  ing magic string
3ba0: 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77  .  The data.** w
3bb0: 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
3bc0: 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49   /dev/random.  I
3bd0: 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61  t is used only a
3be0: 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b  s a sanity check
3bf0: 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65  ..**.** Since ve
3c00: 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65  rsion 2.8.0, the
3c10: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
3c20: 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f  contains additio
3c30: 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68  nal sanity.** ch
3c40: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
3c50: 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65  on.  If the powe
3c60: 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68  r fails while th
3c70: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 67  e journal is beg
3c80: 69 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73  in.** written, s
3c90: 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61  emi-random garba
3ca0: 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70  ge data might ap
3cb0: 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72  pear in the jour
3cc0: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65  nal.** file afte
3cd0: 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f  r power is resto
3ce0: 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65  red.  If an atte
3cf0: 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65  mpt is then made
3d00: 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20  .** to roll the 
3d10: 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68  journal back, th
3d20: 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64  e database could
3d30: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20   be corrupted.  
3d40: 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a  The additional.*
3d50: 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * sanity checkin
3d60: 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74  g data is an att
3d70: 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72  empt to discover
3d80: 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20   the garbage in 
3d90: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  the.** journal a
3da0: 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a  nd ignore it..**
3db0: 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63  .** The sanity c
3dc0: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
3dd0: 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ion for the new 
3de0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
3df0: 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20  onsists.** of a 
3e00: 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20  32-bit checksum 
3e10: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20  on each page of 
3e20: 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b  data.  The check
3e30: 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a  sum covers both.
3e40: 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ** the page numb
3e50: 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65  er and the pPage
3e60: 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
3e70: 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68  s of data for th
3e80: 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20  e page..** This 
3e90: 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c  cksum is initial
3ea0: 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74  ized to a 32-bit
3eb0: 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68   random value th
3ec0: 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68  at appears in th
3ed0: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
3ee0: 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68  e right after th
3ef0: 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72  e header.  The r
3f00: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65  andom initialize
3f10: 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a  r is important,.
3f20: 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61  ** because garba
3f30: 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70  ge data that app
3f40: 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20  ears at the end 
3f50: 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20  of a journal is 
3f60: 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74  likely.** data t
3f70: 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20  hat was once in 
3f80: 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74  other files that
3f90: 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64   have now been d
3fa0: 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a  eleted.  If the.
3fb0: 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20  ** garbage data 
3fc0: 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73  came from an obs
3fd0: 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69  olete journal fi
3fe0: 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  le, the checksum
3ff0: 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f  s might.** be co
4000: 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69  rrect.  But by i
4010: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
4020: 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64  checksum to rand
4030: 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a  om value which.*
4040: 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  * is different f
4050: 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c  or every journal
4060: 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68  , we minimize th
4070: 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74  at risk..*/.stat
4080: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
4090: 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d  d char aJournalM
40a0: 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64  agic[] = {.  0xd
40b0: 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30  9, 0xd5, 0x05, 0
40c0: 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c  xf9, 0x20, 0xa1,
40d0: 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a   0x63, 0xd7,.};.
40e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20  ./*.** The size 
40f0: 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 61 6e  of the header an
4100: 64 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 69  d of each page i
4110: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
4120: 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62   determined.** b
4130: 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
4140: 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69  macros..*/.#defi
4150: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ne JOURNAL_PG_SZ
4160: 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67  (pPager)  ((pPag
4170: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20  er->pageSize) + 
4180: 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  8)../*.** The jo
4190: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a  urnal header siz
41a0: 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
41b0: 2e 20 49 6e 20 74 68 65 20 66 75 74 75 72 65 2c  . In the future,
41c0: 20 74 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a   this could be.*
41d0: 2a 20 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61  * set to some va
41e0: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
41f0: 65 20 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65  e disk controlle
4200: 72 2e 20 54 68 65 20 69 6d 70 6f 72 74 61 6e 74  r. The important
4210: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 69 73 74  .** characterist
4220: 69 63 20 69 73 20 74 68 61 74 20 69 74 20 69 73  ic is that it is
4230: 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61   the same size a
4240: 73 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  s a disk sector.
4250: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
4260: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
4270: 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74  r) (pPager->sect
4280: 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54  orSize)../*.** T
4290: 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69  he macro MEMDB i
42a0: 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65  s true if we are
42b0: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e   dealing with an
42c0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
42d0: 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68  ase..** We do th
42e0: 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f  is as a macro so
42f0: 20 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c   that if the SQL
4300: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
4310: 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a  B macro is set,.
4320: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
4330: 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20  MEMDB will be a 
4340: 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65  constant and the
4350: 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f   compiler will o
4360: 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63  ptimize.** out c
4370: 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e  ode that would n
4380: 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f  ever execute..*/
4390: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
43a0: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64  MIT_MEMORYDB.# d
43b0: 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65  efine MEMDB 0.#e
43c0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  lse.# define MEM
43d0: 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  DB pPager->memDb
43e0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50  .#endif../*.** P
43f0: 61 67 65 20 6e 75 6d 62 65 72 20 50 41 47 45 52  age number PAGER
4400: 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65  _MJ_PGNO is neve
4410: 72 20 75 73 65 64 20 69 6e 20 61 6e 20 53 51 4c  r used in an SQL
4420: 69 74 65 20 64 61 74 61 62 61 73 65 20 28 69 74  ite database (it
4430: 20 69 73 0a 2a 2a 20 72 65 73 65 72 76 65 64 20   is.** reserved 
4440: 66 6f 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75  for working arou
4450: 6e 64 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73  nd a windows/pos
4460: 69 78 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69  ix incompatibili
4470: 74 79 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73  ty). It is.** us
4480: 65 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed in the journa
4490: 6c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 61  l to signify tha
44a0: 74 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20  t the remainder 
44b0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
44c0: 69 6c 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74  ile .** is devot
44d0: 65 64 20 74 6f 20 73 74 6f 72 69 6e 67 20 61 20  ed to storing a 
44e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
44f0: 61 6d 65 20 2d 20 74 68 65 72 65 20 61 72 65 20  ame - there are 
4500: 6e 6f 20 6d 6f 72 65 20 70 61 67 65 73 20 74 6f  no more pages to
4510: 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53  .** roll back. S
4520: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20  ee comments for 
4530: 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d 61  function writeMa
4540: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f  sterJournal() fo
4550: 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a  r details..*/./*
4560: 20 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d   #define PAGER_M
4570: 4a 5f 50 47 4e 4f 28 78 29 20 28 50 45 4e 44 49  J_PGNO(x) (PENDI
4580: 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61  NG_BYTE/((x)->pa
4590: 67 65 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66  geSize)) */.#def
45a0: 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ine PAGER_MJ_PGN
45b0: 4f 28 78 29 20 28 28 50 45 4e 44 49 4e 47 5f 42  O(x) ((PENDING_B
45c0: 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69  YTE/((x)->pageSi
45d0: 7a 65 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54  ze))+1)../*.** T
45e0: 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c  he maximum legal
45f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
4600: 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23  (2^31 - 1)..*/.#
4610: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58  define PAGER_MAX
4620: 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37  _PGNO 2147483647
4630: 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 72  ../*.** Enable r
4640: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 74  eference count t
4650: 72 61 63 6b 69 6e 67 20 28 66 6f 72 20 64 65 62  racking (for deb
4660: 75 67 67 69 6e 67 29 20 68 65 72 65 3a 0a 2a 2f  ugging) here:.*/
4670: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
4680: 45 42 55 47 0a 20 20 69 6e 74 20 70 61 67 65 72  EBUG.  int pager
4690: 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65  3_refinfo_enable
46a0: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 76   = 0;.  static v
46b0: 6f 69 64 20 70 61 67 65 72 5f 72 65 66 69 6e 66  oid pager_refinf
46c0: 6f 28 50 67 48 64 72 20 2a 70 29 7b 0a 20 20 20  o(PgHdr *p){.   
46d0: 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74 20   static int cnt 
46e0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 70 61  = 0;.    if( !pa
46f0: 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61  ger3_refinfo_ena
4700: 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ble ) return;.  
4710: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
4720: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22 52 45  intf(.       "RE
4730: 46 43 4e 54 3a 20 25 34 64 20 61 64 64 72 3d 25  FCNT: %4d addr=%
4740: 70 20 6e 52 65 66 3d 25 2d 33 64 20 74 6f 74 61  p nRef=%-3d tota
4750: 6c 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  l=%d\n",.       
4760: 70 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54  p->pgno, PGHDR_T
4770: 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52  O_DATA(p), p->nR
4780: 65 66 2c 20 70 2d 3e 70 50 61 67 65 72 2d 3e 6e  ef, p->pPager->n
4790: 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 63  Ref.    );.    c
47a0: 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65 74  nt++;   /* Somet
47b0: 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20 62 72  hing to set a br
47c0: 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20  eakpoint on */. 
47d0: 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49   }.# define REFI
47e0: 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f 72 65  NFO(X)  pager_re
47f0: 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a 23  finfo(X).#else.#
4800: 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28   define REFINFO(
4810: 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
4820: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
4830: 70 61 67 65 20 2a 70 50 67 20 68 61 73 20 61 6c  page *pPg has al
4840: 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
4850: 65 6e 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d  en to the statem
4860: 65 6e 74 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  ent.** journal (
4870: 6f 72 20 73 74 61 74 65 6d 65 6e 74 20 73 6e 61  or statement sna
4880: 70 73 68 6f 74 20 68 61 73 20 62 65 65 6e 20 63  pshot has been c
4890: 72 65 61 74 65 64 2c 20 69 66 20 2a 70 50 67 20  reated, if *pPg 
48a0: 69 73 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 6e  is part.** of an
48b0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
48c0: 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ase)..*/.static 
48d0: 69 6e 74 20 70 61 67 65 49 6e 53 74 61 74 65 6d  int pageInStatem
48e0: 65 6e 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ent(PgHdr *pPg){
48f0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
4900: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
4910: 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
4920: 20 20 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f     return PGHDR_
4930: 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
4940: 67 65 72 29 2d 3e 69 6e 53 74 6d 74 3b 0a 20 20  ger)->inStmt;.  
4950: 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
4960: 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  pgno = pPg->pgno
4970: 3b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70 50  ;.    u8 *a = pP
4980: 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3b 0a 20  ager->aInStmt;. 
4990: 20 20 20 72 65 74 75 72 6e 20 28 61 20 26 26 20     return (a && 
49a0: 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65  (int)pgno<=pPage
49b0: 72 2d 3e 73 74 6d 74 53 69 7a 65 20 26 26 20 28  r->stmtSize && (
49c0: 61 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c  a[pgno/8] & (1<<
49d0: 28 70 67 6e 6f 26 37 29 29 29 29 3b 0a 20 20 7d  (pgno&7))));.  }
49e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
49f0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
4a00: 20 70 61 67 65 72 20 68 61 73 68 20 74 61 62 6c   pager hash tabl
4a10: 65 20 74 6f 20 4e 2e 20 20 4e 20 6d 75 73 74 20  e to N.  N must 
4a20: 62 65 20 61 20 70 6f 77 65 72 0a 2a 2a 20 6f 66  be a power.** of
4a30: 20 74 77 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   two..*/.static 
4a40: 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 69 7a  void pager_resiz
4a50: 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 50 61 67  e_hash_table(Pag
4a60: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
4a70: 4e 29 7b 0a 20 20 50 67 48 64 72 20 2a 2a 61 48  N){.  PgHdr **aH
4a80: 61 73 68 2c 20 2a 70 50 67 3b 0a 20 20 61 73 73  ash, *pPg;.  ass
4a90: 65 72 74 28 20 4e 3e 30 20 26 26 20 28 4e 26 28  ert( N>0 && (N&(
4aa0: 4e 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 61 48  N-1))==0 );.  aH
4ab0: 61 73 68 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ash = sqliteMall
4ac0: 6f 63 28 20 73 69 7a 65 6f 66 28 61 48 61 73 68  oc( sizeof(aHash
4ad0: 5b 30 5d 29 2a 4e 20 29 3b 0a 20 20 69 66 28 20  [0])*N );.  if( 
4ae0: 61 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20  aHash==0 ){.    
4af0: 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 72 65  /* Failure to re
4b00: 68 61 73 68 20 69 73 20 6e 6f 74 20 61 6e 20 65  hash is not an e
4b10: 72 72 6f 72 2e 20 20 49 74 20 69 73 20 6f 6e 6c  rror.  It is onl
4b20: 79 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  y a performance 
4b30: 68 69 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  hit. */.    retu
4b40: 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
4b50: 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61  Free(pPager->aHa
4b60: 73 68 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  sh);.  pPager->n
4b70: 48 61 73 68 20 3d 20 4e 3b 0a 20 20 70 50 61 67  Hash = N;.  pPag
4b80: 65 72 2d 3e 61 48 61 73 68 20 3d 20 61 48 61 73  er->aHash = aHas
4b90: 68 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  h;.  for(pPg=pPa
4ba0: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
4bb0: 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
4bc0: 6c 29 7b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20  l){.    int h;. 
4bd0: 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
4be0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
4bf0: 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48  ert( pPg->pNextH
4c00: 61 73 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70  ash==0 && pPg->p
4c10: 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20  PrevHash==0 );. 
4c20: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
4c30: 20 20 20 7d 0a 20 20 20 20 68 20 3d 20 70 50 67     }.    h = pPg
4c40: 2d 3e 70 67 6e 6f 20 26 20 28 4e 2d 31 29 3b 0a  ->pgno & (N-1);.
4c50: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
4c60: 73 68 20 3d 20 61 48 61 73 68 5b 68 5d 3b 0a 20  sh = aHash[h];. 
4c70: 20 20 20 69 66 28 20 61 48 61 73 68 5b 68 5d 20     if( aHash[h] 
4c80: 29 7b 0a 20 20 20 20 20 20 61 48 61 73 68 5b 68  ){.      aHash[h
4c90: 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  ]->pPrevHash = p
4ca0: 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 48  Pg;.    }.    aH
4cb0: 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20  ash[h] = pPg;.  
4cc0: 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68    pPg->pPrevHash
4cd0: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
4ce0: 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74  ** Read a 32-bit
4cf0: 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68   integer from th
4d00: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
4d10: 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20  criptor.  Store 
4d20: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74  the integer.** t
4d30: 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a  hat is read in *
4d40: 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  pRes.  Return SQ
4d50: 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
4d60: 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72  thing worked, or
4d70: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   an.** error cod
4d80: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
4d90: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
4da0: 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20   All values are 
4db0: 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61  stored on disk a
4dc0: 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f  s big-endian..*/
4dd0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
4de0: 33 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66  32bits(OsFile *f
4df0: 64 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20  d, u32 *pRes){. 
4e00: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
4e10: 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  c[4];.  int rc =
4e20: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
4e30: 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63  d, ac, sizeof(ac
4e40: 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ));.  if( rc==SQ
4e50: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
4e60: 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65  pRes = sqlite3Ge
4e70: 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a  t4byte(ac);.  }.
4e80: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4e90: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
4ea0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
4eb0: 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  o a string buffe
4ec0: 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20  r in big-endian 
4ed0: 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23  byte order..*/.#
4ee0: 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73  define put32bits
4ef0: 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75  (A,B)  sqlite3Pu
4f00: 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29  t4byte((u8*)A,B)
4f10: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
4f20: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
4f30: 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69  nto the given fi
4f40: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
4f50: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
4f60: 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  .** on success o
4f70: 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
4f80: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
4f90: 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
4fa0: 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69  ic int write32bi
4fb0: 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75  ts(OsFile *fd, u
4fc0: 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20  32 val){.  char 
4fd0: 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69  ac[4];.  put32bi
4fe0: 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72  ts(ac, val);.  r
4ff0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57  eturn sqlite3OsW
5000: 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 29 3b  rite(fd, ac, 4);
5010: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
5020: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
5030: 61 74 20 6f 66 66 73 65 74 20 27 6f 66 66 73 65  at offset 'offse
5040: 74 27 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  t' from the page
5050: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a   identified by.*
5060: 2a 20 70 61 67 65 20 68 65 61 64 65 72 20 27 70  * page header 'p
5070: 27 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  '..*/.static u32
5080: 20 72 65 74 72 69 65 76 65 33 32 62 69 74 73 28   retrieve32bits(
5090: 50 67 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66  PgHdr *p, int of
50a0: 66 73 65 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65  fset){.  unsigne
50b0: 64 20 63 68 61 72 20 2a 61 63 3b 0a 20 20 61 63  d char *ac;.  ac
50c0: 20 3d 20 26 28 28 75 6e 73 69 67 6e 65 64 20 63   = &((unsigned c
50d0: 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  har*)PGHDR_TO_DA
50e0: 54 41 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a  TA(p))[offset];.
50f0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
5100: 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 7d 0a  Get4byte(ac);.}.
5110: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
5120: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20  ction should be 
5130: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 65  called when an e
5140: 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68  rror occurs with
5150: 69 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  in the pager.** 
5160: 63 6f 64 65 2e 20 54 68 65 20 66 69 72 73 74 20  code. The first 
5170: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
5180: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
5190: 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 74 68  er structure, th
51a0: 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 74 68 65 20  e.** second the 
51b0: 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74  error-code about
51c0: 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
51d0: 62 79 20 61 20 70 61 67 65 72 20 41 50 49 20 66  by a pager API f
51e0: 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20 54 68 65  unction. .** The
51f0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
5200: 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
5210: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
5220: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
5230: 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  n. .**.** If the
5240: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
5250: 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   is SQLITE_IOERR
5260: 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  , SQLITE_CORRUPT
5270: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  , or SQLITE_FULL
5280: 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62 65  .** the error be
5290: 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e 74  comes persistent
52a0: 2e 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  . All subsequent
52b0: 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68   API calls on th
52c0: 69 73 20 50 61 67 65 72 0a 2a 2a 20 77 69 6c 6c  is Pager.** will
52d0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74   immediately ret
52e0: 75 72 6e 20 74 68 65 20 73 61 6d 65 20 65 72 72  urn the same err
52f0: 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
5300: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72  ic int pager_err
5310: 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
5320: 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74  , int rc){.  int
5330: 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66   rc2 = rc & 0xff
5340: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
5350: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
5360: 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 70 50 61 67  ITE_FULL || pPag
5370: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
5380: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 0a  ITE_OK );.  if(.
5390: 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f      rc2==SQLITE_
53a0: 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 72 63 32 3d  FULL ||.    rc2=
53b0: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c  =SQLITE_IOERR ||
53c0: 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45  .    rc2==SQLITE
53d0: 5f 43 4f 52 52 55 50 54 0a 20 20 29 7b 0a 20 20  _CORRUPT.  ){.  
53e0: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
53f0: 65 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65  e = rc;.  }.  re
5400: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
5410: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
5420: 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75  PAGES./*.** Retu
5430: 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68  rn a 32-bit hash
5440: 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
5450: 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a  a for pPage..*/.
5460: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
5470: 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20  _pagehash(PgHdr 
5480: 2a 70 50 61 67 65 29 7b 0a 20 20 75 33 32 20 68  *pPage){.  u32 h
5490: 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ash = 0;.  int i
54a0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
54b0: 72 20 2a 70 44 61 74 61 20 3d 20 28 75 6e 73 69  r *pData = (unsi
54c0: 67 6e 65 64 20 63 68 61 72 20 2a 29 50 47 48 44  gned char *)PGHD
54d0: 52 5f 54 4f 5f 44 41 54 41 28 70 50 61 67 65 29  R_TO_DATA(pPage)
54e0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
54f0: 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61  Page->pPager->pa
5500: 67 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20  geSize; i++){.  
5510: 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2b 69    hash = (hash+i
5520: 29 5e 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a  )^pData[i];.  }.
5530: 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d    return hash;.}
5540: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43  ../*.** The CHEC
5550: 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b  K_PAGE macro tak
5560: 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61  es a PgHdr* as a
5570: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53  n argument. If S
5580: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
5590: 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c  S.** is defined,
55a0: 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e   and NDEBUG is n
55b0: 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  ot defined, an a
55c0: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
55d0: 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74  t checks.** that
55e0: 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74   the page is eit
55f0: 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69  her dirty or sti
5600: 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63  ll matches the c
5610: 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68  alculated page-h
5620: 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ash..*/.#define 
5630: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68  CHECK_PAGE(x) ch
5640: 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69  eckPage(x).stati
5650: 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65  c void checkPage
5660: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
5670: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
5680: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61  pPg->pPager;.  a
5690: 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67  ssert( !pPg->pag
56a0: 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d  eHash || pPager-
56b0: 3e 65 72 72 43 6f 64 65 20 7c 7c 20 4d 45 4d 44  >errCode || MEMD
56c0: 42 20 7c 7c 20 70 50 67 2d 3e 64 69 72 74 79 20  B || pPg->dirty 
56d0: 7c 7c 20 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  || .      pPg->p
56e0: 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70  ageHash==pager_p
56f0: 61 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a  agehash(pPg) );.
5700: 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  }..#else.#define
5710: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23   CHECK_PAGE(x).#
5720: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  endif../*.** Whe
5730: 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
5740: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5750: 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67  e for pager pPag
5760: 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  er must be open.
5770: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
5780: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
5790: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
57a0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
57b0: 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65  e and .** writte
57c0: 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  n into memory ob
57d0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
57e0: 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 2a 70 7a 4d  teMalloc(). *pzM
57f0: 61 73 74 65 72 20 69 73 0a 2a 2a 20 73 65 74 20  aster is.** set 
5800: 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20  to point at the 
5810: 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54  memory and SQLIT
5820: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54  E_OK returned. T
5830: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a  he caller must.*
5840: 2a 20 73 71 6c 69 74 65 46 72 65 65 28 29 20 2a  * sqliteFree() *
5850: 70 7a 4d 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  pzMaster..**.** 
5860: 49 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  If no master jou
5870: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
5880: 73 20 70 72 65 73 65 6e 74 20 2a 70 7a 4d 61 73  s present *pzMas
5890: 74 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20  ter is set to 0 
58a0: 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  and.** SQLITE_OK
58b0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
58c0: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73  atic int readMas
58d0: 74 65 72 4a 6f 75 72 6e 61 6c 28 4f 73 46 69 6c  terJournal(OsFil
58e0: 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a  e *pJrnl, char *
58f0: 2a 70 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  *pzMaster){.  in
5900: 74 20 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b  t rc;.  u32 len;
5910: 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33  .  i64 szJ;.  u3
5920: 32 20 63 6b 73 75 6d 3b 0a 20 20 69 6e 74 20 69  2 cksum;.  int i
5930: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
5940: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20  r aMagic[8]; /* 
5950: 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64  A buffer to hold
5960: 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65   the magic heade
5970: 72 20 2a 2f 0a 0a 20 20 2a 70 7a 4d 61 73 74 65  r */..  *pzMaste
5980: 72 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73  r = 0;..  rc = s
5990: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
59a0: 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20  (pJrnl, &szJ);. 
59b0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
59c0: 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29 20 72  OK || szJ<16 ) r
59d0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
59e0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
59f0: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 29 3b 0a  pJrnl, szJ-16);.
5a00: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5a10: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
5a20: 0a 20 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  . .  rc = read32
5a30: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26 6c 65 6e  bits(pJrnl, &len
5a40: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
5a50: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
5a60: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
5a70: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26 63  32bits(pJrnl, &c
5a80: 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21  ksum);.  if( rc!
5a90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
5aa0: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
5ab0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a  sqlite3OsRead(pJ
5ac0: 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 29 3b  rnl, aMagic, 8);
5ad0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
5ae0: 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61  E_OK || memcmp(a
5af0: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
5b00: 61 67 69 63 2c 20 38 29 20 29 20 72 65 74 75 72  agic, 8) ) retur
5b10: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  n rc;..  rc = sq
5b20: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e  lite3OsSeek(pJrn
5b30: 6c 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a  l, szJ-16-len);.
5b40: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5b50: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
5b60: 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20  ..  *pzMaster = 
5b70: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61  (char *)sqliteMa
5b80: 6c 6c 6f 63 28 6c 65 6e 2b 31 29 3b 0a 20 20 69  lloc(len+1);.  i
5b90: 66 28 20 21 2a 70 7a 4d 61 73 74 65 72 20 29 7b  f( !*pzMaster ){
5ba0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5bb0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
5bc0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
5bd0: 61 64 28 70 4a 72 6e 6c 2c 20 2a 70 7a 4d 61 73  ad(pJrnl, *pzMas
5be0: 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28  ter, len);.  if(
5bf0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5c00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
5c10: 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  (*pzMaster);.   
5c20: 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a   *pzMaster = 0;.
5c30: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
5c40: 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20   }..  /* See if 
5c50: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74  the checksum mat
5c60: 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20  ches the master 
5c70: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
5c80: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e    for(i=0; i<len
5c90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; i++){.    cksu
5ca0: 6d 20 2d 3d 20 28 2a 70 7a 4d 61 73 74 65 72 29  m -= (*pzMaster)
5cb0: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  [i];.  }.  if( c
5cc0: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ksum ){.    /* I
5cd0: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64  f the checksum d
5ce0: 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74  oesn't add up, t
5cf0: 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  hen one or more 
5d00: 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74  of the disk sect
5d10: 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61  ors.    ** conta
5d20: 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  ining the master
5d30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
5d40: 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20  e is corrupted. 
5d50: 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a  This means.    *
5d60: 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c  * definitely rol
5d70: 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20  l back, so just 
5d80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5d90: 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e   and report a (n
5da0: 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  ul).    ** maste
5db0: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r-journal filena
5dc0: 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  me..    */.    s
5dd0: 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73  qliteFree(*pzMas
5de0: 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73  ter);.    *pzMas
5df0: 74 65 72 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ter = 0;.  }else
5e00: 7b 0a 20 20 20 20 28 2a 70 7a 4d 61 73 74 65 72  {.    (*pzMaster
5e10: 29 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20  )[len] = '\0';. 
5e20: 20 7d 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20   }.   .  return 
5e30: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
5e40: 0a 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a 6f 75  .** Seek the jou
5e50: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
5e60: 70 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  ptor to the next
5e70: 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
5e80: 20 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72   where a.** jour
5e90: 6e 61 6c 20 68 65 61 64 65 72 20 6d 61 79 20 62  nal header may b
5ea0: 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
5eb0: 6e 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  n. Pager.journal
5ec0: 4f 66 66 20 69 73 20 75 70 64 61 74 65 64 20 77  Off is updated w
5ed0: 69 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73  ith.** the new s
5ee0: 65 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a  eek offset..**.*
5ef0: 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74  * i.e for a sect
5f00: 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a  or size of 512:.
5f10: 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73  **.** Input Offs
5f20: 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  et              
5f30: 4f 75 74 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a  Output Offset.**
5f40: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
5f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f60: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20  --------.** 0   
5f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f80: 20 20 20 20 20 20 30 0a 2a 2a 20 35 31 32 20 20        0.** 512  
5f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fa0: 20 20 20 20 20 35 31 32 0a 2a 2a 20 31 30 30 20       512.** 100 
5fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fc0: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 32 30 30        512.** 200
5fd0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
5fe0: 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a         2048.** .
5ff0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
6000: 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67  ekJournalHdr(Pag
6010: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
6020: 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20  64 offset = 0;. 
6030: 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d   i64 c = pPager-
6040: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69  >journalOff;.  i
6050: 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73  f( c ){.    offs
6060: 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52  et = ((c-1)/JOUR
6070: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
6080: 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41  r) + 1) * JOURNA
6090: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
60a0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
60b0: 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48  offset%JOURNAL_H
60c0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30  DR_SZ(pPager)==0
60d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
60e0: 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73  fset>=c );.  ass
60f0: 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c  ert( (offset-c)<
6100: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
6110: 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50 61 67  Pager) );.  pPag
6120: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
6130: 20 6f 66 66 73 65 74 3b 0a 20 20 72 65 74 75 72   offset;.  retur
6140: 6e 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  n sqlite3OsSeek(
6150: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
6160: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
6170: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
6180: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
6190: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
61a0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
61b0: 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a  lled. A journal.
61c0: 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e  ** header (JOURN
61d0: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
61e0: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
61f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6200: 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72  e at the.** curr
6210: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  ent location..**
6220: 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66  .** The format f
6230: 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  or the journal h
6240: 65 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c  eader is as foll
6250: 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65  ows:.** - 8 byte
6260: 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66  s: Magic identif
6270: 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  ying journal for
6280: 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  mat..** - 4 byte
6290: 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  s: Number of rec
62a0: 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c  ords in journal,
62b0: 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d   or -1 no-sync m
62c0: 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20  ode is on..** - 
62d0: 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20  4 bytes: Random 
62e0: 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20  number used for 
62f0: 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20  page hash..** - 
6300: 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c  4 bytes: Initial
6310: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63   database page c
6320: 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  ount..** - 4 byt
6330: 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20  es: Sector size 
6340: 75 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63  used by the proc
6350: 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74  ess that wrote t
6360: 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  his journal..** 
6370: 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20  .** Followed by 
6380: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
6390: 2d 20 32 34 29 20 62 79 74 65 73 20 6f 66 20 75  - 24) bytes of u
63a0: 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a  nused space..*/.
63b0: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
63c0: 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72  JournalHdr(Pager
63d0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 63 68 61   *pPager){.  cha
63e0: 72 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  r zHeader[sizeof
63f0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
6400: 31 36 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  16];.  int rc;..
6410: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
6420: 6d 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20  mtHdrOff==0 ){. 
6430: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48     pPager->stmtH
6440: 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
6450: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 7d 0a  journalOff;.  }.
6460: 0a 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72  .  rc = seekJour
6470: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
6480: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
6490: 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d  n rc;..  pPager-
64a0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
64b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
64c0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
64d0: 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41  nalOff += JOURNA
64e0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
64f0: 3b 0a 0a 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20  ;..  /* FIX ME: 
6500: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 6f 73 73 69  .  **.  ** Possi
6510: 62 6c 79 20 66 6f 72 20 61 20 70 61 67 65 72 20  bly for a pager 
6520: 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  not in no-sync m
6530: 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ode, the journal
6540: 20 6d 61 67 69 63 20 73 68 6f 75 6c 64 20 6e 6f   magic should no
6550: 74 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65  t.  ** be writte
6560: 6e 20 75 6e 74 69 6c 20 6e 52 65 63 20 69 73 20  n until nRec is 
6570: 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 70 61 72  filled in as par
6580: 74 20 6f 66 20 6e 65 78 74 20 73 79 6e 63 4a 6f  t of next syncJo
6590: 75 72 6e 61 6c 28 29 2e 20 0a 20 20 2a 2a 0a 20  urnal(). .  **. 
65a0: 20 2a 2a 20 41 63 74 75 61 6c 6c 79 20 6d 61 79   ** Actually may
65b0: 62 65 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75  be the whole jou
65c0: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 68 6f 75  rnal header shou
65d0: 6c 64 20 62 65 20 64 65 6c 61 79 65 64 20 75 6e  ld be delayed un
65e0: 74 69 6c 20 74 68 61 74 0a 20 20 2a 2a 20 70 6f  til that.  ** po
65f0: 69 6e 74 2e 20 54 68 69 6e 6b 20 61 62 6f 75 74  int. Think about
6600: 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 6d 65   this..  */.  me
6610: 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a  mcpy(zHeader, aJ
6620: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
6630: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
6640: 63 29 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6e 52  c));.  /* The nR
6650: 65 63 20 46 69 65 6c 64 2e 20 30 78 46 46 46 46  ec Field. 0xFFFF
6660: 46 46 46 46 20 66 6f 72 20 6e 6f 2d 73 79 6e 63  FFFF for no-sync
6670: 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20   journals. */.  
6680: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
6690: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
66a0: 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65  alMagic)], pPage
66b0: 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66  r->noSync ? 0xff
66c0: 66 66 66 66 66 66 20 3a 20 30 29 3b 0a 20 20 2f  ffffff : 0);.  /
66d0: 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65  * The random che
66e0: 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69  ck-hash initiali
66f0: 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65  ser */ .  sqlite
6700: 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  3Randomness(size
6710: 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  of(pPager->cksum
6720: 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e  Init), &pPager->
6730: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75  cksumInit);.  pu
6740: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
6750: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
6760: 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65  Magic)+4], pPage
6770: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
6780: 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20   /* The initial 
6790: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f  database size */
67a0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
67b0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
67c0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20  urnalMagic)+8], 
67d0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
67e0: 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65  .  /* The assume
67f0: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f  d sector size fo
6800: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a  r this process *
6810: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
6820: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
6830: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d  ournalMagic)+12]
6840: 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  , pPager->sector
6850: 53 69 7a 65 29 3b 0a 20 20 49 4f 54 52 41 43 45  Size);.  IOTRACE
6860: 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20  (("JHDR %p %lld 
6870: 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
6880: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
6890: 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65  r, sizeof(zHeade
68a0: 72 29 29 29 0a 20 20 72 63 20 3d 20 73 71 6c 69  r))).  rc = sqli
68b0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
68c0: 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
68d0: 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29   sizeof(zHeader)
68e0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75  );..  /* The jou
68f0: 72 6e 61 6c 20 68 65 61 64 65 72 20 68 61 73 20  rnal header has 
6900: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 73 75 63  been written suc
6910: 63 65 73 73 66 75 6c 6c 79 2e 20 53 65 65 6b 20  cessfully. Seek 
6920: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  the journal.  **
6930: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
6940: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
6950: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
6960: 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20  r sector..  */. 
6970: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6980: 4f 4b 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  OK ){.    IOTRAC
6990: 45 28 28 22 4a 54 41 49 4c 20 25 70 20 25 6c 6c  E(("JTAIL %p %ll
69a0: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
69b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
69c0: 2d 31 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71  -1)).    rc = sq
69d0: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
69e0: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
69f0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a  >journalOff-1);.
6a00: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
6a10: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
6a20: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
6a30: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
6a40: 22 5c 30 30 30 22 2c 20 31 29 3b 0a 20 20 20 20  "\000", 1);.    
6a50: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
6a60: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
6a70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
6a80: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
6a90: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  his is called. A
6aa0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
6ab0: 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c  file.** (JOURNAL
6ac0: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
6ad0: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
6ae0: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
6af0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
6b00: 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d  ** file. See com
6b10: 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63  ments above func
6b20: 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61  tion writeJourna
6b30: 6c 48 64 72 28 29 20 66 6f 72 20 61 20 64 65 73  lHdr() for a des
6b40: 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  cription of.** t
6b50: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
6b60: 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  r format..**.** 
6b70: 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73  If the header is
6b80: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
6b90: 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20 73 65 74  ly, *nRec is set
6ba0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
6bb0: 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64  f.** page record
6bc0: 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  s following this
6bd0: 20 68 65 61 64 65 72 20 61 6e 64 20 2a 64 62 53   header and *dbS
6be0: 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
6bf0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
6c00: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
6c10: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
6c20: 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73   began, in pages
6c30: 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e  . Also, pPager->
6c40: 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20  cksumInit.** is 
6c50: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
6c60: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
6c70: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53  ournal header. S
6c80: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
6c90: 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  rned.** in this 
6ca0: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
6cb0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
6cc0: 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74  r file appears t
6cd0: 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  o be corrupted, 
6ce0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a  SQLITE_DONE is.*
6cf0: 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  * returned and *
6d00: 6e 52 65 63 20 61 6e 64 20 2a 64 62 53 69 7a 65  nRec and *dbSize
6d10: 20 61 72 65 20 6e 6f 74 20 73 65 74 2e 20 20 49   are not set.  I
6d20: 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f JOURNAL_HDR_SZ
6d30: 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74   bytes.** cannot
6d40: 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
6d50: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
6d60: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
6d70: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
6d80: 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72  tic int readJour
6d90: 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20  nalHdr(.  Pager 
6da0: 2a 70 50 61 67 65 72 2c 20 0a 20 20 69 36 34 20  *pPager, .  i64 
6db0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75  journalSize,.  u
6dc0: 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33  32 *pNRec, .  u3
6dd0: 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20  2 *pDbSize.){.  
6de0: 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e  int rc;.  unsign
6df0: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
6e00: 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74  ]; /* A buffer t
6e10: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
6e20: 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 72 63   header */..  rc
6e30: 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64   = seekJournalHd
6e40: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
6e50: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6e60: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
6e70: 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e  journalOff+JOURN
6e80: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
6e90: 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20  ) > journalSize 
6ea0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
6eb0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a  LITE_DONE;.  }..
6ec0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6ed0: 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
6ee0: 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  , aMagic, sizeof
6ef0: 28 61 4d 61 67 69 63 29 29 3b 0a 20 20 69 66 28  (aMagic));.  if(
6f00: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6f10: 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61  ..  if( memcmp(a
6f20: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
6f30: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
6f40: 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gic))!=0 ){.    
6f50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
6f60: 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  NE;.  }..  rc = 
6f70: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
6f80: 72 2d 3e 6a 66 64 2c 20 70 4e 52 65 63 29 3b 0a  r->jfd, pNRec);.
6f90: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
6fa0: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  n rc;..  rc = re
6fb0: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
6fc0: 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 63  >jfd, &pPager->c
6fd0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28  ksumInit);.  if(
6fe0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6ff0: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
7000: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
7010: 20 70 44 62 53 69 7a 65 29 3b 0a 20 20 69 66 28   pDbSize);.  if(
7020: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
7030: 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
7040: 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
7050: 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74  -size to match t
7060: 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62 79  he value used by
7070: 20 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65   .  ** the proce
7080: 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20  ss that created 
7090: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  this journal. If
70a0: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
70b0: 73 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62  s.  ** created b
70c0: 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65  y a process othe
70d0: 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c  r than this one,
70e0: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
70f0: 6e 65 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67  ne.  ** is being
7100: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
7110: 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61  hin pager_playba
7120: 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20  ck(). The local 
7130: 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61  value.  ** of Pa
7140: 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69  ger.sectorSize i
7150: 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68  s restored at th
7160: 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f  e end of that ro
7170: 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  utine..  */.  rc
7180: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
7190: 61 67 65 72 2d 3e 6a 66 64 2c 20 28 75 33 32 20  ager->jfd, (u32 
71a0: 2a 29 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  *)&pPager->secto
71b0: 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  rSize);.  if( rc
71c0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
71d0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
71e0: 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
71f0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
7200: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
7210: 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  eek(pPager->jfd,
7220: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
7230: 4f 66 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Off);.  return r
7240: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  c;.}.../*.** Wri
7250: 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  te the supplied 
7260: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
7270: 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ame into the jou
7280: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
7290: 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74  ger.** pPager at
72a0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
72b0: 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65  ation. The maste
72c0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d  r journal name m
72d0: 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a  ust be the last.
72e0: 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e  ** thing written
72f0: 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   to a journal fi
7300: 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  le. If the pager
7310: 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   is in full-sync
7320: 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f   mode, the.** jo
7330: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
7340: 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65  iptor is advance
7350: 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  d to the next se
7360: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65  ctor boundary be
7370: 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67  fore.** anything
7380: 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65   is written. The
7390: 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a   format is:.**.*
73a0: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47  * + 4 bytes: PAG
73b0: 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b  ER_MJ_PGNO..** +
73c0: 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74 68   N bytes: length
73d0: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
73e0: 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20  al name..** + 4 
73f0: 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20  bytes: N.** + 4 
7400: 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
7410: 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b  urnal name check
7420: 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65  sum..** + 8 byte
7430: 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  s: aJournalMagic
7440: 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  []..**.** The ma
7450: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67  ster journal pag
7460: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68  e checksum is th
7470: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74  e sum of the byt
7480: 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  es in the master
7490: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  .** journal name
74a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74  ..**.** If zMast
74b0: 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  er is a NULL poi
74c0: 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72  nter (occurs for
74d0: 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   a single databa
74e0: 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  se transaction),
74f0: 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69   .** this call i
7500: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
7510: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61  atic int writeMa
7520: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sterJournal(Page
7530: 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
7540: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
7550: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
7560: 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20   len; .  int i; 
7570: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30  .  u32 cksum = 0
7580: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69  ;.  char zBuf[si
7590: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
75a0: 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28  ic)+2*4];..  if(
75b0: 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61   !zMaster || pPa
75c0: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20  ger->setMaster) 
75d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
75e0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
75f0: 61 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65  aster = 1;..  le
7600: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74  n = strlen(zMast
7610: 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  er);.  for(i=0; 
7620: 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<len; i++){.   
7630: 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65   cksum += zMaste
7640: 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  r[i];.  }..  /* 
7650: 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
7660: 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f  mode, advance to
7670: 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73   the next disk s
7680: 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69  ector before wri
7690: 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61  ting.  ** the ma
76a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
76b0: 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61  e. This is in ca
76c0: 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
76d0: 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a  page written to.
76e0: 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
76f0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
7700: 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20  n synced..  */. 
7710: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
7720: 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  lSync ){.    rc 
7730: 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72  = seekJournalHdr
7740: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
7750: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7760: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
7770: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
7780: 61 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30  alOff += (len+20
7790: 29 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65  );..  rc = write
77a0: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
77b0: 66 64 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  fd, PAGER_MJ_PGN
77c0: 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  O(pPager));.  if
77d0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
77e0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
77f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
7800: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
7810: 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a   zMaster, len);.
7820: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7830: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
7840: 0a 0a 20 20 70 75 74 33 32 62 69 74 73 28 7a 42  ..  put32bits(zB
7850: 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74 33  uf, len);.  put3
7860: 32 62 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c 20  2bits(&zBuf[4], 
7870: 63 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70 79  cksum);.  memcpy
7880: 28 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75 72  (&zBuf[8], aJour
7890: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
78a0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
78b0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
78c0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
78d0: 6a 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69 7a  jfd, zBuf, 8+siz
78e0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
78f0: 63 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  c));.  pPager->n
7900: 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
7910: 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 72 65 74  r->noSync;.  ret
7920: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7930: 20 41 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 61   Add or remove a
7940: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6c   page from the l
7950: 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
7960: 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65   that are in the
7970: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  .** statement jo
7980: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urnal..**.** The
7990: 20 50 61 67 65 72 20 6b 65 65 70 73 20 61 20 73   Pager keeps a s
79a0: 65 70 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20  eparate list of 
79b0: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 63  pages that are c
79c0: 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74  urrently in.** t
79d0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
79e0: 72 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70  rnal.  This help
79f0: 73 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  s the sqlite3Pag
7a00: 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 29 0a 2a  erStmtCommit().*
7a10: 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55  * routine run MU
7a20: 43 48 20 66 61 73 74 65 72 20 66 6f 72 20 74 68  CH faster for th
7a30: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
7a40: 65 72 65 20 74 68 65 72 65 20 61 72 65 20 6d 61  ere there are ma
7a50: 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d  ny.** pages in m
7a60: 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20 61  emory but only a
7a70: 20 66 65 77 20 61 72 65 20 69 6e 20 74 68 65 20   few are in the 
7a80: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
7a90: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
7aa0: 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74  d page_add_to_st
7ab0: 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70  mt_list(PgHdr *p
7ac0: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
7ad0: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
7ae0: 65 72 3b 0a 20 20 50 67 48 69 73 74 6f 72 79 20  er;.  PgHistory 
7af0: 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
7b00: 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
7b10: 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d  er);.  assert( M
7b20: 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70  EMDB );.  if( !p
7b30: 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a  Hist->inStmt ){.
7b40: 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73      assert( pHis
7b50: 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d 30 20  t->pPrevStmt==0 
7b60: 26 26 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53  && pHist->pNextS
7b70: 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  tmt==0 );.    if
7b80: 28 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20  ( pPager->pStmt 
7b90: 29 7b 0a 20 20 20 20 20 20 50 47 48 44 52 5f 54  ){.      PGHDR_T
7ba0: 4f 5f 48 49 53 54 28 70 50 61 67 65 72 2d 3e 70  O_HIST(pPager->p
7bb0: 53 74 6d 74 2c 20 70 50 61 67 65 72 29 2d 3e 70  Stmt, pPager)->p
7bc0: 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 3b 0a  PrevStmt = pPg;.
7bd0: 20 20 20 20 7d 0a 20 20 20 20 70 48 69 73 74 2d      }.    pHist-
7be0: 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 61  >pNextStmt = pPa
7bf0: 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20  ger->pStmt;.    
7c00: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
7c10: 70 50 67 3b 0a 20 20 20 20 70 48 69 73 74 2d 3e  pPg;.    pHist->
7c20: 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 20 20 7d 0a  inStmt = 1;.  }.
7c30: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20  }../*.** Find a 
7c40: 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68  page in the hash
7c50: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73   table given its
7c60: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 52   page number.  R
7c70: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
7c80: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f  er to the page o
7c90: 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  r NULL if not fo
7ca0: 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  und..*/.static P
7cb0: 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b  gHdr *pager_look
7cc0: 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
7cd0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
7ce0: 50 67 48 64 72 20 2a 70 3b 0a 20 20 69 66 28 20  PgHdr *p;.  if( 
7cf0: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 3d 3d 30  pPager->aHash==0
7d00: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
7d10: 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68   = pPager->aHash
7d20: 5b 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d  [pgno & (pPager-
7d30: 3e 6e 48 61 73 68 2d 31 29 5d 3b 0a 20 20 77 68  >nHash-1)];.  wh
7d40: 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 70 67 6e  ile( p && p->pgn
7d50: 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70  o!=pgno ){.    p
7d60: 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b   = p->pNextHash;
7d70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
7d80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  .}../*.** Unlock
7d90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7da0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
7db0: 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  id pager_unlock(
7dc0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
7dd0: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
7de0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
7df0: 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
7e00: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
7e10: 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
7e20: 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
7e30: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
7e40: 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 49  ze = -1;.      I
7e50: 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  OTRACE(("UNLOCK 
7e60: 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
7e70: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
7e80: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
7e90: 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 70 50 61 67  UNLOCK;.    pPag
7ea0: 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
7eb0: 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  one = 0;.  }.}..
7ec0: 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20  /*.** Execute a 
7ed0: 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72  rollback if a tr
7ee0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
7ef0: 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ive and unlock t
7f00: 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
7f10: 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 20  file. This is a 
7f20: 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67  no-op if the pag
7f30: 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 65  er has already e
7f40: 6e 74 65 72 65 64 0a 2a 2a 20 74 68 65 20 65 72  ntered.** the er
7f50: 72 6f 72 2d 73 74 61 74 65 2e 0a 2a 2f 0a 73 74  ror-state..*/.st
7f60: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55  atic void pagerU
7f70: 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
7f80: 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 69 66  (Pager *p){.  if
7f90: 28 20 70 2d 3e 65 72 72 43 6f 64 65 20 29 20 72  ( p->errCode ) r
7fa0: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
7fb0: 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52   p->state>=PAGER
7fc0: 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70 2d 3e  _RESERVED || p->
7fd0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
7fe0: 3b 0a 20 20 69 66 28 20 70 2d 3e 73 74 61 74 65  ;.  if( p->state
7ff0: 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
8000: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
8010: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 29 3b  agerRollback(p);
8020: 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c  .  }.  pager_unl
8030: 6f 63 6b 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ock(p);.  assert
8040: 28 20 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ( p->errCode || 
8050: 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  !p->journalOpen 
8060: 7c 7c 20 28 70 2d 3e 65 78 63 6c 75 73 69 76 65  || (p->exclusive
8070: 4d 6f 64 65 26 26 21 70 2d 3e 6a 6f 75 72 6e 61  Mode&&!p->journa
8080: 6c 4f 66 66 29 20 29 3b 0a 20 20 61 73 73 65 72  lOff) );.  asser
8090: 74 28 20 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c  t( p->errCode ||
80a0: 20 21 70 2d 3e 73 74 6d 74 4f 70 65 6e 20 7c 7c   !p->stmtOpen ||
80b0: 20 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64   p->exclusiveMod
80c0: 65 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  e );.}.../*.** C
80d0: 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  lear the in-memo
80e0: 72 79 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  ry cache.  This 
80f0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20  routine.** sets 
8100: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
8110: 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77   pager back to w
8120: 68 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20  hat it was when 
8130: 69 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20  it was first.** 
8140: 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74  opened.  Any out
8150: 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
8160: 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61  re invalidated a
8170: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 74  nd subsequent at
8180: 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63  tempts.** to acc
8190: 65 73 73 20 74 68 6f 73 65 20 70 61 67 65 73 20  ess those pages 
81a0: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75  will likely resu
81b0: 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
81c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
81d0: 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67   pager_reset(Pag
81e0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
81f0: 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78  gHdr *pPg, *pNex
8200: 74 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  t;.  if( pPager-
8210: 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72  >errCode ) retur
8220: 6e 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  n;.  for(pPg=pPa
8230: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
8240: 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  pPg=pNext){.    
8250: 49 4f 54 52 41 43 45 28 28 22 50 47 46 52 45 45  IOTRACE(("PGFREE
8260: 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
8270: 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  r, pPg->pgno));.
8280: 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
8290: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66  qlite3_pager_pgf
82a0: 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  ree_count);.    
82b0: 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pNext = pPg->pNe
82c0: 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74  xtAll;.    sqlit
82d0: 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a  eFree(pPg);.  }.
82e0: 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
82f0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
8300: 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 70 50 61  First = 0;.  pPa
8310: 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
8320: 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  d = 0;.  pPager-
8330: 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 50  >pLast = 0;.  pP
8340: 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a  ager->pAll = 0;.
8350: 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20    pPager->nHash 
8360: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  = 0;.  sqliteFre
8370: 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  e(pPager->aHash)
8380: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  ;.  pPager->nPag
8390: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
83a0: 3e 61 48 61 73 68 20 3d 20 30 3b 0a 20 20 70 50  >aHash = 0;.  pP
83b0: 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a  ager->nRef = 0;.
83c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
83d0: 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61  utine ends a tra
83e0: 6e 73 61 63 74 69 6f 6e 2e 20 20 41 20 74 72 61  nsaction.  A tra
83f0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65  nsaction is ende
8400: 64 20 62 79 20 65 69 74 68 65 72 0a 2a 2a 20 61  d by either.** a
8410: 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c   COMMIT or a ROL
8420: 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  LBACK..**.** Whe
8430: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
8440: 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61  s called, the pa
8450: 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72  ger has the jour
8460: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e  nal file open an
8470: 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20  d.** a RESERVED 
8480: 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
8490: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
84a0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
84b0: 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 0a 2a 2a   will release.**
84c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
84d0: 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73 20  ck and acquires 
84e0: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e  a SHARED lock in
84f0: 20 69 74 73 20 70 6c 61 63 65 20 69 66 20 74 68   its place if th
8500: 61 74 20 69 73 0a 2a 2a 20 74 68 65 20 61 70 70  at is.** the app
8510: 72 6f 70 72 69 61 74 65 20 74 68 69 6e 67 20 74  ropriate thing t
8520: 6f 20 64 6f 2e 20 20 52 65 6c 65 61 73 65 20 6c  o do.  Release l
8530: 6f 63 6b 73 20 75 73 75 61 6c 6c 79 20 69 73 20  ocks usually is 
8540: 61 70 70 72 6f 70 72 69 61 74 65 2c 0a 2a 2a 20  appropriate,.** 
8550: 75 6e 6c 65 73 73 20 77 65 20 61 72 65 20 69 6e  unless we are in
8560: 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73   exclusive acces
8570: 73 20 6d 6f 64 65 20 6f 72 20 75 6e 6c 65 73 73  s mode or unless
8580: 20 74 68 69 73 20 69 73 20 61 20 0a 2a 2a 20 43   this is a .** C
8590: 4f 4d 4d 49 54 20 41 4e 44 20 42 45 47 49 4e 20  OMMIT AND BEGIN 
85a0: 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 41 4e 44 20  or ROLLBACK AND 
85b0: 42 45 47 49 4e 20 6f 70 65 72 61 74 69 6f 6e 2e  BEGIN operation.
85c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
85d0: 61 6c 20 66 69 6c 65 20 69 73 20 65 69 74 68 65  al file is eithe
85e0: 72 20 64 65 6c 65 74 65 64 20 6f 72 20 74 72 75  r deleted or tru
85f0: 6e 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f  ncated..**.** TO
8600: 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65 65  DO: Consider kee
8610: 70 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ping the journal
8620: 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74   file open for t
8630: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
8640: 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68  es..** This migh
8650: 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d  t give a perform
8660: 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74  ance improvement
8670: 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68 65 72   on windows wher
8680: 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66  e opening.** a f
8690: 69 6c 65 20 69 73 20 61 6e 20 65 78 70 65 6e 73  ile is an expens
86a0: 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  ive operation..*
86b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
86c0: 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
86d0: 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  on(Pager *pPager
86e0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
86f0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
8700: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 63 32  TE_OK;.  int rc2
8710: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
8720: 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
8730: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
8740: 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
8750: 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75  RVED ){.    retu
8760: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
8770: 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  }.  sqlite3Pager
8780: 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65  StmtCommit(pPage
8790: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
87a0: 2d 3e 73 74 6d 74 4f 70 65 6e 20 26 26 20 21 70  ->stmtOpen && !p
87b0: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
87c0: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Mode ){.    sqli
87d0: 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67  te3OsClose(&pPag
87e0: 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70  er->stfd);.    p
87f0: 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
8800: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
8810: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
8820: 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  en ){.    if( pP
8830: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
8840: 6f 64 65 20 0a 20 20 20 20 20 20 20 20 20 20 26  ode .          &
8850: 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  & (rc = sqlite3O
8860: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
8870: 2d 3e 6a 66 64 2c 20 30 29 29 3d 3d 53 51 4c 49  ->jfd, 0))==SQLI
8880: 54 45 5f 4f 4b 20 29 7b 3b 0a 20 20 20 20 20 20  TE_OK ){;.      
8890: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
88a0: 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
88b0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
88c0: 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
88d0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
88e0: 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
88f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8900: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
8910: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
8920: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
8930: 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  nalOpen = 0;.   
8940: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
8950: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
8960: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
8970: 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  lete(pPager->zJo
8980: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  urnal);.      }.
8990: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
89a0: 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49  Free( pPager->aI
89b0: 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  nJournal );.    
89c0: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
89d0: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  al = 0;.    for(
89e0: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
89f0: 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
8a00: 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
8a10: 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
8a20: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
8a30: 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  dirty = 0;.     
8a40: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
8a50: 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 61   0;.      pPg->a
8a60: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
8a70: 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
8a80: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
8a90: 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
8aa0: 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
8ab0: 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
8ac0: 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
8ad0: 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  >pDirty = 0;.   
8ae0: 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
8af0: 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  che = 0;.    pPa
8b00: 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
8b10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
8b20: 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
8b30: 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
8b40: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
8b50: 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c  >dirtyCache==0 |
8b60: 7c 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  | pPager->useJou
8b70: 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a  rnal==0 );.  }..
8b80: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
8b90: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
8ba0: 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
8bb0: 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72  3OsUnlock(pPager
8bc0: 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
8bd0: 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  K);.    pPager->
8be0: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
8bf0: 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ARED;.  }else if
8c00: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
8c10: 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 29 7b  =PAGER_SYNCED ){
8c20: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
8c30: 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
8c40: 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67  SIVE;.  }.  pPag
8c50: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
8c60: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
8c70: 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70  tMaster = 0;.  p
8c80: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
8c90: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
8ca0: 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50  FirstSynced = pP
8cb0: 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20  ager->pFirst;.  
8cc0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
8cd0: 20 2d 31 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28   -1;..  return (
8ce0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63  rc==SQLITE_OK?rc
8cf0: 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  2:rc);.}../*.** 
8d00: 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75  Compute and retu
8d10: 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 66 6f  rn a checksum fo
8d20: 72 20 74 68 65 20 70 61 67 65 20 6f 66 20 64 61  r the page of da
8d30: 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ta..**.** This i
8d40: 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65  s not a real che
8d50: 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20 72 65  cksum.  It is re
8d60: 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75  ally just the su
8d70: 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e  m of the .** ran
8d80: 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  dom initial valu
8d90: 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 6e  e and the page n
8da0: 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70 65 72  umber.  We exper
8db0: 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20  imented with.** 
8dc0: 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68  a checksum of th
8dd0: 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c 20 62  e entire data, b
8de0: 75 74 20 74 68 61 74 20 77 61 73 20 66 6f 75 6e  ut that was foun
8df0: 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77  d to be too slow
8e00: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
8e10: 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  t the page numbe
8e20: 72 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74  r is stored at t
8e30: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
8e40: 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20  data and.** the 
8e50: 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f 72  checksum is stor
8e60: 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  ed at the end.  
8e70: 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e  This is importan
8e80: 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a  t.  If journal.*
8e90: 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63  * corruption occ
8ea0: 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77  urs due to a pow
8eb0: 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
8ec0: 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e  most likely scen
8ed0: 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20  ario.** is that 
8ee0: 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f  one end or the o
8ef0: 74 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f  ther of the reco
8f00: 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67  rd will be chang
8f10: 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75  ed.  It is.** mu
8f20: 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74  ch less likely t
8f30: 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73  hat the two ends
8f40: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
8f50: 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a  record will be.*
8f60: 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68  * correct and th
8f70: 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72  e middle be corr
8f80: 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73  upt.  Thus, this
8f90: 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65   "checksum" sche
8fa0: 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61  me,.** though fa
8fb0: 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63  st and simple, c
8fc0: 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c  atches the mostl
8fd0: 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66  y likely kind of
8fe0: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a   corruption..**.
8ff0: 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73  ** FIX ME:  Cons
9000: 69 64 65 72 20 61 64 64 69 6e 67 20 65 76 65 72  ider adding ever
9010: 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f 29 20  y 200th (or so) 
9020: 62 79 74 65 20 6f 66 20 74 68 65 20 64 61 74 61  byte of the data
9030: 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b   to the.** check
9040: 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79 20 69  sum.  That way i
9050: 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  f a single page 
9060: 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20  spans 3 or more 
9070: 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61 6e 64  disk sectors and
9080: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64  .** only the mid
9090: 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20 63 6f  dle sector is co
90a0: 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c 20 73  rrupt, we will s
90b0: 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65 61 73  till have a reas
90c0: 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65  onable.** chance
90d0: 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68 65 20   of failing the 
90e0: 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74 68 75  checksum and thu
90f0: 73 20 64 65 74 65 63 74 69 6e 67 20 74 68 65 20  s detecting the 
9100: 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74  problem..*/.stat
9110: 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73  ic u32 pager_cks
9120: 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  um(Pager *pPager
9130: 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74  , const u8 *aDat
9140: 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20  a){.  u32 cksum 
9150: 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
9160: 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70  nit;.  int i = p
9170: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d  Pager->pageSize-
9180: 32 30 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e  200;.  while( i>
9190: 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  0 ){.    cksum +
91a0: 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20  = aData[i];.    
91b0: 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20  i -= 200;.  }.  
91c0: 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a  return cksum;.}.
91d0: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
91e0: 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69  aration */.stati
91f0: 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e  c void makeClean
9200: 28 50 67 48 64 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  (PgHdr*);../*.**
9210: 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70   Read a single p
9220: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  age from the jou
9230: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64  rnal file opened
9240: 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
9250: 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61  tor.** jfd.  Pla
9260: 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20 70  yback this one p
9270: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73  age..**.** If us
9280: 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61  eCksum==0 it mea
9290: 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  ns this journal 
92a0: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 63 68 65  does not use che
92b0: 63 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b 73 75  cksums.  Checksu
92c0: 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73  ms.** are not us
92d0: 65 64 20 69 6e 20 73 74 61 74 65 6d 65 6e 74 20  ed in statement 
92e0: 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61 75 73 65  journals because
92f0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
9300: 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65  als do not.** ne
9310: 65 64 20 74 6f 20 73 75 72 76 69 76 65 20 70 6f  ed to survive po
9320: 77 65 72 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f  wer failures..*/
9330: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
9340: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
9350: 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
9360: 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64 2c 20  r, OsFile *jfd, 
9370: 69 6e 74 20 75 73 65 43 6b 73 75 6d 29 7b 0a 20  int useCksum){. 
9380: 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
9390: 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20   *pPg;          
93a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
93b0: 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
93c0: 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
93d0: 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
93e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
93f0: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
9400: 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75  of a page in jou
9410: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
9420: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
9430: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
9440: 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e  sum used for san
9450: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a  ity checking */.
9460: 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20 28 75    u8 *aData = (u
9470: 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70  8 *)pPager->pTmp
9480: 53 70 61 63 65 3b 20 20 20 2f 2a 20 54 65 6d 70  Space;   /* Temp
9490: 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 20 70   storage for a p
94a0: 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 75 73 65  age */..  /* use
94b0: 43 6b 73 75 6d 20 73 68 6f 75 6c 64 20 62 65 20  Cksum should be 
94c0: 74 72 75 65 20 66 6f 72 20 74 68 65 20 6d 61 69  true for the mai
94d0: 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 66 61  n journal and fa
94e0: 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20 73 74 61  lse for.  ** sta
94f0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e  tement journals.
9500: 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68    Verify that th
9510: 69 73 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  is is always the
9520: 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20 61 73 73   case.  */.  ass
9530: 65 72 74 28 20 6a 66 64 20 3d 3d 20 28 75 73 65  ert( jfd == (use
9540: 43 6b 73 75 6d 20 3f 20 70 50 61 67 65 72 2d 3e  Cksum ? pPager->
9550: 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 74  jfd : pPager->st
9560: 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
9570: 20 61 44 61 74 61 20 29 3b 0a 0a 20 20 72 63 20   aData );..  rc 
9580: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
9590: 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  , &pgno);.  if( 
95a0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
95b0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
95c0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
95d0: 6a 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67  jfd, aData, pPag
95e0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
95f0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9600: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
9610: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
9620: 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e  lOff += pPager->
9630: 70 61 67 65 53 69 7a 65 20 2b 20 34 3b 0a 0a 20  pageSize + 4;.. 
9640: 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
9650: 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  ing on the page.
9660: 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69    This is more i
9670: 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20  mportant that I 
9680: 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20  originally.  ** 
9690: 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70  thought.  If a p
96a0: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
96b0: 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  urs while the jo
96c0: 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77  urnal is being w
96d0: 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20  ritten,.  ** it 
96e0: 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61  could cause inva
96f0: 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77  lid data to be w
9700: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
9710: 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65  journal.  We nee
9720: 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74  d to.  ** detect
9730: 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61   this invalid da
9740: 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72  ta (with high pr
9750: 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69  obability) and i
9760: 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20  gnore it..  */. 
9770: 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20   if( pgno==0 || 
9780: 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
9790: 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
97a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
97b0: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28  _DONE;.  }.  if(
97c0: 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e 65 64 29   pgno>(unsigned)
97d0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
97e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
97f0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
9800: 28 20 75 73 65 43 6b 73 75 6d 20 29 7b 0a 20 20  ( useCksum ){.  
9810: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
9820: 73 28 6a 66 64 2c 20 26 63 6b 73 75 6d 29 3b 0a  s(jfd, &cksum);.
9830: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
9840: 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67  urn rc;.    pPag
9850: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
9860: 3d 20 34 3b 0a 20 20 20 20 69 66 28 20 70 61 67  = 4;.    if( pag
9870: 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
9880: 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29   aData)!=cksum )
9890: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
98a0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
98b0: 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
98c0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
98d0: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c  PAGER_RESERVED |
98e0: 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  | pPager->state>
98f0: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
9900: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
9910: 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45 53   pager is in RES
9920: 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65  ERVED state, the
9930: 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
9940: 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20  a copy of this. 
9950: 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20   ** page in the 
9960: 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20  pager cache. In 
9970: 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75  this case just u
9980: 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
9990: 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20  cache,.  ** not 
99a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
99b0: 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c  e. The page is l
99c0: 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79  eft marked dirty
99d0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
99e0: 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65   **.  ** An exce
99f0: 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f  ption to the abo
9a00: 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20  ve rule: If the 
9a10: 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e  database is in n
9a20: 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a  o-sync mode.  **
9a30: 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d   and a page is m
9a40: 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69  oved during an i
9a50: 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
9a60: 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  m then the page 
9a70: 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20  may.  ** not be 
9a80: 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
9a90: 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20  he. Later: if a 
9aa0: 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65  malloc() or IO e
9ab0: 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a  rror occurs.  **
9ac0: 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61   during a Movepa
9ad0: 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20  ge() call, then 
9ae0: 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74  the page may not
9af0: 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65   be in the cache
9b00: 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f  .  ** either. So
9b10: 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64   the condition d
9b20: 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20  escribed in the 
9b30: 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20  above paragraph 
9b40: 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65  is not.  ** asse
9b50: 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20  rt()able..  **. 
9b60: 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53   ** If in EXCLUS
9b70: 49 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20  IVE state, then 
9b80: 77 65 20 75 70 64 61 74 65 20 74 68 65 20 70 61  we update the pa
9b90: 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20  ger cache if it 
9ba0: 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20  exists.  ** and 
9bb0: 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54  the main file. T
9bc0: 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e 20  he page is then 
9bd0: 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79  marked not dirty
9be0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b  ..  **.  ** Tick
9bf0: 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73  et #1171:  The s
9c00: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
9c10: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70   might contain p
9c20: 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74  age content that
9c30: 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65   is.  ** differe
9c40: 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  nt from the page
9c50: 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20   content at the 
9c60: 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
9c70: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54  nsaction..  ** T
9c80: 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20  his occurs when 
9c90: 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65  a page is change
9ca0: 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  d prior to the s
9cb0: 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d  tart of a statem
9cc0: 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68  ent.  ** then ch
9cd0: 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68  anged again with
9ce0: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
9cf0: 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  .  When rolling 
9d00: 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a  back such a.  **
9d10: 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75   statement we mu
9d20: 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  st not write to 
9d30: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
9d40: 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20  abase unless we 
9d50: 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65  know.  ** for ce
9d60: 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69  rtain that origi
9d70: 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
9d80: 73 20 61 72 65 20 69 6e 20 74 68 65 20 6d 61 69  s are in the mai
9d90: 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
9da0: 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77  journal.  Otherw
9db0: 69 73 65 2c 20 69 66 20 61 20 66 75 6c 6c 20 52  ise, if a full R
9dc0: 4f 4c 4c 42 41 43 4b 20 6f 63 63 75 72 73 20 61  OLLBACK occurs a
9dd0: 66 74 65 72 20 74 68 65 20 73 74 61 74 65 6d 65  fter the stateme
9de0: 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  nt.  ** rollback
9df0: 20 74 68 65 20 66 75 6c 6c 20 52 4f 4c 4c 42 41   the full ROLLBA
9e00: 43 4b 20 77 69 6c 6c 20 6e 6f 74 20 72 65 73 74  CK will not rest
9e10: 6f 72 65 20 74 68 65 20 70 61 67 65 20 74 6f 20  ore the page to 
9e20: 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a  its original.  *
9e30: 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 54 77 6f 20  * content.  Two 
9e40: 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20  conditions must 
9e50: 62 65 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72  be met before wr
9e60: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
9e70: 61 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65 73  abase.  ** files
9e80: 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61  . (1) the databa
9e90: 73 65 20 6d 75 73 74 20 62 65 20 6c 6f 63 6b 65  se must be locke
9ea0: 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20  d.  (2) we know 
9eb0: 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
9ec0: 6c 0a 20 20 2a 2a 20 70 61 67 65 20 63 6f 6e 74  l.  ** page cont
9ed0: 65 6e 74 20 69 73 20 69 6e 20 74 68 65 20 6d 61  ent is in the ma
9ee0: 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65  in journal eithe
9ef0: 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  r because the pa
9f00: 67 65 20 69 73 20 6e 6f 74 20 69 6e 0a 20 20 2a  ge is not in.  *
9f10: 2a 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 20  * cache or else 
9f20: 69 74 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  it is marked as 
9f30: 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a  needSync==0..  *
9f40: 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  /.  pPg = pager_
9f50: 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
9f60: 67 6e 6f 29 3b 0a 20 20 50 41 47 45 52 54 52 41  gno);.  PAGERTRA
9f70: 43 45 33 28 22 50 4c 41 59 42 41 43 4b 20 25 64  CE3("PLAYBACK %d
9f80: 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
9f90: 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
9fa0: 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  no);.  if( pPage
9fb0: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
9fc0: 45 58 43 4c 55 53 49 56 45 20 26 26 20 28 70 50  EXCLUSIVE && (pP
9fd0: 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e 65 65  g==0 || pPg->nee
9fe0: 64 53 79 6e 63 3d 3d 30 29 20 29 7b 0a 20 20 20  dSync==0) ){.   
9ff0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
a000: 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  eek(pPager->fd, 
a010: 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
a020: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
a030: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
a040: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
a050: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
a060: 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
a070: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
a080: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
a090: 20 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20      if( pPg ){. 
a0a0: 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70       makeClean(p
a0b0: 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Pg);.    }.  }. 
a0c0: 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
a0d0: 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c  /* No page shoul
a0e0: 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63  d ever be explic
a0f0: 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b  itly rolled back
a100: 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c   that is in use,
a110: 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66   except.    ** f
a120: 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20  or page 1 which 
a130: 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69  is held in use i
a140: 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20  n order to keep 
a150: 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  the lock on the.
a160: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
a170: 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20  active. However 
a180: 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20  such a page may 
a190: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
a1a0: 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  s a result.    *
a1b0: 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c  * of an internal
a1c0: 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67   error resulting
a1d0: 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63   in an automatic
a1e0: 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
a1f0: 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
a200: 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  back()..    */. 
a210: 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a     void *pData;.
a220: 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
a230: 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70  Pg->nRef==0 || p
a240: 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a  Pg->pgno==1 ); *
a250: 2f 0a 20 20 20 20 70 44 61 74 61 20 3d 20 50 47  /.    pData = PG
a260: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
a270: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61  ;.    memcpy(pDa
a280: 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  ta, aData, pPage
a290: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
a2a0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52    if( pPager->xR
a2b0: 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20  einiter ){.     
a2c0: 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
a2d0: 65 72 28 70 50 67 2c 20 70 50 61 67 65 72 2d 3e  er(pPg, pPager->
a2e0: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
a2f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
a300: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
a310: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
a320: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
a330: 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f  g);.#endif.    /
a340: 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61  * If this was pa
a350: 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f  ge 1, then resto
a360: 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
a370: 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
a380: 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73  ..    ** Do this
a390: 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f   before any deco
a3a0: 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ding. */.    if(
a3b0: 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
a3c0: 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
a3d0: 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28  ->dbFileVers, &(
a3e0: 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c  (u8*)pData)[24],
a3f0: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
a400: 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
a410: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64   }..    /* Decod
a420: 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20  e the page just 
a430: 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a  read from disk *
a440: 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61  /.    CODEC1(pPa
a450: 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
a460: 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20  >pgno, 3);.  }. 
a470: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a480: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a  *.** Parameter z
a490: 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61  Master is the na
a4a0: 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
a4b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73  ournal file. A s
a4c0: 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ingle journal.**
a4d0: 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72   file that refer
a4e0: 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65  red to the maste
a4f0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  r journal file h
a500: 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c  as just been rol
a510: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69  led back..** Thi
a520: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
a530: 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
a540: 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
a550: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a560: 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65  file,.** and doe
a570: 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a  s so if it is..*
a580: 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
a590: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
a5a0: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20  tains the names 
a5b0: 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75  of all child jou
a5c0: 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c  rnals..** To tel
a5d0: 6c 20 69 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  l if a master jo
a5e0: 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c  urnal can be del
a5f0: 65 74 65 64 2c 20 63 68 65 63 6b 20 74 6f 20 65  eted, check to e
a600: 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68  ach of the.** ch
a610: 69 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20  ildren.  If all 
a620: 63 68 69 6c 64 72 65 6e 20 61 72 65 20 65 69 74  children are eit
a630: 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72 20 64  her missing or d
a640: 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a  o not refer to.*
a650: 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d 61  * a different ma
a660: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  ster journal, th
a670: 65 6e 20 74 68 69 73 20 6d 61 73 74 65 72 20 6a  en this master j
a680: 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65  ournal can be de
a690: 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  leted..*/.static
a6a0: 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61   int pager_delma
a6b0: 73 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20  ster(const char 
a6c0: 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
a6d0: 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65   rc;.  int maste
a6e0: 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f 73  r_open = 0;.  Os
a6f0: 46 69 6c 65 20 2a 6d 61 73 74 65 72 20 3d 20 30  File *master = 0
a700: 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  ;.  char *zMaste
a710: 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a  rJournal = 0; /*
a720: 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73   Contents of mas
a730: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
a740: 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65   */.  i64 nMaste
a750: 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  rJournal;       
a760: 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65  /* Size of maste
a770: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
a780: 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  /..  /* Open the
a790: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a7a0: 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65 6c 79  file exclusively
a7b0: 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f 74   in case some ot
a7c0: 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a  her process.  **
a7d0: 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68 69 73   is running this
a7e0: 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e   routine also. N
a7f0: 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b 65 73  ot that it makes
a800: 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66 65 72   too much differ
a810: 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  ence..  */.  rc 
a820: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52  = sqlite3OsOpenR
a830: 65 61 64 4f 6e 6c 79 28 7a 4d 61 73 74 65 72 2c  eadOnly(zMaster,
a840: 20 26 6d 61 73 74 65 72 29 3b 0a 20 20 61 73 73   &master);.  ass
a850: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
a860: 4f 4b 20 7c 7c 20 6d 61 73 74 65 72 20 29 3b 0a  OK || master );.
a870: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
a880: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
a890: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74  ster_out;.  mast
a8a0: 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 72  er_open = 1;.  r
a8b0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
a8c0: 65 53 69 7a 65 28 6d 61 73 74 65 72 2c 20 26 6e  eSize(master, &n
a8d0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
a8e0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
a8f0: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
a900: 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28  ster_out;..  if(
a910: 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e   nMasterJournal>
a920: 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
a930: 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61  Journal;.    cha
a940: 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20  r *zMasterPtr = 
a950: 30 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20  0;..    /* Load 
a960: 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65  the entire maste
a970: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
a980: 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
a990: 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73  ed from.    ** s
a9a0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e  qliteMalloc() an
a9b0: 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  d pointed to by 
a9c0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20  zMasterJournal. 
a9d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73  .    */.    zMas
a9e0: 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68  terJournal = (ch
a9f0: 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f  ar *)sqliteMallo
aa00: 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  c(nMasterJournal
aa10: 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73  );.    if( !zMas
aa20: 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
aa30: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
aa40: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
aa50: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
aa60: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
aa70: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6d 61  sqlite3OsRead(ma
aa80: 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75  ster, zMasterJou
aa90: 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75  rnal, nMasterJou
aaa0: 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  rnal);.    if( r
aab0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
aac0: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
aad0: 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c  t;..    zJournal
aae0: 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61   = zMasterJourna
aaf0: 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a  l;.    while( (z
ab00: 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a  Journal-zMasterJ
ab10: 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a  ournal)<nMasterJ
ab20: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
ab30: 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  if( sqlite3OsFil
ab40: 65 45 78 69 73 74 73 28 7a 4a 6f 75 72 6e 61 6c  eExists(zJournal
ab50: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
ab60: 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  One of the journ
ab70: 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  als pointed to b
ab80: 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  y the master jou
ab90: 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20  rnal exists..   
aba0: 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20       ** Open it 
abb0: 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20  and check if it 
abc0: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61  points at the ma
abd0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  ster journal. If
abe0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20  .        ** so, 
abf0: 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
ac00: 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74  eleting the mast
ac10: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
ac20: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
ac30: 20 20 20 20 4f 73 46 69 6c 65 20 2a 6a 6f 75 72      OsFile *jour
ac40: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nal = 0;.       
ac50: 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20 20 20 20   int c;..       
ac60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
ac70: 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f 75  penReadOnly(zJou
ac80: 72 6e 61 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29 3b  rnal, &journal);
ac90: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
aca0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
acb0: 7c 20 6a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  | journal );.   
acc0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
acd0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ace0: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
acf0: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
ad00: 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  }..        rc = 
ad10: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
ad20: 6c 28 6a 6f 75 72 6e 61 6c 2c 20 26 7a 4d 61 73  l(journal, &zMas
ad30: 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20  terPtr);.       
ad40: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
ad50: 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  &journal);.     
ad60: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
ad70: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
ad80: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
ad90: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
ada0: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61  .        c = zMa
adb0: 73 74 65 72 50 74 72 21 3d 30 20 26 26 20 73 74  sterPtr!=0 && st
adc0: 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c  rcmp(zMasterPtr,
add0: 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20   zMaster)==0;.  
ade0: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
adf0: 28 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20  (zMasterPtr);.  
ae00: 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20        if( c ){. 
ae10: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68           /* We h
ae20: 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20  ave a match. Do 
ae30: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d  not delete the m
ae40: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
ae50: 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  le. */.         
ae60: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
ae70: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
ae80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f       }.      zJo
ae90: 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65 6e  urnal += (strlen
aea0: 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20  (zJournal)+1);. 
aeb0: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 72 63     }.  }.  .  rc
aec0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
aed0: 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65  te(zMaster);..de
aee0: 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69  lmaster_out:.  i
aef0: 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( zMasterJourna
af00: 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  l ){.    sqliteF
af10: 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ree(zMasterJourn
af20: 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28  al);.  }  .  if(
af30: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a   master_open ){.
af40: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
af50: 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 7d  se(&master);.  }
af60: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
af70: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  ..static void pa
af80: 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63  ger_truncate_cac
af90: 68 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  he(Pager *pPager
afa0: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  );../*.** Trunca
afb0: 74 65 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65  te the main file
afc0: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 70 61   of the given pa
afd0: 67 65 72 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ger to the numbe
afe0: 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e  r of pages.** in
aff0: 64 69 63 61 74 65 64 2e 20 41 6c 73 6f 20 74 72  dicated. Also tr
b000: 75 6e 63 61 74 65 20 74 68 65 20 63 61 63 68 65  uncate the cache
b010: 64 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  d representation
b020: 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f   of the file..*/
b030: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
b040: 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
b050: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50   *pPager, int nP
b060: 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
b070: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
b080: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
b090: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
b0a0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
b0b0: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
b0c0: 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
b0d0: 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34  r->pageSize*(i64
b0e0: 29 6e 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 69  )nPage);.  }.  i
b0f0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
b100: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
b110: 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  dbSize = nPage;.
b120: 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61      pager_trunca
b130: 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29  te_cache(pPager)
b140: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
b150: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
b160: 74 68 65 20 73 65 63 74 6f 72 53 69 7a 65 20 66  the sectorSize f
b170: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
b180: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  er..**.** The se
b190: 63 74 6f 72 20 73 69 7a 65 20 69 73 20 74 68 65  ctor size is the
b1a0: 20 6c 61 72 67 65 72 20 6f 66 20 74 68 65 20 73   larger of the s
b1b0: 65 63 74 6f 72 20 73 69 7a 65 20 72 65 70 6f 72  ector size repor
b1c0: 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65  ted.** by sqlite
b1d0: 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20  3OsSectorSize() 
b1e0: 61 6e 64 20 74 68 65 20 70 61 67 65 53 69 7a 65  and the pageSize
b1f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b200: 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50   setSectorSize(P
b210: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
b220: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
b230: 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  ize = sqlite3OsS
b240: 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
b250: 2d 3e 66 64 29 3b 0a 20 20 69 66 28 20 70 50 61  ->fd);.  if( pPa
b260: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c  ger->sectorSize<
b270: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
b280: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
b290: 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 70 50 61  sectorSize = pPa
b2a0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
b2b0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79   }.}../*.** Play
b2c0: 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  back the journal
b2d0: 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72   and thus restor
b2e0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
b2f0: 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74  ile to.** the st
b300: 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65  ate it was in be
b310: 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20  fore we started 
b320: 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20  making changes. 
b330: 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72   .**.** The jour
b340: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  nal file format 
b350: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a  is as follows: .
b360: 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79  **.**  (1)  8 by
b370: 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f  te prefix.  A co
b380: 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61  py of aJournalMa
b390: 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20  gic[]..**  (2)  
b3a0: 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
b3b0: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
b3c0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
b3d0: 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
b3e0: 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20  rds.**       in 
b3f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66  the journal.  If
b400: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30   this value is 0
b410: 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
b420: 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20  compute the.**  
b430: 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70       number of p
b440: 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  age records from
b450: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a   the journal siz
b460: 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79  e..**  (3)  4 by
b470: 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
b480: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
b490: 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  he initial value
b4a0: 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20   for the .**    
b4b0: 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73     sanity checks
b4c0: 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62  um..**  (4)  4 b
b4d0: 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
b4e0: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
b4f0: 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e  of pages to trun
b500: 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  cate the.**     
b510: 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75    database to du
b520: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
b530: 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65  .**  (5)  4 byte
b540: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
b550: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
b560: 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
b570: 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ter journal.**  
b580: 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20       name.  The 
b590: 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72  value may be zer
b5a0: 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68 61 74  o (indicate that
b5b0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73   there is no mas
b5c0: 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75  ter.**       jou
b5d0: 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36 29 20 20  rnal.).**  (6)  
b5e0: 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d  N bytes of the m
b5f0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
b600: 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69  me.  The name wi
b610: 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e  ll be nul-termin
b620: 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e  ated.**       an
b630: 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74  d might be short
b640: 65 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75  er than the valu
b650: 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e  e read from (5).
b660: 20 20 49 66 20 74 68 65 20 66 69 72 73 74 20 62    If the first b
b670: 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20  yte.**       of 
b680: 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30  the name is \000
b690: 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
b6a0: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
b6b0: 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a  .  The master.**
b6c0: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e         journal n
b6d0: 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ame is stored in
b6e0: 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 37 29 20   UTF-8..**  (7) 
b6f0: 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61   Zero or more pa
b700: 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65  ges instances, e
b710: 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ach as follows:.
b720: 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
b730: 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  yte page number.
b740: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50  .**        +  pP
b750: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
b760: 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a  ytes of data..**
b770: 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
b780: 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a  e checksum.**.**
b790: 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f   When we speak o
b7a0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
b7b0: 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68  ader, we mean th
b7c0: 65 20 66 69 72 73 74 20 36 20 69 74 65 6d 73 20  e first 6 items 
b7d0: 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65  above..** Each e
b7e0: 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  ntry in the jour
b7f0: 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  nal is an instan
b800: 63 65 20 6f 66 20 74 68 65 20 37 74 68 20 69 74  ce of the 7th it
b810: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74  em..**.** Call t
b820: 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  he value from th
b830: 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20  e second bullet 
b840: 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73  "nRec".  nRec is
b850: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
b860: 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74  * valid page ent
b870: 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ries in the jour
b880: 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61  nal.  In most ca
b890: 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d  ses, you can com
b8a0: 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75  pute the.** valu
b8b0: 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74  e of nRec from t
b8c0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
b8d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75  ournal file.  Bu
b8e0: 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20  t if a power.** 
b8f0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
b900: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
b910: 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69  al was being wri
b920: 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62  tten, it could b
b930: 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68  e the.** case th
b940: 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  at the size of t
b950: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
b960: 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e  had already been
b970: 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a   increased but.*
b980: 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72  * the extra entr
b990: 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ies had not yet 
b9a0: 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74  made it safely t
b9b0: 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68  o disk.  In such
b9c0: 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20   a case,.** the 
b9d0: 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f  value of nRec co
b9e0: 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mputed from the 
b9f0: 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20  file size would 
ba00: 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46  be too large.  F
ba10: 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f  or.** that reaso
ba20: 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  n, we always use
ba30: 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
ba40: 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a  in the header..*
ba50: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63  *.** If the nRec
ba60: 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
ba70: 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68  ffff it means th
ba80: 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62  at nRec should b
ba90: 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72  e computed.** fr
baa0: 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
bab0: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73  .  This value is
bac0: 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75   used when the u
bad0: 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a  ser selects the.
bae0: 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f  ** no-sync optio
baf0: 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  n for the journa
bb00: 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c  l.  A power fail
bb10: 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  ure could lead t
bb20: 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20  o corruption.** 
bb30: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42  in this case.  B
bb40: 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69  ut for things li
bb50: 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ke temporary tab
bb60: 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62  le (which will b
bb70: 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65  e.** deleted whe
bb80: 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72  n the power is r
bb90: 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27  estored) we don'
bba0: 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20  t care.  .**.** 
bbb0: 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
bbc0: 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  ed as the journa
bbd0: 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20  l file is not a 
bbe0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a  well-formed.** j
bbf0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
bc00: 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f   all pages up to
bc10: 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75   the first corru
bc20: 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f  pted page are ro
bc30: 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72  lled.** back (or
bc40: 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65   no pages if the
bc50: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
bc60: 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54  is corrupted). T
bc70: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
bc80: 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74  ** is then delet
bc90: 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
bca0: 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20   returned, just 
bcb0: 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74  as if no corrupt
bcc0: 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20  ion had.** been 
bcd0: 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a  encountered..**.
bce0: 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20  ** If an I/O or 
bcf0: 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f  malloc() error o
bd00: 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e  ccurs, the journ
bd10: 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64  al-file is not d
bd20: 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e  eleted.** and an
bd30: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
bd40: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
bd50: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
bd60: 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
bd70: 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b  ger, int isHot){
bd80: 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
bd90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
bda0: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
bdb0: 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
bdc0: 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20   */.  u32 nRec; 
bdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bde0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f  * Number of Reco
bdf0: 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  rds in the journ
be00: 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  al */.  int i;  
be10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be20: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
be30: 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20   */.  Pgno mxPg 
be40: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
be50: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72  * Size of the or
be60: 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70  iginal file in p
be70: 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ages */.  int rc
be80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
be90: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
bea0: 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
beb0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  e */.  char *zMa
bec0: 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ster = 0;       
bed0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65  /* Name of maste
bee0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
bef0: 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46  f any */..  /* F
bf00: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
bf10: 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
bf20: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
bf30: 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20  Abort early if. 
bf40: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
bf50: 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20  is empty..  */. 
bf60: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
bf70: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
bf80: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
bf90: 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
bfa0: 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69  >jfd, &szJ);.  i
bfb0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
bfc0: 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20   || szJ==0 ){.  
bfd0: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
bfe0: 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ack;.  }..  /* R
bff0: 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ead the master j
c000: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d  ournal name from
c010: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66   the journal, if
c020: 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a   it is present..
c030: 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72    ** If a master
c040: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
c050: 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
c060: 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73   but the file is
c070: 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e   not.  ** presen
c080: 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20  t on disk, then 
c090: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  the journal is n
c0a0: 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20  ot hot and does 
c0b0: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20  not need to be. 
c0c0: 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   ** played back.
c0d0: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61  .  */.  rc = rea
c0e0: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
c0f0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61  Pager->jfd, &zMa
c100: 73 74 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  ster);.  assert(
c110: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
c120: 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   );.  if( rc!=SQ
c130: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73  LITE_OK || (zMas
c140: 74 65 72 20 26 26 20 21 73 71 6c 69 74 65 33 4f  ter && !sqlite3O
c150: 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4d 61 73  sFileExists(zMas
c160: 74 65 72 29 29 20 29 7b 0a 20 20 20 20 73 71 6c  ter)) ){.    sql
c170: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29  iteFree(zMaster)
c180: 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
c190: 30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  0;.    if( rc==S
c1a0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20  QLITE_DONE ) rc 
c1b0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
c1c0: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
c1d0: 63 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ck;.  }.  sqlite
c1e0: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
c1f0: 6a 66 64 2c 20 30 29 3b 0a 20 20 70 50 61 67 65  jfd, 0);.  pPage
c200: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
c210: 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  0;..  /* This lo
c220: 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69  op terminates ei
c230: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 72 65  ther when the re
c240: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63  adJournalHdr() c
c250: 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a  all returns.  **
c260: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
c270: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
c280: 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  rs. */.  while( 
c290: 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  1 ){..    /* Rea
c2a0: 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  d the next journ
c2b0: 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74  al header from t
c2c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
c2d0: 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20    If there are. 
c2e0: 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68     ** not enough
c2f0: 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74   bytes left in t
c300: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c310: 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68  for a complete h
c320: 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a  eader, or.    **
c330: 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64   it is corrupted
c340: 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73  , then a process
c350: 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20   must of failed 
c360: 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74  while writing it
c370: 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e  ..    ** This in
c380: 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20  dicates nothing 
c390: 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65  more needs to be
c3a0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
c3b0: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65    */.    rc = re
c3c0: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
c3d0: 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c  ger, szJ, &nRec,
c3e0: 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28   &mxPg);.    if(
c3f0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c400: 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  { .      if( rc=
c410: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
c420: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
c430: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
c440: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
c450: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a  layback;.    }..
c460: 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
c470: 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
c480: 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  en this journal 
c490: 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
c4a0: 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
c4b0: 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  working in no-sy
c4c0: 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65  nc mode. This me
c4d0: 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73  ans that the res
c4e0: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
c4f0: 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e  .    ** file con
c500: 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20  sists of pages, 
c510: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
c520: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
c530: 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a  s. Compute.    *
c540: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
c550: 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69  Rec based on thi
c560: 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20  s assumption..  
c570: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
c580: 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b  c==0xffffffff ){
c590: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
c5a0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
c5b0: 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
c5c0: 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  Z(pPager) );.   
c5d0: 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d     nRec = (szJ -
c5e0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
c5f0: 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c  pPager))/JOURNAL
c600: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
c610: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
c620: 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74   nRec is 0 and t
c630: 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  his rollback is 
c640: 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
c650: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73   created by this
c660: 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 2e  .    ** process.
c670: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
c680: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  e rest of the jo
c690: 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 73 69  urnal file consi
c6a0: 73 74 73 20 6f 66 0a 20 20 20 20 2a 2a 20 6a 6f  sts of.    ** jo
c6b0: 75 72 6e 61 6c 6c 65 64 20 63 6f 70 69 65 73 20  urnalled copies 
c6c0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 6e 65  of pages that ne
c6d0: 65 64 20 74 6f 20 62 65 20 72 65 61 64 20 62 61  ed to be read ba
c6e0: 63 6b 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ck into the cach
c6f0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
c700: 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73  ( nRec==0 && !is
c710: 48 6f 74 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  Hot ){.      nRe
c720: 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65  c = (szJ - pPage
c730: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f  r->journalOff) /
c740: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
c750: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  Pager);.    }.. 
c760: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
c770: 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65   the first heade
c780: 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  r read from the 
c790: 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74  journal, truncat
c7a0: 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
c7b0: 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20  abase file back 
c7c0: 74 6f 20 69 74 27 73 20 6f 72 69 67 69 6e 61 6c  to it's original
c7d0: 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
c7e0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
c7f0: 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
c800: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
c810: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
c820: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
c830: 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20  ager, mxPg);.   
c840: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
c850: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
c860: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
c870: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
c880: 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72  ..    /* Copy or
c890: 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
c8a0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
c8b0: 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
c8c0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
c8d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
c8e0: 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b  i=0; i<nRec; i++
c8f0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
c900: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
c910: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  _page(pPager, pP
c920: 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20  ager->jfd, 1);. 
c930: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
c940: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
c950: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c960: 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
c970: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
c980: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  K;.          pPa
c990: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
c9a0: 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20  = szJ;.         
c9b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
c9c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
c9d0: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
c9e0: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
c9f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
ca00: 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f    /*NOTREACHED*/
ca10: 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a  .  assert( 0 );.
ca20: 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  .end_playback:. 
ca30: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
ca40: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
ca50: 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
ca60: 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  tion(pPager);.  
ca70: 7d 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 20  }.  if( zMaster 
ca80: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
ca90: 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20  re was a master 
caa0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73  journal and this
cab0: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
cac0: 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20  turn success,.  
cad0: 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69    ** see if it i
cae0: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
caf0: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
cb00: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a  journal..    */.
cb10: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
cb20: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
cb30: 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  c = pager_delmas
cb40: 74 65 72 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ter(zMaster);.  
cb50: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72    }.    sqliteFr
cb60: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d  ee(zMaster);.  }
cb70: 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72  ..  /* The Pager
cb80: 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
cb90: 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65  able may have be
cba0: 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65  en updated while
cbb0: 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61   rolling.  ** ba
cbc0: 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65  ck a journal cre
cbd0: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
cbe0: 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65  s with a differe
cbf0: 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20  nt sector size. 
cc00: 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74   ** value. Reset
cc10: 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65   it to the corre
cc20: 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  ct value for thi
cc30: 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a  s process..  */.
cc40: 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
cc50: 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
cc60: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
cc70: 6c 61 79 62 61 63 6b 20 74 68 65 20 73 74 61 74  layback the stat
cc80: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ement journal..*
cc90: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 69 6d  *.** This is sim
cca0: 69 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e 67 20  ilar to playing 
ccb0: 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  back the transac
ccc0: 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74  tion journal but
ccd0: 20 77 69 74 68 0a 2a 2a 20 61 20 66 65 77 20 65   with.** a few e
cce0: 78 74 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a  xtra twists..**.
ccf0: 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 20 6e  **    (1)  The n
cd00: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
cd10: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
cd20: 69 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ile at the start
cd30: 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 74   of.**         t
cd40: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
cd50: 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72  stored in pPager
cd60: 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20  ->stmtSize, not 
cd70: 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  in the.**       
cd80: 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    journal file i
cd90: 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  tself..**.**    
cda0: 28 32 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e  (2)  In addition
cdb0: 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   to playing back
cdc0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
cdd0: 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20  ournal, also.** 
cde0: 20 20 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b          playback
cdf0: 20 61 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68   all pages of th
ce00: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
ce10: 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a  urnal beginning.
ce20: 2a 2a 20 20 20 20 20 20 20 20 20 61 74 20 6f 66  **         at of
ce30: 66 73 65 74 20 70 50 61 67 65 72 2d 3e 73 74 6d  fset pPager->stm
ce40: 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  tJSize..*/.stati
ce50: 63 20 69 6e 74 20 70 61 67 65 72 5f 73 74 6d 74  c int pager_stmt
ce60: 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20  _playback(Pager 
ce70: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
ce80: 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
ce90: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
cea0: 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c  the full journal
ceb0: 20 2a 2f 0a 20 20 69 36 34 20 68 64 72 4f 66 66   */.  i64 hdrOff
cec0: 3b 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  ;.  int nRec;   
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cee0: 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64  Number of Record
cef0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  s */.  int i;   
cf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf10: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
cf20: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
cf30: 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ = pPager->jo
cf40: 75 72 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e 64 65  urnalOff;.#ifnde
cf50: 66 20 4e 44 45 42 55 47 20 0a 20 20 7b 0a 20 20  f NDEBUG .  {.  
cf60: 20 20 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20 20    i64 os_szJ;.  
cf70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
cf80: 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
cf90: 3e 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a  >jfd, &os_szJ);.
cfa0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
cfb0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
cfc0: 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  c;.    assert( s
cfd0: 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20  zJ==os_szJ );.  
cfe0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53  }.#endif..  /* S
cff0: 65 74 20 68 64 72 4f 66 66 20 74 6f 20 62 65 20  et hdrOff to be 
d000: 74 68 65 20 6f 66 66 73 65 74 20 6a 75 73 74 20  the offset just 
d010: 61 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66  after the end of
d020: 20 74 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61   the last journa
d030: 6c 0a 20 20 2a 2a 20 70 61 67 65 20 77 72 69 74  l.  ** page writ
d040: 74 65 6e 20 62 65 66 6f 72 65 20 74 68 65 20 66  ten before the f
d050: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
d060: 64 65 72 20 66 6f 72 20 74 68 69 73 20 73 74 61  der for this sta
d070: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e  tement.  ** tran
d080: 73 61 63 74 69 6f 6e 20 77 61 73 20 77 72 69 74  saction was writ
d090: 74 65 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64 20  ten, or the end 
d0a0: 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66 20 6e  of the file if n
d0b0: 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68  o journal.  ** h
d0c0: 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65  eader was writte
d0d0: 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66  n..  */.  hdrOff
d0e0: 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48   = pPager->stmtH
d0f0: 64 72 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28  drOff;.  assert(
d100: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
d110: 63 20 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a  c || !hdrOff );.
d120: 20 20 69 66 28 20 21 68 64 72 4f 66 66 20 29 7b    if( !hdrOff ){
d130: 0a 20 20 20 20 68 64 72 4f 66 66 20 3d 20 73 7a  .    hdrOff = sz
d140: 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54  J;.  }.  .  /* T
d150: 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61  runcate the data
d160: 62 61 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73  base back to its
d170: 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a   original size..
d180: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65    */.  rc = page
d190: 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
d1a0: 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  r, pPager->stmtS
d1b0: 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ize);.  assert( 
d1c0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
d1d0: 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a  AGER_SHARED );..
d1e0: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
d1f0: 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
d200: 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74   are in the stat
d210: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20  ement journal.. 
d220: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
d230: 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
d240: 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
d250: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69  alOpen );.  sqli
d260: 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
d270: 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52  ->stfd, 0);.  nR
d280: 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ec = pPager->stm
d290: 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43  tNRec;.  .  /* C
d2a0: 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
d2b0: 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74  es out of the st
d2c0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
d2d0: 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
d2e0: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
d2f0: 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74  file.  Note that
d300: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
d310: 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65  ournal omits che
d320: 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a  cksums from.  **
d330: 20 65 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e   each record sin
d340: 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65  ce power-failure
d350: 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74   recovery is not
d360: 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74   important to st
d370: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75  atement.  ** jou
d380: 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  rnals..  */.  fo
d390: 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30  r(i=nRec-1; i>=0
d3a0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d  ; i--){.    rc =
d3b0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
d3c0: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
d3d0: 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30   pPager->stfd, 0
d3e0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
d3f0: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
d400: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
d410: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
d420: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
d430: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
d440: 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73 20  roll some pages 
d450: 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 74 72  back from the tr
d460: 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
d470: 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a 53 69  l. Pager.stmtJSi
d480: 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74 68 65 20  ze.  ** was the 
d490: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
d4a0: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 74 68  nal file when th
d4b0: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  is statement was
d4c0: 20 73 74 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a   started, so.  *
d4d0: 2a 20 65 76 65 72 79 74 68 69 6e 67 20 61 66 74  * everything aft
d4e0: 65 72 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  er that needs to
d4f0: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   be rolled back,
d500: 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65   either into the
d510: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20  .  ** database, 
d520: 74 68 65 20 6d 65 6d 6f 72 79 20 63 61 63 68 65  the memory cache
d530: 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a  , or both..  **.
d540: 20 20 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f    ** If it is no
d550: 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61 67  t zero, then Pag
d560: 65 72 2e 73 74 6d 74 48 64 72 4f 66 66 20 69 73  er.stmtHdrOff is
d570: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
d580: 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
d590: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
d5a0: 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65  al header writte
d5b0: 6e 20 64 75 72 69 6e 67 20 74 68 69 73 20 73 74  n during this st
d5c0: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
d5d0: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ion..  */.  rc =
d5e0: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
d5f0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
d600: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a  er->stmtJSize);.
d610: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d620: 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
d630: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
d640: 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  k;.  }.  pPager-
d650: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50  >journalOff = pP
d660: 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b  ager->stmtJSize;
d670: 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  .  pPager->cksum
d680: 49 6e 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73  Init = pPager->s
d690: 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 77 68 69 6c  tmtCksum;.  whil
d6a0: 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  e( pPager->journ
d6b0: 61 6c 4f 66 66 20 3c 20 68 64 72 4f 66 66 20 29  alOff < hdrOff )
d6c0: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
d6d0: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
d6e0: 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  ge(pPager, pPage
d6f0: 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20  r->jfd, 1);.    
d700: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
d710: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69  TE_DONE );.    i
d720: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
d730: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74   ) goto end_stmt
d740: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
d750: 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d    while( pPager-
d760: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a  >journalOff < sz
d770: 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4a 52  J ){.    u32 nJR
d780: 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ec;         /* N
d790: 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c  umber of Journal
d7a0: 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20   Records */.    
d7b0: 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72  u32 dummy;.    r
d7c0: 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
d7d0: 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20  dr(pPager, szJ, 
d7e0: 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b  &nJRec, &dummy);
d7f0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
d800: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
d810: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
d820: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20  TE_DONE );.     
d830: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
d840: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20  layback;.    }. 
d850: 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20     if( nJRec==0 
d860: 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d  ){.      nJRec =
d870: 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e   (szJ - pPager->
d880: 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70  journalOff) / (p
d890: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
d8a0: 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  8);.    }.    fo
d8b0: 72 28 69 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d  r(i=nJRec-1; i>=
d8c0: 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0 && pPager->jou
d8d0: 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69  rnalOff < szJ; i
d8e0: 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  --){.      rc = 
d8f0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
d900: 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
d910: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b  pPager->jfd, 1);
d920: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
d930: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
d940: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
d950: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
d960: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
d970: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ck;.    }.  }.. 
d980: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d990: 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e  Off = szJ;.  .en
d9a0: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a  d_stmt_playback:
d9b0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
d9c0: 45 5f 4f 4b 29 20 7b 0a 20 20 20 20 70 50 61 67  E_OK) {.    pPag
d9d0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
d9e0: 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67   szJ;.    /* pag
d9f0: 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28  er_reload_cache(
da00: 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a  pPager); */.  }.
da10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
da20: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
da30: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
da40: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
da50: 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f  es that are allo
da60: 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wed..*/.void sql
da70: 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
da80: 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
da90: 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
daa0: 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 31  {.  if( mxPage>1
dab0: 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
dac0: 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65  >mxPage = mxPage
dad0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
dae0: 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20  Pager->mxPage = 
daf0: 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  10;.  }.}../*.**
db00: 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75   Adjust the robu
db10: 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61  stness of the da
db20: 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65  tabase to damage
db30: 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
db40: 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66  es.** or power f
db50: 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67  ailures by chang
db60: 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
db70: 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20  f syncs()s when 
db80: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72  writing.** the r
db90: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
dba0: 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65    There are thre
dbb0: 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20  e levels:.**.** 
dbc0: 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c     OFF       sql
dbd0: 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20  ite3OsSync() is 
dbe0: 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54  never called.  T
dbf0: 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
dc00: 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
dc10: 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79     for temporary
dc20: 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66   and transient f
dc30: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e  iles..**.**    N
dc40: 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75  ORMAL    The jou
dc50: 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f  rnal is synced o
dc60: 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  nce before write
dc70: 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
dc80: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
dc90: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69  atabase.  This i
dca0: 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75  s normally adequ
dcb0: 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20  ate protection, 
dcc0: 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  but.**          
dcd0: 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65      it is theore
dce0: 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  tically possible
dcf0: 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e  , though very un
dd00: 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20  likely,.**      
dd10: 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20          that an 
dd20: 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72  inopertune power
dd30: 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
dd40: 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  eave the journal
dd50: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
dd60: 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63   in a state whic
dd70: 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61  h would cause da
dd80: 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
dd90: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
dda0: 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20       when it is 
ddb0: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
ddc0: 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20  **    FULL      
ddd0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
dde0: 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f  ynced twice befo
ddf0: 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
de00: 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
de10: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
de20: 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74  (with some addit
de30: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
de40: 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65  n - the nRec fie
de50: 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ld.**           
de60: 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61     of the journa
de70: 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67  l header - being
de80: 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77   written in betw
de90: 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20  een the two.**  
dea0: 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63              sync
deb0: 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d  s).  If we assum
dec0: 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61  e that writing a
ded0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
dee0: 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
def0: 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74  tor is atomic, t
df00: 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72  hen this mode pr
df10: 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20  ovides.**       
df20: 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65         assurance
df30: 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
df40: 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f  l will not be co
df50: 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a  rrupted to the.*
df60: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  *              p
df70: 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20  oint of causing 
df80: 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
df90: 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f  tabase during ro
dfa0: 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75  llback..**.** Nu
dfb0: 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73  meric values ass
dfc0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
dfd0: 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46  se states are OF
dfe0: 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a  F==1, NORMAL=2,.
dff0: 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a  ** and FULL=3..*
e000: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
e010: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
e020: 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  MAS.void sqlite3
e030: 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65  PagerSetSafetyLe
e040: 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  vel(Pager *pPage
e050: 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e  r, int level, in
e060: 74 20 66 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20  t full_fsync){. 
e070: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
e080: 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70  =  level==1 || p
e090: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
e0a0: 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
e0b0: 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26  ync = level==3 &
e0c0: 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
e0d0: 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  ile;.  pPager->f
e0e0: 75 6c 6c 5f 66 73 79 6e 63 20 3d 20 66 75 6c 6c  ull_fsync = full
e0f0: 5f 66 73 79 6e 63 3b 0a 20 20 69 66 28 20 70 50  _fsync;.  if( pP
e100: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70  ager->noSync ) p
e110: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
e120: 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  = 0;.}.#endif../
e130: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
e140: 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ng global variab
e150: 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  le is incremente
e160: 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c  d whenever the l
e170: 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70  ibrary.** attemp
e180: 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  ts to open a tem
e190: 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68  porary file.  Th
e1a0: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
e1b0: 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65  s used for.** te
e1c0: 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
e1d0: 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69  is only.  .*/.#i
e1e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
e1f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
e200: 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b  ntemp_count = 0;
e210: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
e220: 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
e230: 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 72 69  file. .**.** Wri
e240: 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  te the file desc
e250: 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e  riptor into *fd.
e260: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
e270: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
e280: 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65   some.** other e
e290: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
e2a0: 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fail..**.** The 
e2b0: 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
e2c0: 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65  cally delete the
e2d0: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
e2e0: 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63 6c  when it is.** cl
e2f0: 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  osed..*/.static 
e300: 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
e310: 4f 70 65 6e 74 65 6d 70 28 4f 73 46 69 6c 65 20  Opentemp(OsFile 
e320: 2a 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 63 6e  **pFd){.  int cn
e330: 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b  t = 8;.  int rc;
e340: 0a 20 20 63 68 61 72 20 7a 46 69 6c 65 5b 53 51  .  char zFile[SQ
e350: 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49  LITE_TEMPNAME_SI
e360: 5a 45 5d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  ZE];..#ifdef SQL
e370: 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
e380: 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
e390: 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f  t++;  /* Used fo
e3a0: 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
e3b0: 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23  alysis only */.#
e3c0: 65 6e 64 69 66 0a 20 20 64 6f 7b 0a 20 20 20 20  endif.  do{.    
e3d0: 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74  cnt--;.    sqlit
e3e0: 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65  e3OsTempFileName
e3f0: 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72 63 20  (zFile);.    rc 
e400: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45  = sqlite3OsOpenE
e410: 78 63 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c 20  xclusive(zFile, 
e420: 70 46 64 2c 20 31 29 3b 0a 20 20 20 20 61 73 73  pFd, 1);.    ass
e430: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
e440: 4f 4b 20 7c 7c 20 2a 70 46 64 20 29 3b 0a 20 20  OK || *pFd );.  
e450: 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30 20 26 26  }while( cnt>0 &&
e460: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
e470: 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  & rc!=SQLITE_NOM
e480: 45 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  EM );.  return r
e490: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
e4a0: 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 63 61  te a new page ca
e4b0: 63 68 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f  che and put a po
e4c0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
e4d0: 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61  e cache in *ppPa
e4e0: 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ger..** The file
e4f0: 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65   to be cached ne
e500: 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54  ed not exist.  T
e510: 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c  he file is not l
e520: 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74  ocked until.** t
e530: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
e540: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
e550: 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68  () and is only h
e560: 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74  eld open until t
e570: 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20  he.** last page 
e580: 69 73 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  is released usin
e590: 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  g sqlite3PagerUn
e5a0: 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ref()..**.** If 
e5b0: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
e5c0: 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c  L then a randoml
e5d0: 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72  y-named temporar
e5e0: 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  y file is create
e5f0: 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73  d.** and used as
e600: 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
e610: 63 61 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c  cached.  The fil
e620: 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65  e will be delete
e630: 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  d.** automatical
e640: 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  ly when it is cl
e650: 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  osed..**.** If z
e660: 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
e670: 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20  mory:" then all 
e680: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68  information is h
e690: 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a  eld in cache..**
e6a0: 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69   It is never wri
e6b0: 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54  tten to disk.  T
e6c0: 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
e6d0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a  to implement an.
e6e0: 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  ** in-memory dat
e6f0: 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  abase..*/.int sq
e700: 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a  lite3PagerOpen(.
e710: 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65    Pager **ppPage
e720: 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  r,         /* Re
e730: 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73  turn the Pager s
e740: 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
e750: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
e760: 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e  Filename,   /* N
e770: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
e780: 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  ase file to open
e790: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
e7a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
e7b0: 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70  * Extra bytes ap
e7c0: 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d  pend to each in-
e7d0: 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
e7e0: 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
e7f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
e800: 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74  gs controlling t
e810: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20  his file */.){. 
e820: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
e830: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c   0;.  char *zFul
e840: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20  lPathname = 0;. 
e850: 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 20 20 2f   int nameLen;  /
e860: 2a 20 43 6f 6d 70 69 6c 65 72 20 69 73 20 77 72  * Compiler is wr
e870: 6f 6e 67 2e 20 54 68 69 73 20 69 73 20 61 6c 77  ong. This is alw
e880: 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ays initialized 
e890: 62 65 66 6f 72 65 20 75 73 65 20 2a 2f 0a 20 20  before use */.  
e8a0: 4f 73 46 69 6c 65 20 2a 66 64 20 3d 20 30 3b 0a  OsFile *fd = 0;.
e8b0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
e8c0: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  E_OK;.  int i;. 
e8d0: 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20   int tempFile = 
e8e0: 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d  0;.  int memDb =
e8f0: 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e   0;.  int readOn
e900: 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 75 73  ly = 0;.  int us
e910: 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67  eJournal = (flag
e920: 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a  s & PAGER_OMIT_J
e930: 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e  OURNAL)==0;.  in
e940: 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28  t noReadlock = (
e950: 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f  flags & PAGER_NO
e960: 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20  _READLOCK)!=0;. 
e970: 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49   char zTemp[SQLI
e980: 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45  TE_TEMPNAME_SIZE
e990: 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ];.#ifdef SQLITE
e9a0: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
e9b0: 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41  ANAGEMENT.  /* A
e9c0: 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74   malloc() cannot
e9d0: 20 66 61 69 6c 20 69 6e 20 73 71 6c 69 74 65 33   fail in sqlite3
e9e0: 54 68 72 65 61 64 44 61 74 61 28 29 20 61 73 20  ThreadData() as 
e9f0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c  one or more call
ea00: 73 20 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f  s to .  ** mallo
ea10: 63 28 29 20 6d 75 73 74 20 68 61 76 65 20 61 6c  c() must have al
ea20: 72 65 61 64 79 20 62 65 65 6e 20 6d 61 64 65 20  ready been made 
ea30: 62 79 20 74 68 69 73 20 74 68 72 65 61 64 20 62  by this thread b
ea40: 65 66 6f 72 65 20 69 74 20 67 65 74 73 0a 20 20  efore it gets.  
ea50: 2a 2a 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ** to this point
ea60: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65  . This means the
ea70: 20 54 68 72 65 61 64 44 61 74 61 20 6d 75 73 74   ThreadData must
ea80: 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63   have been alloc
ea90: 61 74 65 64 20 61 6c 72 65 61 64 79 0a 20 20 2a  ated already.  *
eaa0: 2a 20 73 6f 20 74 68 61 74 20 54 68 72 65 61 64  * so that Thread
eab0: 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20  Data.nAlloc can 
eac0: 62 65 20 73 65 74 2e 20 49 74 20 77 6f 75 6c 64  be set. It would
ead0: 20 62 65 20 6e 69 63 65 20 74 6f 20 61 73 73 65   be nice to asse
eae0: 72 74 0a 20 20 2a 2a 20 74 68 61 74 20 54 68 72  rt.  ** that Thr
eaf0: 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 69  eadData.nAlloc i
eb00: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 62 75 74 20  s non-zero, but 
eb10: 61 6c 61 73 20 74 68 69 73 20 62 72 65 61 6b 73  alas this breaks
eb20: 20 74 65 73 74 20 63 61 73 65 73 20 0a 20 20 2a   test cases .  *
eb30: 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 69 6e 76  * written to inv
eb40: 6f 6b 65 20 74 68 65 20 70 61 67 65 72 20 64 69  oke the pager di
eb50: 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 54  rectly..  */.  T
eb60: 68 72 65 61 64 44 61 74 61 20 2a 70 54 73 64 20  hreadData *pTsd 
eb70: 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  = sqlite3ThreadD
eb80: 61 74 61 28 29 3b 0a 20 20 61 73 73 65 72 74 28  ata();.  assert(
eb90: 20 70 54 73 64 20 29 3b 0a 23 65 6e 64 69 66 0a   pTsd );.#endif.
eba0: 0a 20 20 2f 2a 20 57 65 20 75 73 65 64 20 74 6f  .  /* We used to
ebb0: 20 74 65 73 74 20 69 66 20 6d 61 6c 6c 6f 63 28   test if malloc(
ebc0: 29 20 68 61 64 20 61 6c 72 65 61 64 79 20 66 61  ) had already fa
ebd0: 69 6c 65 64 20 62 65 66 6f 72 65 20 70 72 6f 63  iled before proc
ebe0: 65 65 64 69 6e 67 2e 20 0a 20 20 2a 2a 20 42 75  eeding. .  ** Bu
ebf0: 74 20 74 68 65 20 77 61 79 20 74 68 69 73 20 66  t the way this f
ec00: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
ec10: 69 6e 20 53 51 4c 69 74 65 20 6d 65 61 6e 73 20  in SQLite means 
ec20: 74 68 61 74 20 63 61 6e 20 6e 65 76 65 72 0a 20  that can never. 
ec30: 20 2a 2a 20 68 61 70 70 65 6e 2e 20 46 75 72 74   ** happen. Furt
ec40: 68 65 72 6d 6f 72 65 2c 20 69 66 20 74 68 65 20  hermore, if the 
ec50: 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c  malloc-failed fl
ec60: 61 67 20 69 73 20 61 6c 72 65 61 64 79 20 73 65  ag is already se
ec70: 74 2c 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20  t, .  ** either 
ec80: 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
ec90: 74 65 53 74 72 44 75 70 28 29 20 6f 72 20 73 71  teStrDup() or sq
eca0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 62 65 6c  liteMalloc() bel
ecb0: 6f 77 20 77 69 6c 6c 0a 20 20 2a 2a 20 66 61 69  ow will.  ** fai
ecc0: 6c 20 73 68 6f 72 74 6c 79 20 61 6e 64 20 53 51  l shortly and SQ
ecd0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 72 65 74 75 72  LITE_NOMEM retur
ece0: 6e 65 64 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2f  ned anyway..  */
ecf0: 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b  .  *ppPager = 0;
ed00: 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
ed10: 70 61 67 65 72 20 66 69 6c 65 20 61 6e 64 20 73  pager file and s
ed20: 65 74 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  et zFullPathname
ed30: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 6d 61 6c   to point at mal
ed40: 6c 6f 63 28 29 65 64 20 0a 20 20 2a 2a 20 6d 65  loc()ed .  ** me
ed50: 6d 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  mory containing 
ed60: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 66 69 6c  the complete fil
ed70: 65 6e 61 6d 65 20 28 69 2e 65 2e 20 69 6e 63 6c  ename (i.e. incl
ed80: 75 64 69 6e 67 20 74 68 65 20 64 69 72 65 63 74  uding the direct
ed90: 6f 72 79 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ory)..  */.  if(
eda0: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
edb0: 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23 69  ilename[0] ){.#i
edc0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
edd0: 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69  T_MEMORYDB.    i
ede0: 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e  f( strcmp(zFilen
edf0: 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d  ame,":memory:")=
ee00: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44  =0 ){.      memD
ee10: 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 46 75  b = 1;.      zFu
ee20: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
ee30: 69 74 65 53 74 72 44 75 70 28 22 22 29 3b 0a 20  iteStrDup("");. 
ee40: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
ee50: 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 46 75 6c      {.      zFul
ee60: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
ee70: 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
ee80: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
ee90: 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74      if( zFullPat
eea0: 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  hname ){.       
eeb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
eec0: 70 65 6e 52 65 61 64 57 72 69 74 65 28 7a 46 75  penReadWrite(zFu
eed0: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66 64 2c  llPathname, &fd,
eee0: 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20   &readOnly);.   
eef0: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
ef00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 66 64  =SQLITE_OK || fd
ef10: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
ef20: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
ef30: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
ef40: 4f 70 65 6e 74 65 6d 70 28 26 66 64 29 3b 0a 20  Opentemp(&fd);. 
ef50: 20 20 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70     sqlite3OsTemp
ef60: 46 69 6c 65 4e 61 6d 65 28 7a 54 65 6d 70 29 3b  FileName(zTemp);
ef70: 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  .    zFilename =
ef80: 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75 6c   zTemp;.    zFul
ef90: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
efa0: 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
efb0: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
efc0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
efd0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 74 65 6d  _OK ){.      tem
efe0: 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  pFile = 1;.    }
eff0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
f000: 61 74 65 20 74 68 65 20 50 61 67 65 72 20 73 74  ate the Pager st
f010: 72 75 63 74 75 72 65 2e 20 41 73 20 70 61 72 74  ructure. As part
f020: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 61 6c 6c   of the same all
f030: 6f 63 61 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74  ocation, allocat
f040: 65 0a 20 20 2a 2a 20 73 70 61 63 65 20 66 6f 72  e.  ** space for
f050: 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 73 20   the full paths 
f060: 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 64 69 72  of the file, dir
f070: 65 63 74 6f 72 79 20 61 6e 64 20 6a 6f 75 72 6e  ectory and journ
f080: 61 6c 20 0a 20 20 2a 2a 20 28 50 61 67 65 72 2e  al .  ** (Pager.
f090: 7a 46 69 6c 65 6e 61 6d 65 2c 20 50 61 67 65 72  zFilename, Pager
f0a0: 2e 7a 44 69 72 65 63 74 6f 72 79 20 61 6e 64 20  .zDirectory and 
f0b0: 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 29 2e  Pager.zJournal).
f0c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 75 6c  .  */.  if( zFul
f0d0: 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  lPathname ){.   
f0e0: 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c 65   nameLen = strle
f0f0: 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  n(zFullPathname)
f100: 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 73  ;.    pPager = s
f110: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
f120: 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20 6e  eof(*pPager) + n
f130: 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30 20 29 3b  ameLen*3 + 30 );
f140: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 20  .    if( pPager 
f150: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
f160: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
f170: 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 28 63  ->pTmpSpace = (c
f180: 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c  har *)sqliteMall
f190: 6f 63 52 61 77 28 53 51 4c 49 54 45 5f 44 45 46  ocRaw(SQLITE_DEF
f1a0: 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b  AULT_PAGE_SIZE);
f1b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
f1c0: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
f1d0: 63 75 72 65 64 20 69 6e 20 65 69 74 68 65 72 20  cured in either 
f1e0: 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62  of the blocks ab
f1f0: 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 6d 65  ove, free the me
f200: 6d 6f 72 79 20 0a 20 20 2a 2a 20 70 6f 69 6e 74  mory .  ** point
f210: 65 64 20 74 6f 20 62 79 20 7a 46 75 6c 6c 50 61  ed to by zFullPa
f220: 74 68 6e 61 6d 65 2c 20 66 72 65 65 20 74 68 65  thname, free the
f230: 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
f240: 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 0a   and close the .
f250: 20 20 2a 2a 20 66 69 6c 65 2e 20 53 69 6e 63 65    ** file. Since
f260: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
f270: 74 20 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 72  t allocated ther
f280: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
f290: 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79 20 50 61  set .  ** any Pa
f2a0: 67 65 72 2e 65 72 72 4d 61 73 6b 20 76 61 72 69  ger.errMask vari
f2b0: 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  ables..  */.  if
f2c0: 28 20 21 70 50 61 67 65 72 20 7c 7c 20 21 7a 46  ( !pPager || !zF
f2d0: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 7c 7c 20 21  ullPathname || !
f2e0: 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
f2f0: 65 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f  e || rc!=SQLITE_
f300: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
f310: 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20  3OsClose(&fd);. 
f320: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46     sqliteFree(zF
f330: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
f340: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
f350: 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
f360: 20 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   ((rc==SQLITE_OK
f370: 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72  )?SQLITE_NOMEM:r
f380: 63 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  c);.  }..  PAGER
f390: 54 52 41 43 45 33 28 22 4f 50 45 4e 20 25 64 20  TRACE3("OPEN %d 
f3a0: 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c  %s\n", FILEHANDL
f3b0: 45 49 44 28 66 64 29 2c 20 7a 46 75 6c 6c 50 61  EID(fd), zFullPa
f3c0: 74 68 6e 61 6d 65 29 3b 0a 20 20 49 4f 54 52 41  thname);.  IOTRA
f3d0: 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c  CE(("OPEN %p %s\
f3e0: 6e 22 2c 20 70 50 61 67 65 72 2c 20 7a 46 75 6c  n", pPager, zFul
f3f0: 6c 50 61 74 68 6e 61 6d 65 29 29 0a 20 20 70 50  lPathname)).  pP
f400: 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  ager->zFilename 
f410: 3d 20 28 63 68 61 72 2a 29 26 70 50 61 67 65 72  = (char*)&pPager
f420: 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  [1];.  pPager->z
f430: 44 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61  Directory = &pPa
f440: 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e  ger->zFilename[n
f450: 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50 61  ameLen+1];.  pPa
f460: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20  ger->zJournal = 
f470: 26 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  &pPager->zDirect
f480: 6f 72 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a  ory[nameLen+1];.
f490: 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
f4a0: 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c  >zFilename, zFul
f4b0: 6c 50 61 74 68 6e 61 6d 65 2c 20 6e 61 6d 65 4c  lPathname, nameL
f4c0: 65 6e 2b 31 29 3b 0a 20 20 6d 65 6d 63 70 79 28  en+1);.  memcpy(
f4d0: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
f4e0: 72 79 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ry, zFullPathnam
f4f0: 65 2c 20 6e 61 6d 65 4c 65 6e 2b 31 29 3b 0a 0a  e, nameLen+1);..
f500: 20 20 66 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b    for(i=nameLen;
f510: 20 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e   i>0 && pPager->
f520: 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21  zDirectory[i-1]!
f530: 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69  ='/'; i--){}.  i
f540: 66 28 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d  f( i>0 ) pPager-
f550: 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d  >zDirectory[i-1]
f560: 20 3d 20 30 3b 0a 20 20 6d 65 6d 63 70 79 28 70   = 0;.  memcpy(p
f570: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
f580: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e   zFullPathname,n
f590: 61 6d 65 4c 65 6e 29 3b 0a 20 20 73 71 6c 69 74  ameLen);.  sqlit
f5a0: 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  eFree(zFullPathn
f5b0: 61 6d 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  ame);.  memcpy(&
f5c0: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
f5d0: 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75  [nameLen], "-jou
f5e0: 72 6e 61 6c 22 2c 73 69 7a 65 6f 66 28 22 2d 6a  rnal",sizeof("-j
f5f0: 6f 75 72 6e 61 6c 22 29 29 3b 0a 20 20 70 50 61  ournal"));.  pPa
f600: 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20  ger->fd = fd;.  
f610: 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  /* pPager->journ
f620: 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20  alOpen = 0; */. 
f630: 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
f640: 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c  nal = useJournal
f650: 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50   && !memDb;.  pP
f660: 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b  ager->noReadlock
f670: 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26   = noReadlock &&
f680: 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20   readOnly;.  /* 
f690: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
f6a0: 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
f6b0: 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
f6c0: 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
f6d0: 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a  ger->nRef = 0; *
f6e0: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
f6f0: 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20  ze = memDb-1;.  
f700: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
f710: 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
f720: 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 2f  T_PAGE_SIZE;.  /
f730: 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  * pPager->stmtSi
f740: 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
f750: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
f760: 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
f770: 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
f780: 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ; */.  pPager->m
f790: 78 50 61 67 65 20 3d 20 31 30 30 3b 0a 20 20 70  xPage = 100;.  p
f7a0: 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
f7b0: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
f7c0: 43 4f 55 4e 54 3b 0a 20 20 61 73 73 65 72 74 28  COUNT;.  assert(
f7d0: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3d 3d 30   PAGER_UNLOCK==0
f7e0: 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   );.  /* pPager-
f7f0: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
f800: 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70  NLOCK; */.  /* p
f810: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d  Pager->errMask =
f820: 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
f830: 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70  >tempFile = temp
f840: 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20  File;.  assert( 
f850: 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
f860: 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
f870: 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  AL .          ||
f880: 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52   tempFile==PAGER
f890: 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
f8a0: 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  LUSIVE );.  asse
f8b0: 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
f8c0: 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d  GMODE_EXCLUSIVE=
f8d0: 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  =1 );.  pPager->
f8e0: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
f8f0: 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61  tempFile; .  pPa
f900: 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d  ger->memDb = mem
f910: 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65  Db;.  pPager->re
f920: 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c  adOnly = readOnl
f930: 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  y;.  /* pPager->
f940: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f  needSync = 0; */
f950: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  .  pPager->noSyn
f960: 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  c = pPager->temp
f970: 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72  File || !useJour
f980: 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  nal;.  pPager->f
f990: 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61 67 65  ullSync = (pPage
f9a0: 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a  r->noSync?0:1);.
f9b0: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
f9c0: 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  rst = 0; */.  /*
f9d0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
f9e0: 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20  ynced = 0; */.  
f9f0: 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  /* pPager->pLast
fa00: 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
fa10: 72 2d 3e 6e 45 78 74 72 61 20 3d 20 46 4f 52 43  r->nExtra = FORC
fa20: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74  E_ALIGNMENT(nExt
fa30: 72 61 29 3b 0a 20 20 61 73 73 65 72 74 28 66 64  ra);.  assert(fd
fa40: 7c 7c 6d 65 6d 44 62 29 3b 0a 20 20 69 66 28 20  ||memDb);.  if( 
fa50: 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73 65  !memDb ){.    se
fa60: 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
fa70: 65 72 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50  er);.  }.  /* pP
fa80: 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
fa90: 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  er = 0; */.  /* 
faa0: 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61  memset(pPager->a
fab0: 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
fac0: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b  pPager->aHash));
fad0: 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d   */.  *ppPager =
fae0: 20 70 50 61 67 65 72 3b 0a 23 69 66 64 65 66 20   pPager;.#ifdef 
faf0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
fb00: 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
fb10: 20 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 20    pPager->pNext 
fb20: 3d 20 70 54 73 64 2d 3e 70 50 61 67 65 72 3b 0a  = pTsd->pPager;.
fb30: 20 20 70 54 73 64 2d 3e 70 50 61 67 65 72 20 3d    pTsd->pPager =
fb40: 20 70 50 61 67 65 72 3b 0a 23 65 6e 64 69 66 0a   pPager;.#endif.
fb50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fb60: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
fb70: 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
fb80: 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  r function..*/.v
fb90: 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
fba0: 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 50  SetBusyhandler(P
fbb0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 42 75  ager *pPager, Bu
fbc0: 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79  syHandler *pBusy
fbd0: 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61 67  Handler){.  pPag
fbe0: 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
fbf0: 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 3b   = pBusyHandler;
fc00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
fc10: 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72  e destructor for
fc20: 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66   this pager.  If
fc30: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64   not NULL, the d
fc40: 65 73 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c  estructor is cal
fc50: 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  led.** when the 
fc60: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
fc70: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 72 65 61  on each page rea
fc80: 63 68 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20  ches zero.  The 
fc90: 64 65 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a  destructor can.*
fca0: 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65  * be used to cle
fcb0: 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f  an up informatio
fcc0: 6e 20 69 6e 20 74 68 65 20 65 78 74 72 61 20 73  n in the extra s
fcd0: 65 67 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20  egment appended 
fce0: 74 6f 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a  to each page..**
fcf0: 0a 2a 2a 20 54 68 65 20 64 65 73 74 72 75 63 74  .** The destruct
fd00: 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  or is not called
fd10: 20 61 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c   as a result sql
fd20: 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29  ite3PagerClose()
fd30: 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f  .  .** Destructo
fd40: 72 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c  rs are only call
fd50: 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 61 67  ed by sqlite3Pag
fd60: 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f  erUnref()..*/.vo
fd70: 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
fd80: 65 74 44 65 73 74 72 75 63 74 6f 72 28 50 61 67  etDestructor(Pag
fd90: 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64  er *pPager, void
fda0: 20 28 2a 78 44 65 73 63 29 28 44 62 50 61 67 65   (*xDesc)(DbPage
fdb0: 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65  *,int)){.  pPage
fdc0: 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d  r->xDestructor =
fdd0: 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   xDesc;.}../*.**
fde0: 20 53 65 74 20 74 68 65 20 72 65 69 6e 69 74 69   Set the reiniti
fdf0: 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20  alizer for this 
fe00: 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e  pager.  If not N
fe10: 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69  ULL, the reiniti
fe20: 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c  alizer.** is cal
fe30: 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e  led when the con
fe40: 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69  tent of a page i
fe50: 6e 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f  n cache is resto
fe60: 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
fe70: 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20  nal.** value as 
fe80: 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f  a result of a ro
fe90: 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c  llback.  The cal
fea0: 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69 67 68  lback gives high
feb0: 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a  er-level code.**
fec0: 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   an opportunity 
fed0: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 45  to restore the E
fee0: 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20  XTRA section to 
fef0: 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
ff00: 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20  estored.** page 
ff10: 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  data..*/.void sq
ff20: 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65 69  lite3PagerSetRei
ff30: 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  niter(Pager *pPa
ff40: 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69  ger, void (*xRei
ff50: 6e 69 74 29 28 44 62 50 61 67 65 2a 2c 69 6e 74  nit)(DbPage*,int
ff60: 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52  )){.  pPager->xR
ff70: 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69  einiter = xReini
ff80: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  t;.}../*.** Set 
ff90: 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 20 20  the page size.  
ffa0: 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 73  Return the new s
ffb0: 69 7a 65 2e 20 20 49 66 20 74 68 65 20 73 75 67  ize.  If the sug
ffc0: 67 65 73 74 20 6e 65 77 20 70 61 67 65 0a 2a 2a  gest new page.**
ffd0: 20 73 69 7a 65 20 69 73 20 69 6e 61 70 70 72 6f   size is inappro
ffe0: 70 72 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20  priate, then an 
fff0: 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67 65  alternative page
10000 20 73 69 7a 65 20 69 73 20 73 65 6c 65 63 74 65   size is selecte
10010 64 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 65  d.** and returne
10020 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
10030 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
10040 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
10050 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a   int pageSize){.
10060 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69    assert( pageSi
10070 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
10080 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
10090 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 69  PAGE_SIZE );.  i
100a0 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44  f( !pPager->memD
100b0 62 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65  b && pPager->nRe
100c0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70 61 67 65  f==0 ){.    page
100d0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
100e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67  .    pPager->pag
100f0 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
10100 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54  ;.    pPager->pT
10110 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65  mpSpace = sqlite
10120 33 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70  3ReallocOrFree(p
10130 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
10140 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d  , pageSize);.  }
10150 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
10160 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f  ->pageSize;.}../
10170 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
10180 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  set the maximum 
10190 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
101a0 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69 73  unt if mxPage is
101b0 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d   positive. .** M
101c0 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69  ake no changes i
101d0 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f  f mxPage is zero
101e0 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41   or negative.  A
101f0 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65 20  nd never reduce 
10200 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70  the.** maximum p
10210 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20  age count below 
10220 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
10230 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
10240 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ..**.** Regardle
10250 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ss of mxPage, re
10260 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
10270 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
10280 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
10290 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43  te3PagerMaxPageC
102a0 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
102b0 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
102c0 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20  .  if( mxPage>0 
102d0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
102e0 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a  xPgno = mxPage;.
102f0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67    }.  sqlite3Pag
10300 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
10310 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  er);.  return pP
10320 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a  ager->mxPgno;.}.
10330 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
10340 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74  wing set of rout
10350 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
10360 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d   disable the sim
10370 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72  ulated.** I/O er
10380 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20  ror mechanism.  
10390 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  These routines a
103a0 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64  re used to avoid
103b0 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72   simulated.** er
103c0 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77  rors in places w
103d0 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63  here we do not c
103e0 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73  are about errors
103f0 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d  ..**.** Unless -
10400 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69  DSQLITE_TEST=1 i
10410 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f  s used, these ro
10420 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e  utines are all n
10430 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e  o-ops.** and gen
10440 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a  erate no code..*
10450 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
10460 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20  TEST.extern int 
10470 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
10480 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e  _pending;.extern
10490 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
104a0 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69  error_hit;.stati
104b0 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b  c int saved_cnt;
104c0 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69  .void disable_si
104d0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
104e0 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64  s(void){.  saved
104f0 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69  _cnt = sqlite3_i
10500 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
10510 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
10520 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31  ror_pending = -1
10530 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f  ;.}.void enable_
10540 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
10550 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  ors(void){.  sql
10560 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
10570 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e  nding = saved_cn
10580 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  t;.}.#else.# def
10590 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ine disable_simu
105a0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
105b0 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c  ).# define enabl
105c0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
105d0 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a  rrors().#endif..
105e0 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66  /*.** Read the f
105f0 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f  irst N bytes fro
10600 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  m the beginning 
10610 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f  of the file into
10620 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20   memory.** that 
10630 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e  pDest points to.
10640 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72   .**.** No error
10650 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e   checking is don
10660 65 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 20  e. The rational 
10670 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74  for this is that
10680 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a   this function .
10690 2a 2a 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  ** may be called
106a0 20 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 6c   even if the fil
106b0 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
106c0 20 6f 72 20 63 6f 6e 74 61 69 6e 20 61 20 68 65   or contain a he
106d0 61 64 65 72 2e 20 49 6e 20 0a 2a 2a 20 74 68 65  ader. In .** the
106e0 73 65 20 63 61 73 65 73 20 73 71 6c 69 74 65 33  se cases sqlite3
106f0 4f 73 52 65 61 64 28 29 20 77 69 6c 6c 20 72 65  OsRead() will re
10700 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2c 20 74  turn an error, t
10710 6f 20 77 68 69 63 68 20 74 68 65 20 63 6f 72 72  o which the corr
10720 65 63 74 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 65  ect .** response
10730 20 69 73 20 74 6f 20 7a 65 72 6f 20 74 68 65 20   is to zero the 
10740 6d 65 6d 6f 72 79 20 61 74 20 70 44 65 73 74 20  memory at pDest 
10750 61 6e 64 20 63 6f 6e 74 69 6e 75 65 2e 20 20 41  and continue.  A
10760 20 72 65 61 6c 20 49 4f 20 65 72 72 6f 72 20 0a   real IO error .
10770 2a 2a 20 77 69 6c 6c 20 70 72 65 73 75 6d 61 62  ** will presumab
10780 6c 79 20 72 65 63 75 72 20 61 6e 64 20 62 65 20  ly recur and be 
10790 70 69 63 6b 65 64 20 75 70 20 6c 61 74 65 72 20  picked up later 
107a0 28 54 6f 64 6f 3a 20 54 68 69 6e 6b 20 61 62 6f  (Todo: Think abo
107b0 75 74 20 74 68 69 73 29 2e 0a 2a 2f 0a 69 6e 74  ut this)..*/.int
107c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61   sqlite3PagerRea
107d0 64 46 69 6c 65 68 65 61 64 65 72 28 50 61 67 65  dFileheader(Page
107e0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e  r *pPager, int N
107f0 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
10800 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72  *pDest){.  int r
10810 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
10820 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30   memset(pDest, 0
10830 2c 20 4e 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  , N);.  if( MEMD
10840 42 3d 3d 30 20 29 7b 0a 20 20 20 20 64 69 73 61  B==0 ){.    disa
10850 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
10860 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73  _errors();.    s
10870 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
10880 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20  ger->fd, 0);.   
10890 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
108a0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
108b0 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 48     IOTRACE(("DBH
108c0 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70  DR %p 0 %d\n", p
108d0 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72  Pager, N)).    r
108e0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
108f0 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44  d(pPager->fd, pD
10900 65 73 74 2c 20 4e 29 3b 0a 20 20 20 20 69 66 28  est, N);.    if(
10910 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
10920 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
10930 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
10940 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
10950 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10960 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
10970 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
10980 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 69   pages in the di
10990 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74  sk file associat
109a0 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65  ed with.** pPage
109b0 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  r. .**.** If the
109c0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69   PENDING_BYTE li
109d0 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 64  es on the page d
109e0 69 72 65 63 74 6c 79 20 61 66 74 65 72 20 74 68  irectly after th
109f0 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
10a00 66 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69  file, then consi
10a10 64 65 72 20 74 68 69 73 20 70 61 67 65 20 70 61  der this page pa
10a20 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  rt of the file t
10a30 6f 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  oo. For example,
10a40 20 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42   if.** PENDING_B
10a50 59 54 45 20 69 73 20 62 79 74 65 20 34 30 39 36  YTE is byte 4096
10a60 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65   (the first byte
10a70 20 6f 66 20 70 61 67 65 20 35 29 20 61 6e 64 20   of page 5) and 
10a80 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
10a90 2a 2a 20 66 69 6c 65 20 69 73 20 34 30 39 36 20  ** file is 4096 
10aa0 62 79 74 65 73 2c 20 35 20 69 73 20 72 65 74 75  bytes, 5 is retu
10ab0 72 6e 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  rned instead of 
10ac0 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  4..*/.int sqlite
10ad0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
10ae0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
10af0 20 20 69 36 34 20 6e 3b 0a 20 20 69 6e 74 20 72    i64 n;.  int r
10b00 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  c;.  assert( pPa
10b10 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ger!=0 );.  if( 
10b20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
10b30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
10b40 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
10b50 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a  r->dbSize>=0 ){.
10b60 20 20 20 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e      n = pPager->
10b70 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65  dbSize;.  } else
10b80 20 7b 0a 20 20 20 20 69 66 28 20 28 72 63 20 3d   {.    if( (rc =
10b90 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
10ba0 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
10bb0 6e 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  n))!=SQLITE_OK )
10bc0 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  {.      pager_er
10bd0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
10be0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
10bf0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
10c00 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e  >0 && n<pPager->
10c10 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
10c20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c    n = 1;.    }el
10c30 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d 20 70  se{.      n /= p
10c40 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
10c50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
10c60 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
10c70 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
10c80 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
10c90 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20  ze = n;.    }.  
10ca0 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44  }.  if( n==(PEND
10cb0 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d  ING_BYTE/pPager-
10cc0 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20  >pageSize) ){.  
10cd0 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28    n++;.  }.  if(
10ce0 20 6e 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e   n>pPager->mxPgn
10cf0 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
10d00 3e 6d 78 50 67 6e 6f 20 3d 20 6e 3b 0a 20 20 7d  >mxPgno = n;.  }
10d10 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
10d20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10d30 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a  OMIT_MEMORYDB./*
10d40 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69  .** Clear a PgHi
10d50 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73  story block.*/.s
10d60 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72  tatic void clear
10d70 48 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72  History(PgHistor
10d80 79 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c  y *pHist){.  sql
10d90 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70  iteFree(pHist->p
10da0 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 46  Orig);.  sqliteF
10db0 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
10dc0 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69  );.  pHist->pOri
10dd0 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e  g = 0;.  pHist->
10de0 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c  pStmt = 0;.}.#el
10df0 73 65 0a 23 64 65 66 69 6e 65 20 63 6c 65 61 72  se.#define clear
10e00 48 69 73 74 6f 72 79 28 78 29 0a 23 65 6e 64 69  History(x).#endi
10e10 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64  f../*.** Forward
10e20 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a   declaration.*/.
10e30 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
10e40 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a  ournal(Pager*);.
10e50 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50  ./*.** Unlink pP
10e60 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68  g from it's hash
10e70 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74   chain. Also set
10e80 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
10e90 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74   to 0 to indicat
10ea0 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  e.** that the pa
10eb0 67 65 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  ge is not part o
10ec0 66 20 61 6e 79 20 68 61 73 68 20 63 68 61 69 6e  f any hash chain
10ed0 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72  . This is requir
10ee0 65 64 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a  ed because the.*
10ef0 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  * sqlite3PagerMo
10f00 76 65 70 61 67 65 28 29 20 72 6f 75 74 69 6e 65  vepage() routine
10f10 20 63 61 6e 20 6c 65 61 76 65 20 61 20 70 61 67   can leave a pag
10f20 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65  e in the .** pNe
10f30 78 74 46 72 65 65 2f 70 50 72 65 76 46 72 65 65  xtFree/pPrevFree
10f40 20 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e 6f   list that is no
10f50 74 20 61 20 70 61 72 74 20 6f 66 20 61 6e 79 20  t a part of any 
10f60 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73  hash-chain..*/.s
10f70 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e  tatic void unlin
10f80 6b 48 61 73 68 43 68 61 69 6e 28 50 61 67 65 72  kHashChain(Pager
10f90 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
10fa0 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
10fb0 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  ->pgno==0 ){.   
10fc0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e   assert( pPg->pN
10fd0 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20 70 50  extHash==0 && pP
10fe0 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20  g->pPrevHash==0 
10ff0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
11000 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e   }.  if( pPg->pN
11010 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 70  extHash ){.    p
11020 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
11030 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e  PrevHash = pPg->
11040 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20  pPrevHash;.  }. 
11050 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48   if( pPg->pPrevH
11060 61 73 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ash ){.    asser
11070 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  t( pPager->aHash
11080 5b 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50  [pPg->pgno & (pP
11090 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 21  ager->nHash-1)]!
110a0 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d  =pPg );.    pPg-
110b0 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78  >pPrevHash->pNex
110c0 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65  tHash = pPg->pNe
110d0 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b  xtHash;.  }else{
110e0 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70 50 67  .    int h = pPg
110f0 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72  ->pgno & (pPager
11100 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20  ->nHash-1);.    
11110 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
11120 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73   = pPg->pNextHas
11130 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d  h;.  }.  if( MEM
11140 44 42 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 48  DB ){.    clearH
11150 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f  istory(PGHDR_TO_
11160 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
11170 29 29 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  ));.  }.  pPg->p
11180 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e  gno = 0;.  pPg->
11190 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d  pNextHash = pPg-
111a0 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a  >pPrevHash = 0;.
111b0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  }../*.** Unlink 
111c0 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
111d0 66 72 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c  free list (the l
111e0 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
111f0 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a   where nRef==0).
11200 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20  ** and from its 
11210 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63  hash collision c
11220 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hain..*/.static 
11230 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28  void unlinkPage(
11240 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
11250 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
11260 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f  Pg->pPager;..  /
11270 2a 20 4b 65 65 70 20 74 68 65 20 70 46 69 72 73  * Keep the pFirs
11280 74 53 79 6e 63 65 64 20 70 6f 69 6e 74 65 72 20  tSynced pointer 
11290 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20  pointing at the 
112a0 66 69 72 73 74 20 73 79 6e 63 68 72 6f 6e 69 7a  first synchroniz
112b0 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28  ed page */.  if(
112c0 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46   pPg==pPager->pF
112d0 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20  irstSynced ){.  
112e0 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67    PgHdr *p = pPg
112f0 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
11300 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
11310 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20  needSync ){ p = 
11320 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a  p->pNextFree; }.
11330 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
11340 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20  stSynced = p;.  
11350 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66  }..  /* Unlink f
11360 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74  rom the freelist
11370 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 70   */.  if( pPg->p
11380 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20  PrevFree ){.    
11390 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e  pPg->pPrevFree->
113a0 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d  pNextFree = pPg-
113b0 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 65  >pNextFree;.  }e
113c0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
113d0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d   pPager->pFirst=
113e0 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67  =pPg );.    pPag
113f0 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67  er->pFirst = pPg
11400 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d  ->pNextFree;.  }
11410 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78  .  if( pPg->pNex
11420 74 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67  tFree ){.    pPg
11430 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72  ->pNextFree->pPr
11440 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50  evFree = pPg->pP
11450 72 65 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65  revFree;.  }else
11460 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
11470 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67  ager->pLast==pPg
11480 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
11490 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72  pLast = pPg->pPr
114a0 65 76 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70 50  evFree;.  }.  pP
114b0 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  g->pNextFree = p
114c0 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  Pg->pPrevFree = 
114d0 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20  0;..  /* Unlink 
114e0 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68 61  from the pgno ha
114f0 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 6e  sh table */.  un
11500 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50  linkHashChain(pP
11510 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a 2f  ager, pPg);.}../
11520 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
11530 65 20 69 73 20 75 73 65 64 20 74 6f 20 74 72 75  e is used to tru
11540 6e 63 61 74 65 20 74 68 65 20 63 61 63 68 65 20  ncate the cache 
11550 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 0a  when a database.
11560 2a 2a 20 69 73 20 74 72 75 6e 63 61 74 65 64 2e  ** is truncated.
11570 20 20 44 72 6f 70 20 66 72 6f 6d 20 74 68 65 20    Drop from the 
11580 63 61 63 68 65 20 61 6c 6c 20 70 61 67 65 73 20  cache all pages 
11590 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 0a 2a 2a  whose pgno is.**
115a0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61   larger than pPa
115b0 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20  ger->dbSize and 
115c0 69 73 20 75 6e 72 65 66 65 72 65 6e 63 65 64 2e  is unreferenced.
115d0 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65  .**.** Reference
115e0 64 20 70 61 67 65 73 20 6c 61 72 67 65 72 20 74  d pages larger t
115f0 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69  han pPager->dbSi
11600 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a  ze are zeroed..*
11610 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 61  *.** Actually, a
11620 74 20 74 68 65 20 70 6f 69 6e 74 20 74 68 69 73  t the point this
11630 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
11640 65 64 2c 20 69 74 20 77 6f 75 6c 64 20 62 65 0a  ed, it would be.
11650 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 68  ** an error to h
11660 61 76 65 20 61 20 72 65 66 65 72 65 6e 63 65 64  ave a referenced
11670 20 70 61 67 65 2e 20 20 42 75 74 20 72 61 74 68   page.  But rath
11680 65 72 20 74 68 61 6e 20 64 65 6c 65 74 65 0a 2a  er than delete.*
11690 2a 20 74 68 61 74 20 70 61 67 65 20 61 6e 64 20  * that page and 
116a0 67 75 61 72 61 6e 74 65 65 20 61 20 73 75 62 73  guarantee a subs
116b0 65 71 75 65 6e 74 20 73 65 67 66 61 75 6c 74 2c  equent segfault,
116c0 20 69 74 20 73 65 65 6d 73 20 62 65 74 74 65 72   it seems better
116d0 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20 69 74 20 61  .** to zero it a
116e0 6e 64 20 68 6f 70 65 20 74 68 61 74 20 77 65 20  nd hope that we 
116f0 65 72 72 6f 72 20 6f 75 74 20 73 61 6e 65 6c 79  error out sanely
11700 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11710 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f   pager_truncate_
11720 63 61 63 68 65 28 50 61 67 65 72 20 2a 70 50 61  cache(Pager *pPa
11730 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
11740 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70 70  Pg;.  PgHdr **pp
11750 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a 65  Pg;.  int dbSize
11760 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
11770 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26 70 50  e;..  ppPg = &pP
11780 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68  ager->pAll;.  wh
11790 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70 70 50  ile( (pPg = *ppP
117a0 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  g)!=0 ){.    if(
117b0 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69   pPg->pgno<=dbSi
117c0 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70 50 67  ze ){.      ppPg
117d0 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c   = &pPg->pNextAl
117e0 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  l;.    }else if(
117f0 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a   pPg->nRef>0 ){.
11800 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
11810 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
11820 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
11830 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 70 50  Size);.      ppP
11840 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41  g = &pPg->pNextA
11850 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ll;.    }else{. 
11860 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70 50 67       *ppPg = pPg
11870 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
11880 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 46 52    IOTRACE(("PGFR
11890 45 45 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  EE %p %d\n", pPa
118a0 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
118b0 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
118c0 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
118d0 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29 3b 0a  _pgfree_count);.
118e0 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65        unlinkPage
118f0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 6d 61 6b  (pPg);.      mak
11900 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
11910 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
11920 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  g);.      pPager
11930 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d  ->nPage--;.    }
11940 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  .  }.}../*.** Tr
11950 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f  y to obtain a lo
11960 63 6b 20 6f 6e 20 61 20 66 69 6c 65 2e 20 20 49  ck on a file.  I
11970 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63  nvoke the busy c
11980 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c  allback if the l
11990 6f 63 6b 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e  ock.** is curren
119a0 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  tly not availabl
119b0 65 2e 20 20 52 65 70 65 61 74 20 75 6e 74 69 6c  e.  Repeat until
119c0 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
119d0 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a 20 66 61  ck returns.** fa
119e0 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65  lse or until the
119f0 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a   lock succeeds..
11a00 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
11a10 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
11a20 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  s and an error c
11a30 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74  ode if we cannot
11a40 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c   obtain.** the l
11a50 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ock..*/.static i
11a60 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  nt pager_wait_on
11a70 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  _lock(Pager *pPa
11a80 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  ger, int locktyp
11a90 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  e){.  int rc;.. 
11aa0 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20   /* The OS lock 
11ab0 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 74  values must be t
11ac0 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 50  he same as the P
11ad0 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73  ager lock values
11ae0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 50 41   */.  assert( PA
11af0 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41 52  GER_SHARED==SHAR
11b00 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
11b10 65 72 74 28 20 50 41 47 45 52 5f 52 45 53 45 52  ert( PAGER_RESER
11b20 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  VED==RESERVED_LO
11b30 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
11b40 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3d  PAGER_EXCLUSIVE=
11b50 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
11b60 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
11b70 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c  file is currentl
11b80 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20  y unlocked then 
11b90 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65  the size must be
11ba0 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73   unknown */.  as
11bb0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
11bc0 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
11bd0 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53  D || pPager->dbS
11be0 69 7a 65 3c 30 20 7c 7c 20 4d 45 4d 44 42 20 29  ize<0 || MEMDB )
11bf0 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
11c00 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65  >state>=locktype
11c10 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
11c20 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
11c30 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
11c40 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
11c50 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c  ck(pPager->fd, l
11c60 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77  ocktype);.    }w
11c70 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
11c80 5f 42 55 53 59 20 26 26 20 73 71 6c 69 74 65 33  _BUSY && sqlite3
11c90 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
11ca0 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  r(pPager->pBusyH
11cb0 61 6e 64 6c 65 72 29 20 29 3b 0a 20 20 20 20 69  andler) );.    i
11cc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11cd0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
11ce0 2d 3e 73 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79  ->state = lockty
11cf0 70 65 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  pe;.      IOTRAC
11d00 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e  E(("LOCK %p %d\n
11d10 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74  ", pPager, lockt
11d20 79 70 65 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a  ype)).    }.  }.
11d30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11d40 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74  /*.** Truncate t
11d50 68 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20 6e  he file to the n
11d60 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
11d70 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74  pecified..*/.int
11d80 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
11d90 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
11da0 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
11db0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
11dc0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
11dd0 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
11de0 44 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 20 20  D || MEMDB );.  
11df0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
11e00 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
11e10 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
11e20 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  Code ){.    rc =
11e30 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
11e40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
11e50 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65  .  }.  if( nPage
11e60 3e 3d 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67  >=(unsigned)pPag
11e70 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
11e80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11e90 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45  OK;.  }.  if( ME
11ea0 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65  MDB ){.    pPage
11eb0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
11ec0 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75  e;.    pager_tru
11ed0 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67  ncate_cache(pPag
11ee0 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
11ef0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
11f00 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
11f10 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  l(pPager);.  if(
11f20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11f30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
11f40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61  .  }..  /* Get a
11f50 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
11f60 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
11f70 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69   before truncati
11f80 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ng. */.  rc = pa
11f90 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
11fa0 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
11fb0 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  VE_LOCK);.  if( 
11fc0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11fd0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
11fe0 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67 65    }..  rc = page
11ff0 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
12000 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 72 65 74  r, nPage);.  ret
12010 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
12020 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61   Shutdown the pa
12030 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20  ge cache.  Free 
12040 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63  all memory and c
12050 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a  lose all files..
12060 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
12070 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72  action was in pr
12080 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73  ogress when this
12090 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
120a0 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  ed, that.** tran
120b0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
120c0 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74  d back.  All out
120d0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
120e0 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
120f0 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f  * and their memo
12100 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e  ry is freed.  An
12110 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
12120 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74   a page associat
12130 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20  ed.** with this 
12140 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72  page cache after
12150 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
12160 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65  eturns will like
12170 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ly.** result in 
12180 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a  a coredump..**.*
12190 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
121a0 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
121b0 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
121c0 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61  n is active an a
121d0 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64  ttempt.** is mad
121e0 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
121f0 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  k. If an error o
12200 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
12210 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20   rollback .** a 
12220 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot journal may 
12230 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
12240 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f  ilesystem but no
12250 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
12260 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  ed.** to the cal
12270 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ler..*/.int sqli
12280 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61  te3PagerClose(Pa
12290 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69  ger *pPager){.#i
122a0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
122b0 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
122c0 4d 45 4e 54 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c  MENT.  /* A mall
122d0 6f 63 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c  oc() cannot fail
122e0 20 69 6e 20 73 71 6c 69 74 65 33 54 68 72 65 61   in sqlite3Threa
122f0 64 44 61 74 61 28 29 20 61 73 20 6f 6e 65 20 6f  dData() as one o
12300 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20  r more calls to 
12310 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d  .  ** malloc() m
12320 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ust have already
12330 20 62 65 65 6e 20 6d 61 64 65 20 62 79 20 74 68   been made by th
12340 69 73 20 74 68 72 65 61 64 20 62 65 66 6f 72 65  is thread before
12350 20 69 74 20 67 65 74 73 0a 20 20 2a 2a 20 74 6f   it gets.  ** to
12360 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 54 68 69   this point. Thi
12370 73 20 6d 65 61 6e 73 20 74 68 65 20 54 68 72 65  s means the Thre
12380 61 64 44 61 74 61 20 6d 75 73 74 20 68 61 76 65  adData must have
12390 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
123a0 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 73 6f 20  already.  ** so 
123b0 74 68 61 74 20 54 68 72 65 61 64 44 61 74 61 2e  that ThreadData.
123c0 6e 41 6c 6c 6f 63 20 63 61 6e 20 62 65 20 73 65  nAlloc can be se
123d0 74 2e 0a 20 20 2a 2f 0a 20 20 54 68 72 65 61 64  t..  */.  Thread
123e0 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73 71 6c  Data *pTsd = sql
123f0 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29  ite3ThreadData()
12400 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
12410 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
12420 70 54 73 64 20 26 26 20 70 54 73 64 2d 3e 6e 41  pTsd && pTsd->nA
12430 6c 6c 6f 63 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  lloc );.#endif..
12440 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
12450 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
12460 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  .  pPager->errCo
12470 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  de = 0;.  pPager
12480 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
12490 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72 65 73  = 0;.  pager_res
124a0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61  et(pPager);.  pa
124b0 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
124c0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
124d0 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
124e0 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
124f0 50 41 47 45 52 54 52 41 43 45 32 28 22 43 4c 4f  PAGERTRACE2("CLO
12500 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  SE %d\n", PAGERI
12510 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 49 4f  D(pPager));.  IO
12520 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70  TRACE(("CLOSE %p
12530 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
12540 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
12550 65 72 72 43 6f 64 65 20 7c 7c 20 28 70 50 61 67  errCode || (pPag
12560 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
12570 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74  =0 && pPager->st
12580 6d 74 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a 20 20  mtOpen==0) );.  
12590 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
125a0 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73  nalOpen ){.    s
125b0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70  qlite3OsClose(&p
125c0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d  Pager->jfd);.  }
125d0 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50  .  sqliteFree(pP
125e0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
125f0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
12600 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20  >stmtOpen ){.   
12610 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
12620 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a  &pPager->stfd);.
12630 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 43    }.  sqlite3OsC
12640 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 66 64  lose(&pPager->fd
12650 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c  );.  /* Temp fil
12660 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63  es are automatic
12670 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20  ally deleted by 
12680 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20  the OS.  ** if( 
12690 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
126a0 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74   ){.  **   sqlit
126b0 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
126c0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  r->zFilename);. 
126d0 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 23 69 66 64   ** }.  */..#ifd
126e0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
126f0 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
12700 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  NT.  /* Remove t
12710 68 65 20 70 61 67 65 72 20 66 72 6f 6d 20 74 68  he pager from th
12720 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  e linked list of
12730 20 70 61 67 65 72 73 20 73 74 61 72 74 69 6e 67   pagers starting
12740 20 61 74 20 0a 20 20 2a 2a 20 54 68 72 65 61 64   at .  ** Thread
12750 44 61 74 61 2e 70 50 61 67 65 72 20 69 66 20 6d  Data.pPager if m
12760 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74  emory-management
12770 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 2a   is enabled..  *
12780 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d  /.  if( pPager==
12790 70 54 73 64 2d 3e 70 50 61 67 65 72 20 29 7b 0a  pTsd->pPager ){.
127a0 20 20 20 20 70 54 73 64 2d 3e 70 50 61 67 65 72      pTsd->pPager
127b0 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74   = pPager->pNext
127c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  ;.  }else{.    P
127d0 61 67 65 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20  ager *pTmp;.    
127e0 66 6f 72 28 70 54 6d 70 20 3d 20 70 54 73 64 2d  for(pTmp = pTsd-
127f0 3e 70 50 61 67 65 72 3b 20 70 54 6d 70 2d 3e 70  >pPager; pTmp->p
12800 4e 65 78 74 21 3d 70 50 61 67 65 72 3b 20 70 54  Next!=pPager; pT
12810 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 29 7b  mp=pTmp->pNext){
12820 7d 0a 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78  }.    pTmp->pNex
12830 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78  t = pPager->pNex
12840 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  t;.  }.#endif.  
12850 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
12860 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 73 71 6c  r->aHash);.  sql
12870 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
12880 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 73 71  pTmpSpace);.  sq
12890 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 29  liteFree(pPager)
128a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
128b0 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  E_OK;.}..#if !de
128c0 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c  fined(NDEBUG) ||
128d0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
128e0 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75  TEST)./*.** Retu
128f0 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  rn the page numb
12900 65 72 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  er for the given
12910 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50   page data..*/.P
12920 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  gno sqlite3Pager
12930 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67  Pagenumber(DbPag
12940 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *p){.  return 
12950 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69  p->pgno;.}.#endi
12960 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67  f../*.** The pag
12970 65 5f 72 65 66 28 29 20 66 75 6e 63 74 69 6f 6e  e_ref() function
12980 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20   increments the 
12990 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
129a0 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49  for a page..** I
129b0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 63 75  f the page is cu
129c0 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66  rrently on the f
129d0 72 65 65 6c 69 73 74 20 28 74 68 65 20 72 65 66  reelist (the ref
129e0 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
129f0 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65  zero) then.** re
12a00 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65  move it from the
12a10 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a   freelist..**.**
12a20 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79   For non-test sy
12a30 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28  stems, page_ref(
12a40 29 20 69 73 20 61 20 6d 61 63 72 6f 20 74 68 61  ) is a macro tha
12a50 74 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65  t calls _page_re
12a60 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66  f().** online of
12a70 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
12a80 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20 46  ount is zero.  F
12a90 6f 72 20 74 65 73 74 20 73 79 73 74 65 6d 73 2c  or test systems,
12aa0 20 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69   page_ref().** i
12ab0 73 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f  s a real functio
12ac0 6e 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  n so that we can
12ad0 20 73 65 74 20 62 72 65 61 6b 70 6f 69 6e 74 73   set breakpoints
12ae0 20 61 6e 64 20 74 72 61 63 65 20 69 74 2e 0a 2a   and trace it..*
12af0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f 70  /.static void _p
12b00 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70  age_ref(PgHdr *p
12b10 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
12b20 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  nRef==0 ){.    /
12b30 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 63 75  * The page is cu
12b40 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66  rrently on the f
12b50 72 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65  reelist.  Remove
12b60 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   it. */.    if( 
12b70 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72  pPg==pPg->pPager
12b80 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29  ->pFirstSynced )
12b90 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  {.      PgHdr *p
12ba0 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
12bb0 65 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  e;.      while( 
12bc0 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63  p && p->needSync
12bd0 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74   ){ p = p->pNext
12be0 46 72 65 65 3b 20 7d 0a 20 20 20 20 20 20 70 50  Free; }.      pP
12bf0 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g->pPager->pFirs
12c00 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20  tSynced = p;.   
12c10 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
12c20 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
12c30 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
12c40 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
12c50 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
12c60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12c70 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69  pPg->pPager->pFi
12c80 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  rst = pPg->pNext
12c90 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Free;.    }.    
12ca0 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  if( pPg->pNextFr
12cb0 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ee ){.      pPg-
12cc0 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65  >pNextFree->pPre
12cd0 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72  vFree = pPg->pPr
12ce0 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73  evFree;.    }els
12cf0 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  e{.      pPg->pP
12d00 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50  ager->pLast = pP
12d10 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20  g->pPrevFree;.  
12d20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61    }.    pPg->pPa
12d30 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d  ger->nRef++;.  }
12d40 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a  .  pPg->nRef++;.
12d50 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
12d60 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
12d70 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76  DEBUG.  static v
12d80 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50 67 48  oid page_ref(PgH
12d90 64 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69 66  dr *pPg){.    if
12da0 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
12db0 7b 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72 65  {.      _page_re
12dc0 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73  f(pPg);.    }els
12dd0 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 52  e{.      pPg->nR
12de0 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46 49  ef++;.      REFI
12df0 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  NFO(pPg);.    }.
12e00 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69    }.#else.# defi
12e10 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29 20 20  ne page_ref(P)  
12e20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f   ((P)->nRef==0?_
12e30 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f 69  page_ref(P):(voi
12e40 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23  d)(P)->nRef++).#
12e50 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  endif../*.** Inc
12e60 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
12e70 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  ence count for a
12e80 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75   page.  The inpu
12e90 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20  t pointer is.** 
12ea0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
12eb0 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f  he page data..*/
12ec0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
12ed0 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  rRef(DbPage *pPg
12ee0 29 7b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50  ){.  page_ref(pP
12ef0 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  g);.  return SQL
12f00 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
12f10 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
12f20 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  l.  In other wor
12f30 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c  ds, make sure al
12f40 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74  l the pages that
12f50 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72   have.** been wr
12f60 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
12f70 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c  rnal have actual
12f80 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73  ly reached the s
12f90 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a  urface of the.**
12fa0 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f   disk.  It is no
12fb0 74 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66 79  t safe to modify
12fc0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
12fd0 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69  tabase file unti
12fe0 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a  l after.** the j
12ff0 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20  ournal has been 
13000 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65 20  synced.  If the 
13010 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
13020 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62 65  e is modified be
13030 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  fore.** the jour
13040 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61 6e  nal is synced an
13050 64 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  d a power failur
13060 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75 6e  e occurs, the un
13070 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a  synced journal.*
13080 2a 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65 20  * data would be 
13090 6c 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75 6c  lost and we woul
130a0 64 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 63  d be unable to c
130b0 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61  ompletely rollba
130c0 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  ck the.** databa
130d0 73 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61 74  se changes.  Dat
130e0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
130f0 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a   would occur..**
13100 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
13110 65 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20 74  e also updates t
13120 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e  he nRec field in
13130 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 74   the header of t
13140 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28  he journal..** (
13150 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20  See comments on 
13160 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61  the pager_playba
13170 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72  ck() routine for
13180 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
13190 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20  rmation.).** If 
131a0 74 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69 73  the sync mode is
131b0 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73   FULL, two syncs
131c0 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69   will occur.  Fi
131d0 72 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f  rst the whole jo
131e0 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63  urnal.** is sync
131f0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52 65  ed, then the nRe
13200 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  c field is updat
13210 65 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f 6e  ed, then a secon
13220 64 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a  d sync occurs..*
13230 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61  *.** For tempora
13240 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 77 65  ry databases, we
13250 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66 20   do not care if 
13260 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72  we are able to r
13270 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72  ollback.** after
13280 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
13290 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63 75 72 73  , so sync occurs
132a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
132b0 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20  tine clears the 
132c0 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f  needSync field o
132d0 66 20 65 76 65 72 79 20 70 61 67 65 20 63 75 72  f every page cur
132e0 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20  rent held in.** 
132f0 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
13300 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61  c int syncJourna
13310 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
13320 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
13330 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
13340 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63  E_OK;..  /* Sync
13350 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66   the journal bef
13360 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
13370 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a  e main database.
13380 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74    ** (assuming t
13390 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61  here is a journa
133a0 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74  l and it needs t
133b0 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20  o be synced.).  
133c0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
133d0 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
133e0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
133f0 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
13400 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
13410 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
13420 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20       /* assert( 
13430 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
13440 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67  ); // noSync mig
13450 68 74 20 62 65 20 73 65 74 20 69 66 20 73 79 6e  ht be set if syn
13460 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a  chronous.      *
13470 2a 20 77 61 73 20 74 75 72 6e 65 64 20 6f 66 66  * was turned off
13480 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e 73   after the trans
13490 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74  action was start
134a0 65 64 2e 20 20 54 69 63 6b 65 74 20 23 36 31 35  ed.  Ticket #615
134b0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   */.#ifndef NDEB
134c0 55 47 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  UG.      {.     
134d0 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
134e0 74 68 65 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  the pPager->nRec
134f0 20 63 6f 75 6e 74 65 72 20 77 65 20 61 72 65 20   counter we are 
13500 6b 65 65 70 69 6e 67 20 61 67 72 65 65 73 0a 20  keeping agrees. 
13510 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74         ** with t
13520 68 65 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  he nRec computed
13530 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
13540 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
13550 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  le..        */. 
13560 20 20 20 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a         i64 jSz;.
13570 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
13580 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
13590 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a  Pager->jfd, &jSz
135a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
135b0 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
135c0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
135d0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
135e0 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20  lOff==jSz );.   
135f0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
13600 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57    {.        /* W
13610 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61  rite the nRec va
13620 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  lue into the jou
13630 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72  rnal file header
13640 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20  . If in.        
13650 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e  ** full-synchron
13660 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74  ous mode, sync t
13670 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74  he journal first
13680 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74  . This ensures t
13690 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hat.        ** a
136a0 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c  ll data has real
136b0 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20  ly hit the disk 
136c0 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75  before nRec is u
136d0 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20  pdated to mark. 
136e0 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20         ** it as 
136f0 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
13700 72 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20 20 20 20  rollback. .     
13710 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
13720 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
13730 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
13740 50 41 47 45 52 54 52 41 43 45 32 28 22 53 59 4e  PAGERTRACE2("SYN
13750 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
13760 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
13770 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  er));.          
13780 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
13790 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
137a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
137b0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
137c0 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
137d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
137e0 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
137f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13800 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
13810 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  eek(pPager->jfd,
13820 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13830 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
13840 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b  er->journalHdr +
13850 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
13860 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20  Magic));.       
13870 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
13880 20 72 63 3b 0a 20 20 20 20 20 20 20 20 49 4f 54   rc;.        IOT
13890 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25  RACE(("JHDR %p %
138a0 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
138b0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
138c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
138d0 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66  rnalHdr + sizeof
138e0 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2c  (aJournalMagic),
138f0 20 34 29 29 0a 20 20 20 20 20 20 20 20 72 63 20   4)).        rc 
13900 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
13910 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
13920 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20  r->nRec);.      
13930 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
13940 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 20 72  n rc;..        r
13950 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
13960 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  k(pPager->jfd, p
13970 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
13980 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  f);.        if( 
13990 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
139a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 50 41        }.      PA
139b0 47 45 52 54 52 41 43 45 32 28 22 53 59 4e 43 20  GERTRACE2("SYNC 
139c0 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
139d0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
139e0 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ));.      IOTRAC
139f0 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
13a00 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
13a10 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
13a20 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
13a30 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79  pPager->full_fsy
13a40 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  nc);.      if( r
13a50 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
13a60 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
13a70 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
13a80 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50   1;.    }.    pP
13a90 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
13aa0 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73   0;..    /* Eras
13ab0 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66  e the needSync f
13ac0 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79 20 70  lag from every p
13ad0 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
13ae0 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
13af0 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
13b00 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
13b10 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
13b20 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  nc = 0;.    }.  
13b30 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
13b40 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d  Synced = pPager-
13b50 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 23 69  >pFirst;.  }..#i
13b60 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f  fndef NDEBUG.  /
13b70 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e  * If the Pager.n
13b80 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
13b90 63 6c 65 61 72 20 74 68 65 6e 20 74 68 65 20 50  clear then the P
13ba0 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20  gHdr.needSync.  
13bb0 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20 61 6c 73  ** flag must als
13bc0 6f 20 62 65 20 63 6c 65 61 72 20 66 6f 72 20 61  o be clear for a
13bd0 6c 6c 20 70 61 67 65 73 2e 20 20 56 65 72 69 66  ll pages.  Verif
13be0 79 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a  y that this.  **
13bf0 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 74 72   invariant is tr
13c00 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b  ue..  */.  else{
13c10 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
13c20 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
13c30 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
13c40 6c 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l){.      assert
13c50 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d  ( pPg->needSync=
13c60 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  =0 );.    }.    
13c70 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
13c80 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 70 50  pFirstSynced==pP
13c90 61 67 65 72 2d 3e 70 46 69 72 73 74 20 29 3b 0a  ager->pFirst );.
13ca0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
13cb0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
13cc0 2a 20 4d 65 72 67 65 20 74 77 6f 20 6c 69 73 74  * Merge two list
13cd0 73 20 6f 66 20 70 61 67 65 73 20 63 6f 6e 6e 65  s of pages conne
13ce0 63 74 65 64 20 62 79 20 70 44 69 72 74 79 20 61  cted by pDirty a
13cf0 6e 64 20 69 6e 20 70 67 6e 6f 20 6f 72 64 65 72  nd in pgno order
13d00 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68  ..** Do not both
13d10 20 66 69 78 69 6e 67 20 74 68 65 20 70 50 72 65   fixing the pPre
13d20 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73 2e  vDirty pointers.
13d30 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72  .*/.static PgHdr
13d40 20 2a 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74   *merge_pagelist
13d50 28 50 67 48 64 72 20 2a 70 41 2c 20 50 67 48 64  (PgHdr *pA, PgHd
13d60 72 20 2a 70 42 29 7b 0a 20 20 50 67 48 64 72 20  r *pB){.  PgHdr 
13d70 72 65 73 75 6c 74 2c 20 2a 70 54 61 69 6c 3b 0a  result, *pTail;.
13d80 20 20 70 54 61 69 6c 20 3d 20 26 72 65 73 75 6c    pTail = &resul
13d90 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 41 20 26  t;.  while( pA &
13da0 26 20 70 42 20 29 7b 0a 20 20 20 20 69 66 28 20  & pB ){.    if( 
13db0 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d 3e 70 67 6e  pA->pgno<pB->pgn
13dc0 6f 20 29 7b 0a 20 20 20 20 20 20 70 54 61 69 6c  o ){.      pTail
13dd0 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a 20  ->pDirty = pA;. 
13de0 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70 41 3b       pTail = pA;
13df0 0a 20 20 20 20 20 20 70 41 20 3d 20 70 41 2d 3e  .      pA = pA->
13e00 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c 73  pDirty;.    }els
13e10 65 7b 0a 20 20 20 20 20 20 70 54 61 69 6c 2d 3e  e{.      pTail->
13e20 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20 20 20  pDirty = pB;.   
13e30 20 20 20 70 54 61 69 6c 20 3d 20 70 42 3b 0a 20     pTail = pB;. 
13e40 20 20 20 20 20 70 42 20 3d 20 70 42 2d 3e 70 44       pB = pB->pD
13e50 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  irty;.    }.  }.
13e60 20 20 69 66 28 20 70 41 20 29 7b 0a 20 20 20 20    if( pA ){.    
13e70 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20  pTail->pDirty = 
13e80 70 41 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  pA;.  }else if( 
13e90 70 42 20 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d  pB ){.    pTail-
13ea0 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20 20  >pDirty = pB;.  
13eb0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 69 6c  }else{.    pTail
13ec0 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
13ed0 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c  }.  return resul
13ee0 74 2e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a  t.pDirty;.}../*.
13ef0 2a 2a 20 53 6f 72 74 20 74 68 65 20 6c 69 73 74  ** Sort the list
13f00 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 63 63   of pages in acc
13f10 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20  ending order by 
13f20 70 67 6e 6f 2e 20 20 50 61 67 65 73 20 61 72 65  pgno.  Pages are
13f30 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  .** connected by
13f40 20 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73   pDirty pointers
13f50 2e 20 20 54 68 65 20 70 50 72 65 76 44 69 72 74  .  The pPrevDirt
13f60 79 20 70 6f 69 6e 74 65 72 73 20 61 72 65 0a 2a  y pointers are.*
13f70 2a 20 63 6f 72 72 75 70 74 65 64 20 62 79 20 74  * corrupted by t
13f80 68 69 73 20 73 6f 72 74 2e 0a 2a 2f 0a 23 64 65  his sort..*/.#de
13f90 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b  fine N_SORT_BUCK
13fa0 45 54 5f 41 4c 4c 4f 43 20 32 35 0a 23 64 65 66  ET_ALLOC 25.#def
13fb0 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45  ine N_SORT_BUCKE
13fc0 54 20 20 20 20 20 20 20 32 35 0a 23 69 66 64 65  T       25.#ifde
13fd0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
13fe0 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
13ff0 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 20  r_n_sort_bucket 
14000 3d 20 30 3b 0a 20 20 23 75 6e 64 65 66 20 4e 5f  = 0;.  #undef N_
14010 53 4f 52 54 5f 42 55 43 4b 45 54 0a 20 20 23 64  SORT_BUCKET.  #d
14020 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43  efine N_SORT_BUC
14030 4b 45 54 20 5c 0a 20 20 20 28 73 71 6c 69 74 65  KET \.   (sqlite
14040 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62  3_pager_n_sort_b
14050 75 63 6b 65 74 3f 73 71 6c 69 74 65 33 5f 70 61  ucket?sqlite3_pa
14060 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65  ger_n_sort_bucke
14070 74 3a 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f  t:N_SORT_BUCKET_
14080 41 4c 4c 4f 43 29 0a 23 65 6e 64 69 66 0a 73 74  ALLOC).#endif.st
14090 61 74 69 63 20 50 67 48 64 72 20 2a 73 6f 72 74  atic PgHdr *sort
140a0 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20  _pagelist(PgHdr 
140b0 2a 70 49 6e 29 7b 0a 20 20 50 67 48 64 72 20 2a  *pIn){.  PgHdr *
140c0 61 5b 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f  a[N_SORT_BUCKET_
140d0 41 4c 4c 4f 43 5d 2c 20 2a 70 3b 0a 20 20 69 6e  ALLOC], *p;.  in
140e0 74 20 69 3b 0a 20 20 6d 65 6d 73 65 74 28 61 2c  t i;.  memset(a,
140f0 20 30 2c 20 73 69 7a 65 6f 66 28 61 29 29 3b 0a   0, sizeof(a));.
14100 20 20 77 68 69 6c 65 28 20 70 49 6e 20 29 7b 0a    while( pIn ){.
14110 20 20 20 20 70 20 3d 20 70 49 6e 3b 0a 20 20 20      p = pIn;.   
14120 20 70 49 6e 20 3d 20 70 2d 3e 70 44 69 72 74 79   pIn = p->pDirty
14130 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20  ;.    p->pDirty 
14140 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
14150 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45  ; i<N_SORT_BUCKE
14160 54 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  T-1; i++){.     
14170 20 69 66 28 20 61 5b 69 5d 3d 3d 30 20 29 7b 0a   if( a[i]==0 ){.
14180 20 20 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 70          a[i] = p
14190 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
141a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
141b0 20 20 20 20 20 20 70 20 3d 20 6d 65 72 67 65 5f        p = merge_
141c0 70 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20 70  pagelist(a[i], p
141d0 29 3b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20  );.        a[i] 
141e0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
141f0 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 4e 5f   }.    if( i==N_
14200 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 20 29 7b  SORT_BUCKET-1 ){
14210 0a 20 20 20 20 20 20 2f 2a 20 43 6f 76 65 72 61  .      /* Covera
14220 67 65 3a 20 54 6f 20 67 65 74 20 68 65 72 65 2c  ge: To get here,
14230 20 74 68 65 72 65 20 6e 65 65 64 20 74 6f 20 62   there need to b
14240 65 20 32 5e 28 4e 5f 53 4f 52 54 5f 42 55 43 4b  e 2^(N_SORT_BUCK
14250 45 54 29 20 0a 20 20 20 20 20 20 2a 2a 20 65 6c  ET) .      ** el
14260 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e  ements in the in
14270 70 75 74 20 6c 69 73 74 2e 20 54 68 69 73 20 69  put list. This i
14280 73 20 70 6f 73 73 69 62 6c 65 2c 20 62 75 74 20  s possible, but 
14290 69 6d 70 72 61 63 74 69 63 61 6c 2e 0a 20 20 20  impractical..   
142a0 20 20 20 2a 2a 20 54 65 73 74 69 6e 67 20 74 68     ** Testing th
142b0 69 73 20 6c 69 6e 65 20 69 73 20 74 68 65 20 70  is line is the p
142c0 6f 69 6e 74 20 6f 66 20 67 6c 6f 62 61 6c 20 76  oint of global v
142d0 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  ariable.      **
142e0 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e   sqlite3_pager_n
142f0 5f 73 6f 72 74 5f 62 75 63 6b 65 74 2e 0a 20 20  _sort_bucket..  
14300 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 5b 69      */.      a[i
14310 5d 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69  ] = merge_pageli
14320 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20  st(a[i], p);.   
14330 20 7d 0a 20 20 7d 0a 20 20 70 20 3d 20 61 5b 30   }.  }.  p = a[0
14340 5d 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  ];.  for(i=1; i<
14350 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 3b 20 69  N_SORT_BUCKET; i
14360 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 6d 65 72  ++){.    p = mer
14370 67 65 5f 70 61 67 65 6c 69 73 74 28 70 2c 20 61  ge_pagelist(p, a
14380 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  [i]);.  }.  retu
14390 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn p;.}../*.** G
143a0 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 70  iven a list of p
143b0 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64 20  ages (connected 
143c0 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69  by the PgHdr.pDi
143d0 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72 69  rty pointer) wri
143e0 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20  te.** every one 
143f0 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 20 6f  of those pages o
14400 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
14410 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b  se file and mark
14420 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20   them all.** as 
14430 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  clean..*/.static
14440 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
14450 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20  _pagelist(PgHdr 
14460 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72  *pList){.  Pager
14470 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20   *pPager;.  int 
14480 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74  rc;..  if( pList
14490 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
144a0 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72  ITE_OK;.  pPager
144b0 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72   = pList->pPager
144c0 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  ;..  /* At this 
144d0 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
144e0 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53 45  be either a RESE
144f0 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
14500 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  E lock on the.  
14510 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
14520 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  . If there is al
14530 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49  ready an EXCLUSI
14540 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c  VE lock, the fol
14550 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c  lowing.  ** call
14560 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f  s to sqlite3OsLo
14570 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e  ck() are no-ops.
14580 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e  .  **.  ** Movin
14590 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20  g the lock from 
145a0 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c  RESERVED to EXCL
145b0 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69  USIVE actually i
145c0 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20  nvolves going.  
145d0 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e  ** through an in
145e0 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
145f0 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45   PENDING.   A PE
14600 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65  NDING lock preve
14610 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61  nts new.  ** rea
14620 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68  ders from attach
14630 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
14640 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66  ase but is unsuf
14650 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74  ficient for us t
14660 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54  o.  ** write.  T
14670 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e  he idea of a PEN
14680 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20  DING lock is to 
14690 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64  prevent new read
146a0 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f  ers from.  ** co
146b0 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65  ming in while we
146c0 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69   wait for existi
146d0 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c  ng readers to cl
146e0 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ear..  **.  ** W
146f0 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69  hile the pager i
14700 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45  s in the RESERVE
14710 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69  D state, the ori
14720 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
14730 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68  ile.  ** is unch
14740 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e  anged and we can
14750 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75   rollback withou
14760 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79  t having to play
14770 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f  back the.  ** jo
14780 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f  urnal into the o
14790 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
147a0 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20   file.  Once we 
147b0 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20  transition to.  
147c0 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74  ** EXCLUSIVE, it
147d0 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
147e0 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  ase file has bee
147f0 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e  n changed and an
14800 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  y rollback.  ** 
14810 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a  will require a j
14820 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e  ournal playback.
14830 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  .  */.  rc = pag
14840 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
14850 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
14860 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72  E_LOCK);.  if( r
14870 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
14880 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
14890 20 7d 0a 0a 20 20 70 4c 69 73 74 20 3d 20 73 6f   }..  pList = so
148a0 72 74 5f 70 61 67 65 6c 69 73 74 28 70 4c 69 73  rt_pagelist(pLis
148b0 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69  t);.  while( pLi
148c0 73 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  st ){.    assert
148d0 28 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 29  ( pList->dirty )
148e0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
148f0 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
14900 3e 66 64 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e  >fd, (pList->pgn
14910 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
14920 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
14930 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
14940 20 72 63 3b 0a 20 20 20 20 2f 2a 20 49 66 20 74   rc;.    /* If t
14950 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70  here are dirty p
14960 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65  ages in the page
14970 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65   cache with page
14980 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72   numbers greater
14990 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67  .    ** than Pag
149a0 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20  er.dbSize, this 
149b0 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67  means sqlite3Pag
149c0 65 72 54 72 75 6e 63 61 74 65 28 29 20 77 61 73  erTruncate() was
149d0 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a   called to.    *
149e0 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20  * make the file 
149f0 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61  smaller (presuma
14a00 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75  bly by auto-vacu
14a10 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74  um code). Do not
14a20 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e   write.    ** an
14a30 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20  y such pages to 
14a40 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  the file..    */
14a50 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
14a60 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
14a70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 63 68  Size ){.      ch
14a80 61 72 20 2a 70 44 61 74 61 20 3d 20 43 4f 44 45  ar *pData = CODE
14a90 43 32 28 70 50 61 67 65 72 2c 20 50 47 48 44 52  C2(pPager, PGHDR
14aa0 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c  _TO_DATA(pList),
14ab0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29   pList->pgno, 6)
14ac0 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  ;.      PAGERTRA
14ad0 43 45 33 28 22 53 54 4f 52 45 20 25 64 20 70 61  CE3("STORE %d pa
14ae0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
14af0 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74  D(pPager), pList
14b00 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 49  ->pgno);.      I
14b10 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25  OTRACE(("PGOUT %
14b20 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
14b30 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 29 3b 0a   pList->pgno));.
14b40 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14b50 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
14b60 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61  ->fd, pData, pPa
14b70 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
14b80 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
14b90 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  (sqlite3_pager_w
14ba0 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20  ritedb_count);. 
14bb0 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
14bc0 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b  pPager->nWrite);
14bd0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
14be0 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ->pgno==1 ){.   
14bf0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
14c00 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
14c10 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a   &pData[24], siz
14c20 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
14c30 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
14c40 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  }.    }.#ifndef 
14c50 4e 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b  NDEBUG.    else{
14c60 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
14c70 45 33 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70  E3("NOSTORE %d p
14c80 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
14c90 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73  ID(pPager), pLis
14ca0 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a  t->pgno);.    }.
14cb0 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72  #endif.    if( r
14cc0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
14cd0 20 20 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20     pList->dirty 
14ce0 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
14cf0 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
14d00 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61     pList->pageHa
14d10 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
14d20 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64  ash(pList);.#end
14d30 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  if.    pList = p
14d40 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
14d50 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
14d60 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
14d70 6f 6c 6c 65 63 74 20 65 76 65 72 79 20 64 69 72  ollect every dir
14d80 74 79 20 70 61 67 65 20 69 6e 74 6f 20 61 20 64  ty page into a d
14d90 69 72 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a  irty list and.**
14da0 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
14db0 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66  r to the head of
14dc0 20 74 68 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c   that list.  All
14dd0 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f   pages are.** co
14de0 6c 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66 20  llected even if 
14df0 74 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20 69  they are still i
14e00 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  n use..*/.static
14e10 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 67 65   PgHdr *pager_ge
14e20 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
14e30 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
14e40 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
14e50 72 2d 3e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a  r->pDirty;.}../*
14e60 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
14e70 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  if there is a ho
14e80 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65  t journal on the
14e90 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a   given pager..**
14ea0 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69   A hot journal i
14eb0 73 20 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73  s one that needs
14ec0 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
14ed0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
14ee0 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
14ef0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14f00 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f  le is 0 but a jo
14f10 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78  urnal file.** ex
14f20 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72  ists, that is pr
14f30 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f  obably an old jo
14f40 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20  urnal left over 
14f50 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20  from a prior.** 
14f60 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
14f70 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75  e same name.  Ju
14f80 73 74 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  st delete the jo
14f90 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  urnal..*/.static
14fa0 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e   int hasHotJourn
14fb0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
14fc0 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ){.  if( !pPager
14fd0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72  ->useJournal ) r
14fe0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
14ff0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69  sqlite3OsFileExi
15000 73 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  sts(pPager->zJou
15010 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20 72 65 74  rnal) ){.    ret
15020 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
15030 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52   sqlite3OsCheckR
15040 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67  eservedLock(pPag
15050 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 72  er->fd) ){.    r
15060 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
15070 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
15080 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
15090 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
150a0 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
150b0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  r->zJournal);.  
150c0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65    return 0;.  }e
150d0 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
150e0 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
150f0 54 72 79 20 74 6f 20 66 69 6e 64 20 61 20 70 61  Try to find a pa
15100 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  ge in the cache 
15110 74 68 61 74 20 63 61 6e 20 62 65 20 72 65 63 79  that can be recy
15120 63 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69  cled. .**.** Thi
15130 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65  s routine may re
15140 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
15150 52 2c 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 6f  R, SQLITE_FULL o
15160 72 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20  r SQLITE_OK. It 
15170 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 65 74  .** does not set
15180 20 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72   the pPager->err
15190 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a  Code variable..*
151a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
151b0 65 72 5f 72 65 63 79 63 6c 65 28 50 61 67 65 72  er_recycle(Pager
151c0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 73 79   *pPager, int sy
151d0 6e 63 4f 6b 2c 20 50 67 48 64 72 20 2a 2a 70 70  ncOk, PgHdr **pp
151e0 50 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  Pg){.  PgHdr *pP
151f0 67 3b 0a 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a  g;.  *ppPg = 0;.
15200 0a 20 20 61 73 73 65 72 74 28 21 4d 45 4d 44 42  .  assert(!MEMDB
15210 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 20  );..  /* Find a 
15220 70 61 67 65 20 74 6f 20 72 65 63 79 63 6c 65 2e  page to recycle.
15230 20 20 54 72 79 20 74 6f 20 6c 6f 63 61 74 65 20    Try to locate 
15240 61 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  a page that does
15250 20 6e 6f 74 0a 20 20 2a 2a 20 72 65 71 75 69 72   not.  ** requir
15260 65 20 75 73 20 74 6f 20 64 6f 20 61 6e 20 66 73  e us to do an fs
15270 79 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75  ync() on the jou
15280 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  rnal..  */.  pPg
15290 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73   = pPager->pFirs
152a0 74 53 79 6e 63 65 64 3b 0a 0a 20 20 2f 2a 20 49  tSynced;..  /* I
152b0 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20 66  f we could not f
152c0 69 6e 64 20 61 20 70 61 67 65 20 74 68 61 74 20  ind a page that 
152d0 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65  does not require
152e0 20 61 6e 20 66 73 79 6e 63 28 29 0a 20 20 2a 2a   an fsync().  **
152f0 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   on the journal 
15300 66 69 6c 65 20 74 68 65 6e 20 66 73 79 6e 63 20  file then fsync 
15310 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
15320 2e 20 20 54 68 69 73 20 69 73 20 61 0a 20 20 2a  .  This is a.  *
15330 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65 72  * very slow oper
15340 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f 72  ation, so we wor
15350 6b 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64 20  k hard to avoid 
15360 69 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69 6d  it.  But sometim
15370 65 73 0a 20 20 2a 2a 20 69 74 20 63 61 6e 27 74  es.  ** it can't
15380 20 62 65 20 68 65 6c 70 65 64 2e 0a 20 20 2a 2f   be helped..  */
15390 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 26 26  .  if( pPg==0 &&
153a0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
153b0 26 26 20 73 79 6e 63 4f 6b 20 26 26 20 21 4d 45  && syncOk && !ME
153c0 4d 44 42 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  MDB){.    int rc
153d0 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
153e0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
153f0 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  rc!=0 ){.      r
15400 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
15410 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
15420 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
15430 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d    /* If in full-
15440 73 79 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74 65  sync mode, write
15450 20 61 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 68   a new journal h
15460 65 61 64 65 72 20 69 6e 74 6f 20 74 68 65 0a 20  eader into the. 
15470 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
15480 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f  file. This is do
15490 6e 65 20 74 6f 20 61 76 6f 69 64 20 65 76 65 72  ne to avoid ever
154a0 20 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f 75   modifying a jou
154b0 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 68 65  rnal.      ** he
154c0 61 64 65 72 20 74 68 61 74 20 69 73 20 69 6e 76  ader that is inv
154d0 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 72 6f 6c  olved in the rol
154e0 6c 62 61 63 6b 20 6f 66 20 70 61 67 65 73 20 74  lback of pages t
154f0 68 61 74 20 68 61 76 65 0a 20 20 20 20 20 20 2a  hat have.      *
15500 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  * already been w
15510 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
15520 74 61 62 61 73 65 20 28 69 6e 20 63 61 73 65 20  tabase (in case 
15530 74 68 65 20 68 65 61 64 65 72 20 69 73 0a 20 20  the header is.  
15540 20 20 20 20 2a 2a 20 74 72 61 73 68 65 64 20 77      ** trashed w
15550 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65  hen the nRec fie
15560 6c 64 20 69 73 20 75 70 64 61 74 65 64 29 2e 0a  ld is updated)..
15570 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
15580 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
15590 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
155a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
155b0 66 20 3e 20 30 20 29 3b 0a 20 20 20 20 20 20 61  f > 0 );.      a
155c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
155d0 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  oNotSync==0 );. 
155e0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
155f0 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
15600 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
15610 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
15620 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
15630 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d  .    }.    pPg =
15640 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b   pPager->pFirst;
15650 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d  .  }.  if( pPg==
15660 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
15670 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
15680 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
15690 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Ref==0 );..  /* 
156a0 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 74  Write the page t
156b0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
156c0 69 6c 65 20 69 66 20 69 74 20 69 73 20 64 69 72  ile if it is dir
156d0 74 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ty..  */.  if( p
156e0 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20  Pg->dirty ){.   
156f0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73   int rc;.    ass
15700 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79  ert( pPg->needSy
15710 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 6d 61 6b  nc==0 );.    mak
15720 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
15730 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b   pPg->dirty = 1;
15740 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79  .    pPg->pDirty
15750 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70   = 0;.    rc = p
15760 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
15770 69 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20  ist( pPg );.    
15780 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15790 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
157a0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
157b0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64    assert( pPg->d
157c0 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  irty==0 );..  /*
157d0 20 49 66 20 74 68 65 20 70 61 67 65 20 77 65 20   If the page we 
157e0 61 72 65 20 72 65 63 79 63 6c 69 6e 67 20 69 73  are recycling is
157f0 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79   marked as alway
15800 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a  sRollback, then.
15810 20 20 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f    ** set the glo
15820 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  bal alwaysRollba
15830 63 6b 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69  ck flag, thus di
15840 73 61 62 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a  sabling the.  **
15850 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
15860 74 52 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69  tRollback() opti
15870 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  mization for the
15880 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 74 72   rest of this tr
15890 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
158a0 49 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  It is necessary 
158b0 74 6f 20 64 6f 20 74 68 69 73 20 62 65 63 61 75  to do this becau
158c0 73 65 20 74 68 65 20 70 61 67 65 20 6d 61 72 6b  se the page mark
158d0 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ed alwaysRollbac
158e0 6b 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20  k.  ** might be 
158f0 72 65 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61  reloaded at a la
15900 74 65 72 20 74 69 6d 65 20 62 75 74 20 61 74 20  ter time but at 
15910 74 68 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f  that point we wo
15920 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a  n't remember.  *
15930 2a 20 74 68 61 74 20 69 73 20 77 61 73 20 6d 61  * that is was ma
15940 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62  rked alwaysRollb
15950 61 63 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e 73  ack.  This means
15960 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20   that all pages 
15970 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 6d 61 72  must.  ** be mar
15980 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c  ked as alwaysRol
15990 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65 72 65 20  lback from here 
159a0 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20 69  on out..  */.  i
159b0 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  f( pPg->alwaysRo
159c0 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 49 4f  llback ){.    IO
159d0 54 52 41 43 45 28 28 22 41 4c 57 41 59 53 5f 52  TRACE(("ALWAYS_R
159e0 4f 4c 4c 42 41 43 4b 20 25 70 5c 6e 22 2c 20 70  OLLBACK %p\n", p
159f0 50 61 67 65 72 29 29 0a 20 20 20 20 70 50 61 67  Pager)).    pPag
15a00 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
15a10 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  ck = 1;.  }..  /
15a20 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64  * Unlink the old
15a30 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
15a40 72 65 65 20 6c 69 73 74 20 61 6e 64 20 74 68 65  ree list and the
15a50 20 68 61 73 68 20 74 61 62 6c 65 0a 20 20 2a 2f   hash table.  */
15a60 0a 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50  .  unlinkPage(pP
15a70 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  g);.  assert( pP
15a80 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 3b 0a 0a 20  g->pgno==0 );.. 
15a90 20 2a 70 70 50 67 20 3d 20 70 50 67 3b 0a 20 20   *ppPg = pPg;.  
15aa0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15ab0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
15ac0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
15ad0 65 64 20 74 6f 20 66 72 65 65 20 73 75 70 65 72  ed to free super
15ae0 66 6c 75 6f 75 73 20 64 79 6e 61 6d 69 63 61 6c  fluous dynamical
15af0 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d  ly allocated mem
15b00 6f 72 79 0a 2a 2a 20 68 65 6c 64 20 62 79 20 74  ory.** held by t
15b10 68 65 20 70 61 67 65 72 20 73 79 73 74 65 6d 2e  he pager system.
15b20 20 4d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62   Memory in use b
15b30 79 20 61 6e 79 20 53 51 4c 69 74 65 20 70 61 67  y any SQLite pag
15b40 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  er allocated.** 
15b50 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  by the current t
15b60 68 72 65 61 64 20 6d 61 79 20 62 65 20 73 71 6c  hread may be sql
15b70 69 74 65 46 72 65 65 28 29 65 64 2e 0a 2a 2a 0a  iteFree()ed..**.
15b80 2a 2a 20 6e 52 65 71 20 69 73 20 74 68 65 20 6e  ** nReq is the n
15b90 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
15ba0 66 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65  f memory require
15bb0 64 2e 20 4f 6e 63 65 20 74 68 69 73 20 6d 75 63  d. Once this muc
15bc0 68 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 72 65  h has.** been re
15bd0 6c 65 61 73 65 64 2c 20 74 68 65 20 66 75 6e 63  leased, the func
15be0 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 41 20  tion returns. A 
15bf0 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 20 66  negative value f
15c00 6f 72 20 6e 52 65 71 20 6d 65 61 6e 73 0a 2a 2a  or nReq means.**
15c10 20 66 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65   free as much me
15c20 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65  mory as possible
15c30 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  . The return val
15c40 75 65 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20  ue is the total 
15c50 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 62 79  number .** of by
15c60 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65  tes of memory re
15c70 6c 65 61 73 65 64 2e 0a 2a 2f 0a 23 69 66 20 64  leased..*/.#if d
15c80 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
15c90 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
15ca0 47 45 4d 45 4e 54 29 20 26 26 20 21 64 65 66 69  GEMENT) && !defi
15cb0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
15cc0 44 49 53 4b 49 4f 29 0a 69 6e 74 20 73 71 6c 69  DISKIO).int sqli
15cd0 74 65 33 50 61 67 65 72 52 65 6c 65 61 73 65 4d  te3PagerReleaseM
15ce0 65 6d 6f 72 79 28 69 6e 74 20 6e 52 65 71 29 7b  emory(int nReq){
15cf0 0a 20 20 63 6f 6e 73 74 20 54 68 72 65 61 64 44  .  const ThreadD
15d00 61 74 61 20 2a 70 54 73 64 72 6f 20 3d 20 73 71  ata *pTsdro = sq
15d10 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 52  lite3ThreadDataR
15d20 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 69 6e 74  eadOnly();.  int
15d30 20 6e 52 65 6c 65 61 73 65 64 20 3d 20 30 3b 0a   nReleased = 0;.
15d40 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 49    int i;..  /* I
15d50 66 20 74 68 65 20 74 68 65 20 67 6c 6f 62 61 6c  f the the global
15d60 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20   mutex is held, 
15d70 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  this subroutine 
15d80 62 65 63 6f 6d 65 73 20 61 0a 20 20 2a 2a 20 6f  becomes a.  ** o
15d90 2d 6f 70 3b 20 7a 65 72 6f 20 62 79 74 65 73 20  -op; zero bytes 
15da0 6f 66 20 6d 65 6d 6f 72 79 20 61 72 65 20 66 72  of memory are fr
15db0 65 65 64 2e 20 20 54 68 69 73 20 69 73 20 62 65  eed.  This is be
15dc0 63 61 75 73 65 0a 20 20 2a 2a 20 73 6f 6d 65 20  cause.  ** some 
15dd0 6f 66 20 74 68 65 20 63 6f 64 65 20 69 6e 76 6f  of the code invo
15de0 6b 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ked by this func
15df0 74 69 6f 6e 20 6d 61 79 20 61 6c 73 6f 0a 20 20  tion may also.  
15e00 2a 2a 20 74 72 79 20 74 6f 20 6f 62 74 61 69 6e  ** try to obtain
15e10 20 74 68 65 20 6d 75 74 65 78 2c 20 72 65 73 75   the mutex, resu
15e20 6c 74 69 6e 67 20 69 6e 20 61 20 64 65 61 64 6c  lting in a deadl
15e30 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
15e40 73 71 6c 69 74 65 33 4f 73 49 6e 4d 75 74 65 78  sqlite3OsInMutex
15e50 28 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  (0) ){.    retur
15e60 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  n 0;.  }..  /* O
15e70 75 74 65 72 6d 6f 73 74 20 6c 6f 6f 70 20 72 75  utermost loop ru
15e80 6e 73 20 66 6f 72 20 61 74 20 6d 6f 73 74 20 74  ns for at most t
15e90 77 6f 20 69 74 65 72 61 74 69 6f 6e 73 2e 20 46  wo iterations. F
15ea0 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 77  irst iteration w
15eb0 65 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 66 69  e.  ** try to fi
15ec0 6e 64 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 63  nd memory that c
15ed0 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 77  an be released w
15ee0 69 74 68 6f 75 74 20 63 61 6c 6c 69 6e 67 20 66  ithout calling f
15ef0 73 79 6e 63 28 29 2e 20 53 65 63 6f 6e 64 0a 20  sync(). Second. 
15f00 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e 20 28 77   ** iteration (w
15f10 68 69 63 68 20 6f 6e 6c 79 20 72 75 6e 73 20 69  hich only runs i
15f20 66 20 74 68 65 20 66 69 72 73 74 20 66 61 69 6c  f the first fail
15f30 65 64 20 74 6f 20 66 72 65 65 20 6e 52 65 71 20  ed to free nReq 
15f40 62 79 74 65 73 20 6f 66 0a 20 20 2a 2a 20 6d 65  bytes of.  ** me
15f50 6d 6f 72 79 29 20 69 73 20 70 65 72 6d 69 74 74  mory) is permitt
15f60 65 64 20 74 6f 20 63 61 6c 6c 20 66 73 79 6e 63  ed to call fsync
15f70 28 29 2e 20 54 68 69 73 20 69 73 20 6f 66 20 63  (). This is of c
15f80 6f 75 72 73 65 20 6d 75 63 68 20 6d 6f 72 65 20  ourse much more 
15f90 0a 20 20 2a 2a 20 65 78 70 65 6e 73 69 76 65 2e  .  ** expensive.
15fa0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
15fb0 20 69 3c 3d 31 3b 20 69 2b 2b 29 7b 0a 0a 20 20   i<=1; i++){..  
15fc0 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
15fd0 68 20 61 6c 6c 20 74 68 65 20 53 51 4c 69 74 65  h all the SQLite
15fe0 20 70 61 67 65 72 73 20 6f 70 65 6e 65 64 20 62   pagers opened b
15ff0 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  y the current th
16000 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20 50 61 67  read. */.    Pag
16010 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 54 73  er *pPager = pTs
16020 64 72 6f 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20  dro->pPager;.   
16030 20 66 6f 72 28 20 3b 20 70 50 61 67 65 72 20 26   for( ; pPager &
16040 26 20 28 6e 52 65 71 3c 30 20 7c 7c 20 6e 52 65  & (nReq<0 || nRe
16050 6c 65 61 73 65 64 3c 6e 52 65 71 29 3b 20 70 50  leased<nReq); pP
16060 61 67 65 72 3d 70 50 61 67 65 72 2d 3e 70 4e 65  ager=pPager->pNe
16070 78 74 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  xt){.      PgHdr
16080 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 69 6e 74   *pPg;.      int
16090 20 72 63 3b 0a 0a 20 20 20 20 20 20 69 66 28 20   rc;..      if( 
160a0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
160b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
160c0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72   }..      /* For
160d0 20 65 61 63 68 20 70 61 67 65 72 2c 20 74 72 79   each pager, try
160e0 20 74 6f 20 66 72 65 65 20 61 73 20 6d 61 6e 79   to free as many
160f0 20 70 61 67 65 73 20 61 73 20 70 6f 73 73 69 62   pages as possib
16100 6c 65 20 28 77 69 74 68 6f 75 74 20 0a 20 20 20  le (without .   
16110 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 73     ** calling fs
16120 79 6e 63 28 29 20 69 66 20 74 68 69 73 20 69 73  ync() if this is
16130 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61   the first itera
16140 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 75 74 65  tion of the oute
16150 72 6d 6f 73 74 20 0a 20 20 20 20 20 20 2a 2a 20  rmost .      ** 
16160 6c 6f 6f 70 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  loop)..      */.
16170 20 20 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c        while( SQL
16180 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 70 61  ITE_OK==(rc = pa
16190 67 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67  ger_recycle(pPag
161a0 65 72 2c 20 69 2c 20 26 70 50 67 29 29 20 26 26  er, i, &pPg)) &&
161b0 20 70 50 67 29 20 7b 0a 20 20 20 20 20 20 20 20   pPg) {.        
161c0 2f 2a 20 57 65 27 76 65 20 66 6f 75 6e 64 20 61  /* We've found a
161d0 20 70 61 67 65 20 74 6f 20 66 72 65 65 2e 20 41   page to free. A
161e0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
161f0 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 0a   page has been .
16200 20 20 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f 76          ** remov
16210 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ed from the page
16220 20 68 61 73 68 2d 74 61 62 6c 65 2c 20 66 72 65   hash-table, fre
16230 65 2d 6c 69 73 74 20 61 6e 64 20 73 79 6e 63 65  e-list and synce
16240 64 2d 6c 69 73 74 20 0a 20 20 20 20 20 20 20 20  d-list .        
16250 2a 2a 20 28 70 46 69 72 73 74 53 79 6e 63 65 64  ** (pFirstSynced
16260 29 2e 20 49 74 20 69 73 20 73 74 69 6c 6c 20 69  ). It is still i
16270 6e 20 74 68 65 20 61 6c 6c 20 70 61 67 65 73 20  n the all pages 
16280 28 70 41 6c 6c 29 20 6c 69 73 74 2e 20 0a 20 20  (pAll) list. .  
16290 20 20 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20        ** Remove 
162a0 69 74 20 66 72 6f 6d 20 74 68 69 73 20 6c 69 73  it from this lis
162b0 74 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67  t before freeing
162c0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
162d0 20 20 20 20 20 2a 2a 20 54 6f 64 6f 3a 20 43 68       ** Todo: Ch
162e0 65 63 6b 20 74 68 65 20 50 61 67 65 72 2e 70 53  eck the Pager.pS
162f0 74 6d 74 20 6c 69 73 74 20 74 6f 20 6d 61 6b 65  tmt list to make
16300 20 73 75 72 65 20 74 68 69 73 20 69 73 20 4f 6b   sure this is Ok
16310 2e 20 49 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  . It .        **
16320 20 70 72 6f 62 61 62 6c 79 20 69 73 20 74 68 6f   probably is tho
16330 75 67 68 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ugh..        */.
16340 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70          PgHdr *p
16350 54 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Tmp;.        ass
16360 65 72 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20  ert( pPg );.    
16370 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50 61      if( pPg==pPa
16380 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20  ger->pAll ){.   
16390 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
163a0 70 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78  pAll = pPg->pNex
163b0 74 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65  tAll;.        }e
163c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66  lse{.          f
163d0 6f 72 28 20 70 54 6d 70 3d 70 50 61 67 65 72 2d  or( pTmp=pPager-
163e0 3e 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e 70 4e 65  >pAll; pTmp->pNe
163f0 78 74 41 6c 6c 21 3d 70 50 67 3b 20 70 54 6d 70  xtAll!=pPg; pTmp
16400 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20  =pTmp->pNextAll 
16410 29 7b 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54  ){}.          pT
16420 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70  mp->pNextAll = p
16430 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
16440 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16450 6e 52 65 6c 65 61 73 65 64 20 2b 3d 20 73 71 6c  nReleased += sql
16460 69 74 65 41 6c 6c 6f 63 53 69 7a 65 28 70 50 67  iteAllocSize(pPg
16470 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  );.        IOTRA
16480 43 45 28 28 22 50 47 46 52 45 45 20 25 70 20 25  CE(("PGFREE %p %
16490 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
164a0 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  g->pgno));.     
164b0 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
164c0 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72  lite3_pager_pgfr
164d0 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20  ee_count);.     
164e0 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
164f0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  g);.      }..   
16500 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16510 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16520 2f 2a 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  /* An error occu
16530 72 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69  red whilst writi
16540 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
16550 73 65 20 66 69 6c 65 20 6f 72 20 0a 20 20 20 20  se file or .    
16560 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69      ** journal i
16570 6e 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28  n pager_recycle(
16580 29 2e 20 54 68 65 20 65 72 72 6f 72 20 69 73 20  ). The error is 
16590 6e 6f 74 20 72 65 74 75 72 6e 65 64 20 74 6f 20  not returned to 
165a0 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
165b0 63 61 6c 6c 65 72 20 6f 66 20 74 68 69 73 20 66  caller of this f
165c0 75 6e 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64  unction. Instead
165d0 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e  , set the Pager.
165e0 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
165f0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65  ..        ** The
16600 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72   error will be r
16610 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75  eturned to the u
16620 73 65 72 20 28 6f 72 20 75 73 65 72 73 2c 20 69  ser (or users, i
16630 6e 20 74 68 65 20 63 61 73 65 20 0a 20 20 20 20  n the case .    
16640 20 20 20 20 2a 2a 20 6f 66 20 61 20 73 68 61 72      ** of a shar
16650 65 64 20 70 61 67 65 72 20 63 61 63 68 65 29 20  ed pager cache) 
16660 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 6f 72  of the pager for
16670 20 77 68 69 63 68 20 74 68 65 20 65 72 72 6f 72   which the error
16680 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 20 20   occured..      
16690 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
166a0 65 72 74 28 20 28 72 63 26 30 78 66 66 29 3d 3d  ert( (rc&0xff)==
166b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 20  SQLITE_IOERR || 
166c0 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  rc==SQLITE_FULL 
166d0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
166e0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
166f0 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
16700 20 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65   );.        page
16710 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
16720 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc);.      }.   
16730 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
16740 20 6e 52 65 6c 65 61 73 65 64 3b 0a 7d 0a 23 65   nReleased;.}.#e
16750 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
16760 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
16770 41 47 45 4d 45 4e 54 20 26 26 20 21 53 51 4c 49  AGEMENT && !SQLI
16780 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a  TE_OMIT_DISKIO *
16790 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  /../*.** Read th
167a0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67  e content of pag
167b0 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65  e pPg out of the
167c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
167d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
167e0 61 64 44 62 50 61 67 65 28 50 61 67 65 72 20 2a  adDbPage(Pager *
167f0 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70  pPager, PgHdr *p
16800 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Pg, Pgno pgno){.
16810 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
16820 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a  rt( MEMDB==0 );.
16830 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
16840 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Seek(pPager->fd,
16850 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
16860 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
16870 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
16880 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
16890 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
168a0 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44  pPager->fd, PGHD
168b0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 0a  R_TO_DATA(pPg),.
168c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168d0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
168e0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d  ->pageSize);.  }
168f0 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71  .  PAGER_INCR(sq
16900 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64  lite3_pager_read
16910 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47  db_count);.  PAG
16920 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
16930 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43  nRead);.  IOTRAC
16940 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e  E(("PGIN %p %d\n
16950 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
16960 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 33  );.  PAGERTRACE3
16970 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20  ("FETCH %d page 
16980 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
16990 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
169a0 6f 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d  o);.  if( pgno==
169b0 31 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  1 ){.    memcpy(
169c0 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
169d0 65 72 73 2c 20 26 28 28 75 38 2a 29 50 47 48 44  ers, &((u8*)PGHD
169e0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29 5b  R_TO_DATA(pPg))[
169f0 32 34 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  24],.           
16a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a20 20 20 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72     sizeof(pPager
16a30 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
16a40 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61    }.  CODEC1(pPa
16a50 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  ger, PGHDR_TO_DA
16a60 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70 67  TA(pPg), pPg->pg
16a70 6e 6f 2c 20 33 29 3b 0a 20 20 72 65 74 75 72 6e  no, 3);.  return
16a80 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
16a90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
16aa0 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e  called to obtain
16ab0 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
16ac0 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65   required before
16ad0 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62 65 20  .** data may be 
16ae0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61  read from the pa
16af0 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68  ger cache. If th
16b00 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 68 61  e shared lock ha
16b10 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65  s already.** bee
16b20 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 69 73  n obtained, this
16b30 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
16b40 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65  o-op..**.** Imme
16b50 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62  diately after ob
16b60 74 61 69 6e 69 6e 67 20 74 68 65 20 73 68 61 72  taining the shar
16b70 65 64 20 6c 6f 63 6b 20 28 69 66 20 72 65 71 75  ed lock (if requ
16b80 69 72 65 64 29 2c 20 74 68 69 73 20 66 75 6e 63  ired), this func
16b90 74 69 6f 6e 0a 2a 2a 20 63 68 65 63 6b 73 20 66  tion.** checks f
16ba0 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
16bb0 20 66 69 6c 65 2e 20 49 66 20 6f 6e 65 20 69 73   file. If one is
16bc0 20 66 6f 75 6e 64 2c 20 61 6e 20 65 6d 65 72 67   found, an emerg
16bd0 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  ency rollback.**
16be0 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 69 6d   is performed im
16bf0 6d 65 64 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74  mediately..*/.st
16c00 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 68  atic int pagerSh
16c10 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a  aredLock(Pager *
16c20 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
16c30 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
16c40 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
16c50 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
16c60 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 21 4d 45  K ){.    if( !ME
16c70 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 61 73 73  MDB ){.      ass
16c80 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
16c90 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  f==0 );.      if
16ca0 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  ( !pPager->noRea
16cb0 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  dlock ){.       
16cc0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
16cd0 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
16ce0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
16cf0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
16d00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16d10 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67        return pag
16d20 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
16d30 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   rc);.        }.
16d40 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16d50 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53  pPager->state>=S
16d60 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
16d70 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f      }.  .      /
16d80 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  * If a journal f
16d90 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20  ile exists, and 
16da0 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45  there is no RESE
16db0 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
16dc0 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
16dd0 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  se file, then it
16de0 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f   either needs to
16df0 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
16e00 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  or deleted..    
16e10 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 68    */.      if( h
16e20 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  asHotJournal(pPa
16e30 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
16e40 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
16e50 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
16e60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
16e70 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
16e80 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6d  is.        ** im
16e90 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52  portant that a R
16ea0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
16eb0 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20  not obtained on 
16ec0 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20  the way to the. 
16ed0 20 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53         ** EXCLUS
16ee0 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20  IVE lock. If it 
16ef0 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72  were, another pr
16f00 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e  ocess might open
16f10 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
16f20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64  database file, d
16f30 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56  etect the RESERV
16f40 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e  ED lock, and con
16f50 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20  clude that the. 
16f60 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61         ** databa
16f70 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  se is safe to re
16f80 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72  ad while this pr
16f90 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72  ocess is still r
16fa0 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20 20 20  olling it .     
16fb0 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20     ** back..    
16fc0 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20      ** .        
16fd0 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69  ** Because the i
16fe0 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45  ntermediate RESE
16ff0 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
17000 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a   requested, the.
17010 20 20 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e          ** secon
17020 64 20 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67  d process will g
17030 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  et to this point
17040 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64   in the code and
17050 20 66 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 20   fail to.       
17060 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74 27 73 20   ** obtain it's 
17070 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  own EXCLUSIVE lo
17080 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
17090 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  se file..       
170a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
170b0 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
170c0 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55  Pager->fd, EXCLU
170d0 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
170e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
170f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
17100 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
17110 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
17120 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
17130 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
17140 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
17150 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
17160 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
17170 53 49 56 45 3b 0a 20 0a 20 20 20 20 20 20 20 20  SIVE;. .        
17180 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
17190 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e 67 20  nal for reading 
171a0 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 53 51  only.  Return SQ
171b0 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20 20 20  LITE_BUSY if.   
171c0 20 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20 75       ** we are u
171d0 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68  nable to open th
171e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
171f0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
17200 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e      ** The journ
17210 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
17220 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b   need to be lock
17230 65 64 20 69 74 73 65 6c 66 2e 20 20 54 68 65 0a  ed itself.  The.
17240 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e          ** journ
17250 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72  al file is never
17260 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74 68 65   open unless the
17270 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
17280 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20 20 20  ile holds.      
17290 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63    ** a write loc
172a0 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e  k, so there is n
172b0 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63 65 20  ever any chance 
172c0 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20  of two or more. 
172d0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
172e0 73 65 73 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  ses opening the 
172f0 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 65 20 73  journal at the s
17300 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 20 20  ame time..      
17310 20 20 2a 2a 0a 09 2a 2a 20 4f 70 65 6e 20 74 68    **..** Open th
17320 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65  e journal for re
17330 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e  ad/write access.
17340 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
17350 20 69 6e 20 0a 09 2a 2a 20 65 78 63 6c 75 73 69   in ..** exclusi
17360 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74  ve-access mode t
17370 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
17380 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20  or will be kept 
17390 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20 20  open and.       
173a0 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75 73 65   ** possibly use
173b0 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  d for a transact
173c0 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e  ion later on. On
173d0 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 74   some systems, t
173e0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 73  he.        ** Os
173f0 54 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20  Truncate() call 
17400 75 73 65 64 20 69 6e 20 65 78 63 6c 75 73 69 76  used in exclusiv
17410 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 61 6c  e-access mode al
17420 73 6f 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  so requires.    
17430 20 20 20 20 2a 2a 20 61 20 72 65 61 64 2f 77 72      ** a read/wr
17440 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e  ite file handle.
17450 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
17460 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
17470 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 69 66  BUSY;.        if
17480 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45  ( sqlite3OsFileE
17490 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a  xists(pPager->zJ
174a0 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20  ournal) ){.     
174b0 20 20 20 20 20 69 6e 74 20 72 6f 3b 0a 20 20 20       int ro;.   
174c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
174d0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
174e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
174f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
17500 52 65 61 64 57 72 69 74 65 28 70 50 61 67 65 72  ReadWrite(pPager
17510 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61  ->zJournal, &pPa
17520 67 65 72 2d 3e 6a 66 64 2c 20 26 72 6f 29 3b 0a  ger->jfd, &ro);.
17530 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
17540 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17550 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 29  || pPager->jfd )
17560 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
17570 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ro ){.          
17580 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
17590 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  SY;.            
175a0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
175b0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
175c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
175d0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
175e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
175f0 0a 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72  .          pager
17600 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
17610 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
17620 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
17630 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17640 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
17650 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Open = 1;.      
17660 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
17670 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
17680 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
17690 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
176a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65        pPager->se
176b0 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  tMaster = 0;.   
176c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
176d0 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20  rnalHdr = 0;. . 
176e0 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61         /* Playba
176f0 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ck and delete th
17700 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70  e journal.  Drop
17710 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72   the database wr
17720 69 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c  ite.        ** l
17730 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
17740 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
17750 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
17760 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
17770 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
17780 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
17790 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
177a0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
177b0 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
177c0 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
177d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
177e0 65 72 74 28 70 50 61 67 65 72 2d 3e 73 74 61 74  ert(pPager->stat
177f0 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e==PAGER_SHARED 
17800 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
17810 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  (pPager->exclusi
17820 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
17830 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48  ->state>PAGER_SH
17840 41 52 45 44 29 0a 20 20 20 20 20 20 20 20 29 3b  ARED).        );
17850 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
17860 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c  if( pPager->pAll
17870 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
17880 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68  he shared-lock h
17890 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71  as just been acq
178a0 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74  uired on the dat
178b0 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20  abase file.     
178c0 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20     ** and there 
178d0 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67 65  are already page
178e0 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 28  s in the cache (
178f0 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a  from a previous.
17900 20 20 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20          ** read 
17910 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
17920 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f  tion).  Check to
17930 20 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61   see if the data
17940 62 61 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  base.        ** 
17950 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
17960 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  d.  If the datab
17970 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c  ase has changed,
17980 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20   flush the.     
17990 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20     ** cache..   
179a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
179b0 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e  ** Database chan
179c0 67 65 73 20 69 73 20 64 65 74 65 63 74 65 64 20  ges is detected 
179d0 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35  by looking at 15
179e0 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67   bytes beginning
179f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6f  .        ** at o
17a00 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68  ffset 24 into th
17a10 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72  e file.  The fir
17a20 73 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36  st 4 of these 16
17a30 20 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20   bytes are.     
17a40 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63     ** a 32-bit c
17a50 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73 20 69  ounter that is i
17a60 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20  ncremented with 
17a70 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68  each change.  Th
17a80 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68  e.        ** oth
17a90 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20  er bytes change 
17aa0 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61  randomly with ea
17ab0 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77  ch file change w
17ac0 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hen.        ** a
17ad0 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65   codec is in use
17ae0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20  ..        ** .  
17af0 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69        ** There i
17b00 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20  s a vanishingly 
17b10 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61  small chance tha
17b20 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20  t a change will 
17b30 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20 20 20  not be .        
17b40 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54 68  ** detected.  Th
17b50 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75  e chance of an u
17b60 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65  ndetected change
17b70 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61   is so small tha
17b80 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  t.        ** it 
17b90 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64  can be neglected
17ba0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
17bb0 20 20 20 20 20 63 68 61 72 20 64 62 46 69 6c 65       char dbFile
17bc0 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67  Vers[sizeof(pPag
17bd0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d  er->dbFileVers)]
17be0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
17bf0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
17c00 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20  pPager);..      
17c10 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
17c20 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  rCode ){.       
17c30 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
17c40 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20  ->errCode;.     
17c50 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
17c60 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
17c70 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
17c80 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53  IOTRACE(("CKVERS
17c90 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
17ca0 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  r, sizeof(dbFile
17cb0 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20  Vers)));.       
17cc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
17cd0 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64  sSeek(pPager->fd
17ce0 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20 20  , 24);.         
17cf0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17d00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
17d10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
17d20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17d30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
17d40 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
17d50 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73  , &dbFileVers, s
17d60 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
17d70 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ));.          if
17d80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17d90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
17da0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
17db0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
17dc0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  lse{.          m
17dd0 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73  emset(dbFileVers
17de0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  , 0, sizeof(dbFi
17df0 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
17e00 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28    }..        if(
17e10 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e   memcmp(pPager->
17e20 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
17e30 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
17e40 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29  bFileVers))!=0 )
17e50 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67 65  {.          page
17e60 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
17e70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17e80 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
17e90 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78 63  ert( pPager->exc
17ea0 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50  lusiveMode || pP
17eb0 61 67 65 72 2d 3e 73 74 61 74 65 3c 3d 50 41 47  ager->state<=PAG
17ec0 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20  ER_SHARED );.   
17ed0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
17ee0 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
17ef0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
17f00 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
17f10 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20  SHARED;.    }.  
17f20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
17f30 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
17f40 65 20 61 20 50 67 48 64 72 20 6f 62 6a 65 63 74  e a PgHdr object
17f50 2e 20 20 20 45 69 74 68 65 72 20 63 72 65 61 74  .   Either creat
17f60 65 20 61 20 6e 65 77 20 6f 6e 65 20 6f 72 20 72  e a new one or r
17f70 65 75 73 65 0a 2a 2a 20 61 6e 20 65 78 69 73 74  euse.** an exist
17f80 69 6e 67 20 6f 6e 65 20 74 68 61 74 20 69 73 20  ing one that is 
17f90 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20 69 6e  not otherwise in
17fa0 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65   use..**.** A ne
17fb0 77 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72  w PgHdr structur
17fc0 65 20 69 73 20 63 72 65 61 74 65 64 20 69 66 20  e is created if 
17fd0 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
17fe0 77 69 6e 67 20 61 72 65 0a 2a 2a 20 74 72 75 65  wing are.** true
17ff0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
18000 20 57 65 20 68 61 76 65 20 6e 6f 74 20 65 78 63   We have not exc
18010 65 65 64 65 64 20 6f 75 72 20 6d 61 78 69 6d 75  eeded our maximu
18020 6d 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 63 68  m allocated cach
18030 65 20 73 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20  e size.**       
18040 20 20 20 61 73 20 73 65 74 20 62 79 20 74 68 65     as set by the
18050 20 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73   "PRAGMA cache_s
18060 69 7a 65 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  ize" command..**
18070 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 54 68 65  .**     (2)  The
18080 72 65 20 61 72 65 20 6e 6f 20 75 6e 75 73 65 64  re are no unused
18090 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 61   PgHdr objects a
180a0 76 61 69 6c 61 62 6c 65 20 61 74 20 74 68 69 73  vailable at this
180b0 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   time..**.**    
180c0 20 28 33 29 20 20 54 68 69 73 20 69 73 20 61 6e   (3)  This is an
180d0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
180e0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ase..**.**     (
180f0 34 29 20 20 54 68 65 72 65 20 61 72 65 20 6e 6f  4)  There are no
18100 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 74   PgHdr objects t
18110 68 61 74 20 64 6f 20 6e 6f 74 20 72 65 71 75 69  hat do not requi
18120 72 65 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  re a journal.** 
18130 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 73 79           file sy
18140 6e 63 20 61 6e 64 20 61 20 73 79 6e 63 20 6f 66  nc and a sync of
18150 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
18160 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a  e is currently.*
18170 2a 20 20 20 20 20 20 20 20 20 20 70 72 6f 68 69  *          prohi
18180 62 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  bited..**.** Oth
18190 65 72 77 69 73 65 2c 20 72 65 75 73 65 20 61 6e  erwise, reuse an
181a0 20 65 78 69 73 74 69 6e 67 20 50 67 48 64 72 2e   existing PgHdr.
181b0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
181c0 2c 20 72 65 75 73 65 20 61 6e 0a 2a 2a 20 65 78  , reuse an.** ex
181d0 69 73 74 69 6e 67 20 50 67 48 64 72 20 69 66 20  isting PgHdr if 
181e0 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
181f0 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
18200 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 57 65  *.**     (1)  We
18210 20 68 61 76 65 20 72 65 61 63 68 65 64 20 6f 72   have reached or
18220 20 65 78 63 65 65 64 65 64 20 74 68 65 20 6d 61   exceeded the ma
18230 78 69 6d 75 6d 20 63 61 63 68 65 20 73 69 7a 65  ximum cache size
18240 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61 6c 6c  .**          all
18250 6f 77 65 64 20 62 79 20 22 50 52 41 47 4d 41 20  owed by "PRAGMA 
18260 63 61 63 68 65 5f 73 69 7a 65 22 2e 0a 2a 2a 0a  cache_size"..**.
18270 2a 2a 20 20 20 20 20 28 32 29 20 20 54 68 65 72  **     (2)  Ther
18280 65 20 69 73 20 61 20 50 67 48 64 72 20 61 76 61  e is a PgHdr ava
18290 69 6c 61 62 6c 65 20 77 69 74 68 20 50 67 48 64  ilable with PgHd
182a0 72 2d 3e 6e 52 65 66 3d 3d 30 0a 2a 2a 0a 2a 2a  r->nRef==0.**.**
182b0 20 20 20 20 20 28 33 29 20 20 57 65 20 61 72 65       (3)  We are
182c0 20 6e 6f 74 20 69 6e 20 61 6e 20 69 6e 2d 6d 65   not in an in-me
182d0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a  mory database.**
182e0 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 45 69 74  .**     (4)  Eit
182f0 68 65 72 20 74 68 65 72 65 20 69 73 20 61 6e 20  her there is an 
18300 61 76 61 69 6c 61 62 6c 65 20 50 67 48 64 72 20  available PgHdr 
18310 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  that does not ne
18320 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74  ed.**          t
18330 6f 20 62 65 20 73 79 6e 63 65 64 20 74 6f 20 64  o be synced to d
18340 69 73 6b 20 6f 72 20 65 6c 73 65 20 64 69 73 6b  isk or else disk
18350 20 73 79 6e 63 69 6e 67 20 69 73 20 63 75 72 72   syncing is curr
18360 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20  ently.**        
18370 20 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 73 74    allowed..*/.st
18380 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 41 6c  atic int pagerAl
18390 6c 6f 63 61 74 65 50 61 67 65 28 50 61 67 65 72  locatePage(Pager
183a0 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
183b0 2a 2a 70 70 50 67 29 7b 0a 20 20 69 6e 74 20 72  **ppPg){.  int r
183c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
183d0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
183e0 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  /* Create a new 
183f0 50 67 48 64 72 20 69 66 20 61 6e 79 20 6f 66 20  PgHdr if any of 
18400 74 68 65 20 66 6f 75 72 20 63 6f 6e 64 69 74 69  the four conditi
18410 6f 6e 73 20 64 65 66 69 6e 65 64 20 0a 20 20 2a  ons defined .  *
18420 2a 20 61 62 6f 76 65 20 69 73 20 6d 65 74 3a 20  * above is met: 
18430 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
18440 3e 6e 50 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d  >nPage<pPager->m
18450 78 50 61 67 65 0a 20 20 20 7c 7c 20 70 50 61 67  xPage.   || pPag
18460 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20 0a 20  er->pFirst==0 . 
18470 20 20 7c 7c 20 4d 45 4d 44 42 0a 20 20 20 7c 7c    || MEMDB.   ||
18480 20 28 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74   (pPager->pFirst
18490 53 79 6e 63 65 64 3d 3d 30 20 26 26 20 70 50 61  Synced==0 && pPa
184a0 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 29 0a  ger->doNotSync).
184b0 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61    ){.    if( pPa
184c0 67 65 72 2d 3e 6e 50 61 67 65 3e 3d 70 50 61 67  ger->nPage>=pPag
184d0 65 72 2d 3e 6e 48 61 73 68 20 29 7b 0a 20 20 20  er->nHash ){.   
184e0 20 20 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f     pager_resize_
184f0 68 61 73 68 5f 74 61 62 6c 65 28 70 50 61 67 65  hash_table(pPage
18500 72 2c 0a 20 20 20 20 20 20 20 20 20 70 50 61 67  r,.         pPag
18510 65 72 2d 3e 6e 48 61 73 68 3c 32 35 36 20 3f 20  er->nHash<256 ? 
18520 32 35 36 20 3a 20 70 50 61 67 65 72 2d 3e 6e 48  256 : pPager->nH
18530 61 73 68 2a 32 29 3b 0a 20 20 20 20 20 20 69 66  ash*2);.      if
18540 28 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 3d  ( pPager->nHash=
18550 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
18560 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
18570 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
18580 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74  ger_allocate_out
18590 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
185a0 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
185b0 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f  MallocRaw( sizeo
185c0 66 28 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72  f(*pPg) + pPager
185d0 2d 3e 70 61 67 65 53 69 7a 65 0a 20 20 20 20 20  ->pageSize.     
185e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185f0 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28         + sizeof(
18600 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e  u32) + pPager->n
18610 45 78 74 72 61 0a 20 20 20 20 20 20 20 20 20 20  Extra.          
18620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18630 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66    + MEMDB*sizeof
18640 28 50 67 48 69 73 74 6f 72 79 29 20 29 3b 0a 20  (PgHistory) );. 
18650 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b     if( pPg==0 ){
18660 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
18670 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
18680 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63  goto pager_alloc
18690 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ate_out;.    }. 
186a0 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2c 20 30     memset(pPg, 0
186b0 2c 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b  , sizeof(*pPg));
186c0 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29  .    if( MEMDB )
186d0 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50  {.      memset(P
186e0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
186f0 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 73 69  , pPager), 0, si
18700 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 29  zeof(PgHistory))
18710 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
18720 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
18730 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
18740 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41  All = pPager->pA
18750 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ll;.    pPager->
18760 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20  pAll = pPg;.    
18770 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b  pPager->nPage++;
18780 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
18790 20 52 65 63 79 63 6c 65 20 61 6e 20 65 78 69 73   Recycle an exis
187a0 74 69 6e 67 20 70 61 67 65 20 77 69 74 68 20 61  ting page with a
187b0 20 7a 65 72 6f 20 72 65 66 2d 63 6f 75 6e 74 2e   zero ref-count.
187c0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
187d0 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65  er_recycle(pPage
187e0 72 2c 20 31 2c 20 26 70 50 67 29 3b 0a 20 20 20  r, 1, &pPg);.   
187f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18800 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
18810 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f   pager_allocate_
18820 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  out;.    }.    a
18830 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
18840 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  tate>=SHARED_LOC
18850 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
18860 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50  pPg);.  }.  *ppP
18870 67 20 3d 20 70 50 67 3b 0a 0a 70 61 67 65 72 5f  g = pPg;..pager_
18880 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3a 0a 20 20  allocate_out:.  
18890 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
188a0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65  .** Make sure we
188b0 20 68 61 76 65 20 74 68 65 20 63 6f 6e 74 65 6e   have the conten
188c0 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 49  t for a page.  I
188d0 66 20 74 68 65 20 70 61 67 65 20 77 61 73 0a 2a  f the page was.*
188e0 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 61 63 71  * previously acq
188f0 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e  uired with noCon
18900 74 65 6e 74 3d 3d 31 2c 20 74 68 65 6e 20 74 68  tent==1, then th
18910 65 20 63 6f 6e 74 65 6e 74 20 77 61 73 0a 2a 2a  e content was.**
18920 20 6a 75 73 74 20 69 6e 69 74 69 61 6c 69 7a 65   just initialize
18930 64 20 74 6f 20 7a 65 72 6f 73 20 69 6e 73 74 65  d to zeros inste
18940 61 64 20 6f 66 20 62 65 69 6e 67 20 72 65 61 64  ad of being read
18950 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 42   from disk..** B
18960 75 74 20 6e 6f 77 20 77 65 20 6e 65 65 64 20 74  ut now we need t
18970 68 65 20 72 65 61 6c 20 64 61 74 61 20 6f 66 66  he real data off
18980 20 6f 66 20 64 69 73 6b 2e 20 20 53 6f 20 6d 61   of disk.  So ma
18990 6b 65 20 73 75 72 65 20 77 65 0a 2a 2a 20 68 61  ke sure we.** ha
189a0 76 65 20 69 74 2e 20 20 52 65 61 64 20 69 74 20  ve it.  Read it 
189b0 69 6e 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20  in if we do not 
189c0 68 61 76 65 20 69 74 20 61 6c 72 65 61 64 79 2e  have it already.
189d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
189e0 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74  ager_get_content
189f0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
18a00 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 52 65 61  if( pPg->needRea
18a10 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  d ){.    int rc 
18a20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67  = readDbPage(pPg
18a30 2d 3e 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70  ->pPager, pPg, p
18a40 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69  Pg->pgno);.    i
18a50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18a60 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   ){.      pPg->n
18a70 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20  eedRead = 0;.   
18a80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
18a90 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
18aa0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
18ab0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
18ac0 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a  Acquire a page..
18ad0 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63  **.** A read loc
18ae0 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  k on the disk fi
18af0 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77  le is obtained w
18b00 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61  hen the first pa
18b10 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20  ge is acquired. 
18b20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f  .** This read lo
18b30 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68  ck is dropped wh
18b40 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  en the last page
18b50 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a   is released..**
18b60 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18b70 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70   works for any p
18b80 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74  age number great
18b90 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74  er than 0.  If t
18ba0 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
18bb0 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  ile is smaller t
18bc0 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
18bd0 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20  d page, then no 
18be0 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72  actual disk.** r
18bf0 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ead occurs and t
18c00 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20  he memory image 
18c10 6f 66 20 74 68 65 20 70 61 67 65 20 69 73 20 69  of the page is i
18c20 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a  nitialized to.**
18c30 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65   all zeros.  The
18c40 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65   extra data appe
18c50 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69  nded to a page i
18c60 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c  s always initial
18c70 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73  ized.** to zeros
18c80 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
18c90 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64  a page is loaded
18ca0 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a   into memory..**
18cb0 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74  .** The acquisit
18cc0 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66  ion might fail f
18cd0 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f  or several reaso
18ce0 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65  ns.  In all case
18cf0 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72  s,.** an appropr
18d00 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
18d10 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
18d20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
18d30 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  o NULL..**.** Se
18d40 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
18d50 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f  gerLookup().  Bo
18d60 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  th this routine 
18d70 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74  and Lookup() att
18d80 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20  empt.** to find 
18d90 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e  a page in the in
18da0 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69  -memory cache fi
18db0 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67  rst.  If the pag
18dc0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
18dd0 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74  .** in memory, t
18de0 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  his routine goes
18df0 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64   to disk to read
18e00 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c   it in whereas L
18e10 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20  ookup().** just 
18e20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73  returns 0.  This
18e30 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65   routine acquire
18e40 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68  s a read-lock th
18e50 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a  e first time it.
18e60 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20  ** has to go to 
18e70 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20  disk, and could 
18e80 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e  also playback an
18e90 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20   old journal if 
18ea0 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69  necessary..** Si
18eb0 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76  nce Lookup() nev
18ec0 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c  er goes to disk,
18ed0 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f   it never has to
18ee0 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73   deal with locks
18ef0 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  .** or journal f
18f00 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  iles..**.** If n
18f10 6f 43 6f 6e 74 65 6e 74 20 69 73 20 66 61 6c 73  oContent is fals
18f20 65 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  e, the page cont
18f30 65 6e 74 73 20 61 72 65 20 61 63 74 75 61 6c 6c  ents are actuall
18f40 79 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b  y read from disk
18f50 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  ..** If noConten
18f60 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65  t is true, it me
18f70 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
18f80 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ot care about th
18f90 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66  e contents.** of
18fa0 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69   the page at thi
18fb0 73 20 74 69 6d 65 2c 20 73 6f 20 64 6f 20 6e 6f  s time, so do no
18fc0 74 20 64 6f 20 61 20 64 69 73 6b 20 72 65 61 64  t do a disk read
18fd0 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20  .  Just fill in 
18fe0 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74  the.** page cont
18ff0 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 2e 20  ent with zeros. 
19000 20 42 75 74 20 6d 61 72 6b 20 74 68 65 20 66 61   But mark the fa
19010 63 74 20 74 68 61 74 20 77 65 20 68 61 76 65 20  ct that we have 
19020 6e 6f 74 20 72 65 61 64 20 74 68 65 0a 2a 2a 20  not read the.** 
19030 63 6f 6e 74 65 6e 74 20 62 79 20 73 65 74 74 69  content by setti
19040 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  ng the PgHdr.nee
19050 64 52 65 61 64 20 66 6c 61 67 2e 20 20 4c 61 74  dRead flag.  Lat
19060 65 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20 73 71  er on, if .** sq
19070 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
19080 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
19090 68 69 73 20 70 61 67 65 20 6f 72 20 69 66 20 74  his page or if t
190a0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a  his routine is.*
190b0 2a 20 63 61 6c 6c 65 64 20 61 67 61 69 6e 20 77  * called again w
190c0 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30  ith noContent==0
190d0 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
190e0 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 73  t the content is
190f0 20 6e 65 65 64 65 64 0a 2a 2a 20 61 6e 64 20 74   needed.** and t
19100 68 65 20 64 69 73 6b 20 72 65 61 64 20 73 68 6f  he disk read sho
19110 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61  uld occur at tha
19120 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  t point..*/.int 
19130 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
19140 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ire(.  Pager *pP
19150 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
19160 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
19170 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19180 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
19190 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
191a0 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
191b0 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
191c0 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
191d0 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
191e0 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
191f0 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  */.  int noConte
19200 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  nt       /* Do n
19210 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e  ot bother readin
19220 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  g content from d
19230 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  isk if true */.)
19240 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
19250 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
19260 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
19270 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
19280 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   || pPager->nRef
19290 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20 29 3b  >0 || pgno==1 );
192a0 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d  ..  /* The maxim
192b0 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  um page number i
192c0 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53  s 2^31. Return S
192d0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
192e0 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d   a page.  ** num
192f0 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
19300 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20   this, or zero, 
19310 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
19320 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41  */.  if( pgno>PA
19330 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20  GER_MAX_PGNO || 
19340 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
19350 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
19360 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
19370 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
19380 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
19390 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65   /* Make sure we
193a0 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e   have not hit an
193b0 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72  y critical error
193c0 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72  s..  */ .  asser
193d0 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
193e0 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
193f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
19400 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
19410 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
19420 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75  FULL ){.    retu
19430 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
19440 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  de;.  }..  /* If
19450 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
19460 73 74 20 70 61 67 65 20 61 63 63 65 73 73 65 64  st page accessed
19470 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53 48 41  , then get a SHA
19480 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e  RED lock.  ** on
19490 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
194a0 6c 65 2e 20 70 61 67 65 72 53 68 61 72 65 64 4c  le. pagerSharedL
194b0 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70  ock() is a no-op
194c0 20 69 66 20 0a 20 20 2a 2a 20 61 20 64 61 74 61   if .  ** a data
194d0 62 61 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c 72  base lock is alr
194e0 65 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a  eady held..  */.
194f0 20 20 72 63 20 3d 20 70 61 67 65 72 53 68 61 72    rc = pagerShar
19500 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  edLock(pPager);.
19510 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19520 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
19530 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
19540 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
19550 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
19560 29 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65  );..  pPg = page
19570 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
19580 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50   pgno);.  if( pP
19590 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  g==0 ){.    /* T
195a0 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
195b0 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  e is not in the 
195c0 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20  page cache. */. 
195d0 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 20     int nMax;.   
195e0 20 69 6e 74 20 68 3b 0a 20 20 20 20 50 41 47 45   int h;.    PAGE
195f0 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
19600 4d 69 73 73 29 3b 0a 20 20 20 20 72 63 20 3d 20  Miss);.    rc = 
19610 70 61 67 65 72 41 6c 6c 6f 63 61 74 65 50 61 67  pagerAllocatePag
19620 65 28 70 50 61 67 65 72 2c 20 26 70 50 67 29 3b  e(pPager, &pPg);
19630 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
19640 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19650 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
19660 0a 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20  ..    pPg->pgno 
19670 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65  = pgno;.    asse
19680 72 74 28 20 21 4d 45 4d 44 42 20 7c 7c 20 70 67  rt( !MEMDB || pg
19690 6e 6f 3e 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  no>pPager->stmtS
196a0 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ize );.    if( p
196b0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
196c0 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d  l && (int)pgno<=
196d0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
196e0 7a 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ze ){.      sqli
196f0 74 65 33 43 68 65 63 6b 4d 65 6d 6f 72 79 28 70  te3CheckMemory(p
19700 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
19710 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20 20 20 20  l, pgno/8);.    
19720 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19730 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
19740 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
19750 75 72 6e 61 6c 20 3d 20 28 70 50 61 67 65 72 2d  urnal = (pPager-
19760 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f  >aInJournal[pgno
19770 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26  /8] & (1<<(pgno&
19780 37 29 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 70  7)))!=0;.      p
19790 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
197a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
197b0 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
197c0 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  l = 0;.      pPg
197d0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
197e0 20 20 20 20 7d 0a 0a 20 20 20 20 6d 61 6b 65 43      }..    makeC
197f0 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 70  lean(pPg);.    p
19800 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  Pg->nRef = 1;.  
19810 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
19820 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
19830 66 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61  f++;.    if( pPa
19840 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b  ger->nExtra>0 ){
19850 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
19860 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67  HDR_TO_EXTRA(pPg
19870 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50  , pPager), 0, pP
19880 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20  ager->nExtra);. 
19890 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78 20 3d 20     }.    nMax = 
198a0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
198b0 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
198c0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
198d0 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  rrCode ){.      
198e0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
198f0 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 72 63  f(pPg);.      rc
19900 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
19910 64 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  de;.      return
19920 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
19930 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  /* Populate the 
19940 70 61 67 65 20 77 69 74 68 20 64 61 74 61 2c 20  page with data, 
19950 65 69 74 68 65 72 20 62 79 20 72 65 61 64 69 6e  either by readin
19960 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  g from the datab
19970 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2c  ase.    ** file,
19980 20 6f 72 20 62 79 20 73 65 74 74 69 6e 67 20 74   or by setting t
19990 68 65 20 65 6e 74 69 72 65 20 70 61 67 65 20 74  he entire page t
199a0 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20  o zero..    */. 
199b0 20 20 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e 74     if( nMax<(int
199c0 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c  )pgno || MEMDB |
199d0 7c 20 28 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20  | (noContent && 
199e0 21 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52  !pPager->alwaysR
199f0 6f 6c 6c 62 61 63 6b 29 20 29 7b 0a 20 20 20 20  ollback) ){.    
19a00 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
19a10 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20  r->mxPgno ){.   
19a20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
19a30 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20  rUnref(pPg);.   
19a40 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
19a50 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 7d  TE_FULL;.      }
19a60 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
19a70 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
19a80 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
19a90 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50  eSize);.      pP
19aa0 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 6e 6f  g->needRead = no
19ab0 43 6f 6e 74 65 6e 74 20 26 26 20 21 70 50 61 67  Content && !pPag
19ac0 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
19ad0 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ck;.      IOTRAC
19ae0 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e  E(("ZERO %p %d\n
19af0 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
19b00 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
19b10 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50      rc = readDbP
19b20 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 67 2c  age(pPager, pPg,
19b30 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66   pgno);.      if
19b40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19b50 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  && rc!=SQLITE_IO
19b60 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
19b70 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70  {.        pPg->p
19b80 67 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  gno = 0;.       
19b90 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
19ba0 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  ef(pPg);.       
19bb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
19bc0 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e    }.      pPg->n
19bd0 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20  eedRead = 0;.   
19be0 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20   }..    /* Link 
19bf0 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68  the page into th
19c00 65 20 70 61 67 65 20 68 61 73 68 20 74 61 62 6c  e page hash tabl
19c10 65 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67 6e  e */.    h = pgn
19c20 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61  o & (pPager->nHa
19c30 73 68 2d 31 29 3b 0a 20 20 20 20 61 73 73 65 72  sh-1);.    asser
19c40 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20  t( pgno!=0 );.  
19c50 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
19c60 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68   = pPager->aHash
19c70 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  [h];.    pPager-
19c80 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b  >aHash[h] = pPg;
19c90 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e  .    if( pPg->pN
19ca0 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20  extHash ){.     
19cb0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e   assert( pPg->pN
19cc0 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61  extHash->pPrevHa
19cd0 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  sh==0 );.      p
19ce0 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
19cf0 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a  PrevHash = pPg;.
19d00 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
19d10 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
19d20 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
19d30 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
19d40 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
19d50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
19d60 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70   The requested p
19d70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 70 61  age is in the pa
19d80 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  ge cache. */.   
19d90 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
19da0 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d  nRef>0 || pgno==
19db0 31 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e  1);.    PAGER_IN
19dc0 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29  CR(pPager->nHit)
19dd0 3b 0a 20 20 20 20 69 66 28 20 21 6e 6f 43 6f 6e  ;.    if( !noCon
19de0 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63  tent ){.      rc
19df0 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e   = pager_get_con
19e00 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 20 20 20  tent(pPg);.     
19e10 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
19e20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
19e30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
19e40 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
19e50 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70   }.  *ppPage = p
19e60 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  Pg;.  return SQL
19e70 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
19e80 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20   Acquire a page 
19e90 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
19ea0 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
19eb0 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20  y cache.  Do.** 
19ec0 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67  not read the pag
19ed0 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65  e from disk.  Re
19ee0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
19ef0 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f  o the page,.** o
19f00 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20  r 0 if the page 
19f10 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e  is not in cache.
19f20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
19f30 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
19f40 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e  ).  The differen
19f50 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
19f60 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73  routine.** and s
19f70 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
19f80 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20   is that _get() 
19f90 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64  will go to the d
19fa0 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  isk and read.** 
19fb0 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74  in the page if t
19fc0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
19fd0 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e  lready in cache.
19fe0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
19ff0 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  * returns NULL i
1a000 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
1a010 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66  t in cache or if
1a020 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f   a disk I/O erro
1a030 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68  r .** has ever h
1a040 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61  appened..*/.DbPa
1a050 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ge *sqlite3Pager
1a060 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  Lookup(Pager *pP
1a070 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
1a080 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
1a090 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1a0a0 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
1a0b0 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20  ( pgno!=0 );..  
1a0c0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
1a0d0 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
1a0e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
1a0f0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 7c 7c 20  pPager->pAll || 
1a100 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
1a110 65 4d 6f 64 65 20 29 3b 0a 20 20 20 20 72 65 74  eMode );.    ret
1a120 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
1a130 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1a140 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
1a150 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode!=SQLITE_FULL
1a160 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
1a170 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20 70 61  ;.  }.  pPg = pa
1a180 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
1a190 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
1a1a0 70 50 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  pPg==0 ) return 
1a1b0 30 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50  0;.  page_ref(pP
1a1c0 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g);.  return pPg
1a1d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
1a1e0 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  se a page..**.**
1a1f0 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
1a200 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
1a210 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f  the page drop to
1a220 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a   zero, then the.
1a230 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64  ** page is added
1a240 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74   to the LRU list
1a250 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65  .  When all refe
1a260 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61  rences to all pa
1a270 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61  ges.** are relea
1a280 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  sed, a rollback 
1a290 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c  occurs and the l
1a2a0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1a2b0 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65  ase is.** remove
1a2c0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1a2d0 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50 61  3PagerUnref(DbPa
1a2e0 67 65 20 2a 70 50 67 29 7b 0a 0a 20 20 2f 2a 20  ge *pPg){..  /* 
1a2f0 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Decrement the re
1a300 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
1a310 72 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a 2f  r this page.  */
1a320 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
1a330 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d  nRef>0 );.  pPg-
1a340 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e  >nRef--;.  REFIN
1a350 46 4f 28 70 50 67 29 3b 0a 0a 20 20 43 48 45 43  FO(pPg);..  CHEC
1a360 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20  K_PAGE(pPg);..  
1a370 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62  /* When the numb
1a380 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
1a390 20 74 6f 20 61 20 70 61 67 65 20 72 65 61 63 68   to a page reach
1a3a0 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a   0, call the.  *
1a3b0 2a 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e 64  * destructor and
1a3c0 20 61 64 64 20 74 68 65 20 70 61 67 65 20 74 6f   add the page to
1a3d0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20   the freelist.. 
1a3e0 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e   */.  if( pPg->n
1a3f0 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61  Ref==0 ){.    Pa
1a400 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20  ger *pPager;.   
1a410 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70   pPager = pPg->p
1a420 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e  Pager;.    pPg->
1a430 70 4e 65 78 74 46 72 65 65 20 3d 20 30 3b 0a 20  pNextFree = 0;. 
1a440 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
1a450 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 4c 61 73  e = pPager->pLas
1a460 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  t;.    pPager->p
1a470 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20  Last = pPg;.    
1a480 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72  if( pPg->pPrevFr
1a490 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ee ){.      pPg-
1a4a0 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78  >pPrevFree->pNex
1a4b0 74 46 72 65 65 20 3d 20 70 50 67 3b 0a 20 20 20  tFree = pPg;.   
1a4c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
1a4d0 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70  ager->pFirst = p
1a4e0 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  Pg;.    }.    if
1a4f0 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d  ( pPg->needSync=
1a500 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46  =0 && pPager->pF
1a510 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 29 7b  irstSynced==0 ){
1a520 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
1a530 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50  FirstSynced = pP
1a540 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  g;.    }.    if(
1a550 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
1a560 63 74 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 50  ctor ){.      pP
1a570 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
1a580 72 28 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70  r(pPg, pPager->p
1a590 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
1a5a0 20 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61    .    /* When a
1a5b0 6c 6c 20 70 61 67 65 73 20 72 65 61 63 68 20 74  ll pages reach t
1a5c0 68 65 20 66 72 65 65 6c 69 73 74 2c 20 64 72 6f  he freelist, dro
1a5d0 70 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20  p the read lock 
1a5e0 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
1a5f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
1a600 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
1a610 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73  ->nRef--;.    as
1a620 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52  sert( pPager->nR
1a630 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ef>=0 );.    if(
1a640 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30   pPager->nRef==0
1a650 20 26 26 20 28 21 70 50 61 67 65 72 2d 3e 65 78   && (!pPager->ex
1a660 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70  clusiveMode || p
1a670 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1a680 66 3e 30 29 20 29 7b 0a 20 20 20 20 20 20 70 61  f>0) ){.      pa
1a690 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
1a6a0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
1a6b0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1a6c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1a6d0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f  *.** Create a jo
1a6e0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
1a6f0 50 61 67 65 72 2e 20 20 54 68 65 72 65 20 73 68  Pager.  There sh
1a700 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20  ould already be 
1a710 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72  a RESERVED.** or
1a720 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1a730 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1a740 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  file when this r
1a750 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1a760 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
1a770 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
1a780 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20  ything.  Return 
1a790 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  an error code an
1a7a0 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a  d release the.**
1a7b0 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61   write lock if a
1a7c0 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  nything goes wro
1a7d0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
1a7e0 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  t pager_open_jou
1a7f0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
1a800 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
1a810 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
1a820 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1a830 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1a840 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
1a850 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1a860 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
1a870 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1a880 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
1a890 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1a8a0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->aInJournal==
1a8b0 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  0 );.  sqlite3Pa
1a8c0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
1a8d0 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ger);.  pPager->
1a8e0 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  aInJournal = sql
1a8f0 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65  iteMalloc( pPage
1a900 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20  r->dbSize/8 + 1 
1a910 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
1a920 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
1a930 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1a940 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
1a950 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  o failed_to_open
1a960 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20  _journal;.  }.  
1a970 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
1a980 65 6e 45 78 63 6c 75 73 69 76 65 28 70 50 61 67  enExclusive(pPag
1a990 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70  er->zJournal, &p
1a9a0 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20 20 20  Pager->jfd,.    
1a9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
1a9d0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
1a9e0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
1a9f0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
1aa00 72 2d 3e 6a 66 64 20 29 3b 0a 20 20 70 50 61 67  r->jfd );.  pPag
1aa10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
1aa20 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
1aa30 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70  tMaster = 0;.  p
1aa40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
1aa50 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21  r = 0;.  if( rc!
1aa60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1aa70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1aa80 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20  _NOMEM ){.      
1aa90 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
1aaa0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1aab0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74  );.    }.    got
1aac0 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  o failed_to_open
1aad0 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20  _journal;.  }.  
1aae0 73 71 6c 69 74 65 33 4f 73 53 65 74 46 75 6c 6c  sqlite3OsSetFull
1aaf0 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
1ab00 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66  , pPager->full_f
1ab10 73 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  sync);.  sqlite3
1ab20 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63 28 70 50  OsSetFullSync(pP
1ab30 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
1ab40 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20  ->full_fsync);. 
1ab50 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69   sqlite3OsOpenDi
1ab60 72 65 63 74 6f 72 79 28 70 50 61 67 65 72 2d 3e  rectory(pPager->
1ab70 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 7a 44 69  jfd, pPager->zDi
1ab80 72 65 63 74 6f 72 79 29 3b 0a 20 20 70 50 61 67  rectory);.  pPag
1ab90 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1aba0 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  = 1;.  pPager->j
1abb0 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
1abc0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  0;.  pPager->nee
1abd0 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61  dSync = 0;.  pPa
1abe0 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
1abf0 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ack = 0;.  pPage
1ac00 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69  r->nRec = 0;.  i
1ac10 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1ac20 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  de ){.    rc = p
1ac30 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
1ac40 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f      goto failed_
1ac50 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b  to_open_journal;
1ac60 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f  .  }.  pPager->o
1ac70 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67  rigDbSize = pPag
1ac80 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72  er->dbSize;..  r
1ac90 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
1aca0 48 64 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  Hdr(pPager);..  
1acb0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
1acc0 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d  Autoopen && rc==
1acd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ace0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1acf0 65 72 53 74 6d 74 42 65 67 69 6e 28 70 50 61 67  erStmtBegin(pPag
1ad00 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  er);.  }.  if( r
1ad10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
1ad20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc!=SQLITE_NOMEM
1ad30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
1ad40 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
1ad50 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  on(pPager);.    
1ad60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ad70 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1ad80 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
1ad90 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1ada0 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f  rc;..failed_to_o
1adb0 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73  pen_journal:.  s
1adc0 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
1add0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->aInJournal);. 
1ade0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1adf0 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  nal = 0;.  retur
1ae00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
1ae10 63 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c  cquire a write-l
1ae20 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1ae30 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69  ase.  The lock i
1ae40 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a  s removed when.*
1ae50 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65  * the any of the
1ae60 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65   following happe
1ae70 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71  n:.**.**   *  sq
1ae80 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1ae90 50 68 61 73 65 54 77 6f 28 29 20 69 73 20 63 61  PhaseTwo() is ca
1aea0 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
1aeb0 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
1aec0 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  ck() is called..
1aed0 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50  **   *  sqlite3P
1aee0 61 67 65 72 43 6c 6f 73 65 28 29 20 69 73 20 63  agerClose() is c
1aef0 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
1af00 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1af10 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  () is called to 
1af20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61 6e  on every outstan
1af30 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  ding page..**.**
1af40 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d   The first param
1af50 65 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75  eter to this rou
1af60 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65  tine is a pointe
1af70 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61  r to any open pa
1af80 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ge of the.** dat
1af90 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74  abase file.  Not
1afa0 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f  hing changes abo
1afb0 75 74 20 74 68 65 20 70 61 67 65 20 2d 20 69 74  ut the page - it
1afc0 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79 20   is used merely 
1afd0 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61 20  to.** acquire a 
1afe0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50  pointer to the P
1aff0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
1b000 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74  nd as proof that
1b010 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72   there is.** alr
1b020 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  eady a read-lock
1b030 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1b040 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ..**.** The seco
1b050 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64  nd parameter ind
1b060 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68 20  icates how much 
1b070 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 74  space in bytes t
1b080 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 61 0a  o reserve for a.
1b090 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
1b0a0 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74  l file-name at t
1b0b0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
1b0c0 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74 20  journal when it 
1b0d0 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a  is created..**.*
1b0e0 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  * A journal file
1b0f0 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74 68   is opened if th
1b100 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70  is is not a temp
1b110 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f 72  orary file.  For
1b120 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69   temporary.** fi
1b130 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67  les, the opening
1b140 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1b150 66 69 6c 65 20 69 73 20 64 65 66 65 72 72 65 64  file is deferred
1b160 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20   until there is 
1b170 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65  an.** actual nee
1b180 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  d to write to th
1b190 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
1b1a0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
1b1b0 20 69 73 20 61 6c 72 65 61 64 79 20 72 65 73 65   is already rese
1b1c0 72 76 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67  rved for writing
1b1d0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1b1e0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
1b1f0 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74 72   If exFlag is tr
1b200 75 65 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64  ue, go ahead and
1b210 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56   get an EXCLUSIV
1b220 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  E lock on the fi
1b230 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  le.** immediatel
1b240 79 20 69 6e 73 74 65 61 64 20 6f 66 20 77 61 69  y instead of wai
1b250 74 69 6e 67 20 75 6e 74 69 6c 20 77 65 20 74 72  ting until we tr
1b260 79 20 74 6f 20 66 6c 75 73 68 20 74 68 65 20 63  y to flush the c
1b270 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78  ache.  The.** ex
1b280 46 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64 20  Flag is ignored 
1b290 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
1b2a0 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69   is already acti
1b2b0 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ve..*/.int sqlit
1b2c0 65 33 50 61 67 65 72 42 65 67 69 6e 28 44 62 50  e3PagerBegin(DbP
1b2d0 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 65 78  age *pPg, int ex
1b2e0 46 6c 61 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  Flag){.  Pager *
1b2f0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1b300 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ager;.  int rc =
1b310 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
1b320 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e  sert( pPg->nRef>
1b330 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1b340 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
1b350 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  GER_UNLOCK );.  
1b360 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
1b370 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e==PAGER_SHARED 
1b380 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1b390 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1b3a0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  l==0 );.    if( 
1b3b0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70  MEMDB ){.      p
1b3c0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
1b3d0 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
1b3e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72        pPager->or
1b3f0 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65  igDbSize = pPage
1b400 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d  r->dbSize;.    }
1b410 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1b420 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
1b430 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52  Pager->fd, RESER
1b440 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  VED_LOCK);.     
1b450 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b460 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  OK ){.        pP
1b470 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
1b480 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20  GER_RESERVED;.  
1b490 20 20 20 20 20 20 69 66 28 20 65 78 46 6c 61 67        if( exFlag
1b4a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1b4b0 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
1b4c0 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
1b4d0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
1b4e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1b4f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1b500 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b510 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1b520 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
1b530 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1b540 3d 20 30 3b 0a 20 20 20 20 20 20 50 41 47 45 52  = 0;.      PAGER
1b550 54 52 41 43 45 32 28 22 54 52 41 4e 53 41 43 54  TRACE2("TRANSACT
1b560 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ION %d\n", PAGER
1b570 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
1b580 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75     if( pPager->u
1b590 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50  seJournal && !pP
1b5a0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
1b5b0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
1b5c0 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
1b5d0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
1b5e0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
1b5f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1b600 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67  rnalOpen && pPag
1b610 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
1b620 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  0 ){.    /* This
1b630 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74 68   happens when th
1b640 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65  e pager was in e
1b650 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
1b660 6d 6f 64 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a  mode last.    **
1b670 20 74 69 6d 65 20 61 20 28 72 65 61 64 20 6f 72   time a (read or
1b680 20 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74   write) transact
1b690 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66  ion was successf
1b6a0 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20  ully concluded. 
1b6b0 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20 63 6f     ** by this co
1b6c0 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61  nnection. Instea
1b6d0 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20 74 68  d of deleting th
1b6e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1b6f0 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65  t was .    ** ke
1b700 70 74 20 6f 70 65 6e 20 61 6e 64 20 74 72 75 6e  pt open and trun
1b710 63 61 74 65 64 20 74 6f 20 30 20 62 79 74 65 73  cated to 0 bytes
1b720 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
1b730 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
1b740 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
1b750 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  rt( pPager->orig
1b760 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20  DbSize==0 );.   
1b770 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1b780 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
1b790 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
1b7a0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
1b7b0 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
1b7c0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  >aInJournal = sq
1b7d0 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67  liteMalloc( pPag
1b7e0 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31  er->dbSize/8 + 1
1b7f0 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61   );.    if( !pPa
1b800 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
1b810 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1b820 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1b830 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
1b840 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
1b850 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
1b860 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
1b870 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
1b880 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
1b890 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
1b8a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c  r->journalOpen |
1b8b0 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
1b8c0 6c 4f 66 66 3e 30 20 7c 7c 20 72 63 21 3d 53 51  lOff>0 || rc!=SQ
1b8d0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74  LITE_OK );.  ret
1b8e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1b8f0 20 4d 61 6b 65 20 61 20 70 61 67 65 20 64 69 72   Make a page dir
1b900 74 79 2e 20 20 53 65 74 20 69 74 73 20 64 69 72  ty.  Set its dir
1b910 74 79 20 66 6c 61 67 20 61 6e 64 20 61 64 64 20  ty flag and add 
1b920 69 74 20 74 6f 20 74 68 65 20 64 69 72 74 79 0a  it to the dirty.
1b930 2a 2a 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f  ** page list..*/
1b940 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b  .static void mak
1b950 65 44 69 72 74 79 28 50 67 48 64 72 20 2a 70 50  eDirty(PgHdr *pP
1b960 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64  g){.  if( pPg->d
1b970 69 72 74 79 3d 3d 30 20 29 7b 0a 20 20 20 20 50  irty==0 ){.    P
1b980 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1b990 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20  Pg->pPager;.    
1b9a0 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a  pPg->dirty = 1;.
1b9b0 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20      pPg->pDirty 
1b9c0 3d 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79  = pPager->pDirty
1b9d0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
1b9e0 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20 20  ->pDirty ){.    
1b9f0 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
1ba00 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 70  ->pPrevDirty = p
1ba10 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  Pg;.    }.    pP
1ba20 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20  g->pPrevDirty = 
1ba30 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  0;.    pPager->p
1ba40 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20 20 7d  Dirty = pPg;.  }
1ba50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
1ba60 20 70 61 67 65 20 63 6c 65 61 6e 2e 20 20 43 6c   page clean.  Cl
1ba70 65 61 72 20 69 74 73 20 64 69 72 74 79 20 62 69  ear its dirty bi
1ba80 74 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 20  t and remove it 
1ba90 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 64 69 72 74  from the.** dirt
1baa0 79 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a  y page list..*/.
1bab0 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65  static void make
1bac0 43 6c 65 61 6e 28 50 67 48 64 72 20 2a 70 50 67  Clean(PgHdr *pPg
1bad0 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69  ){.  if( pPg->di
1bae0 72 74 79 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  rty ){.    pPg->
1baf0 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69  dirty = 0;.    i
1bb00 66 28 20 70 50 67 2d 3e 70 44 69 72 74 79 20 29  f( pPg->pDirty )
1bb10 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 44 69  {.      pPg->pDi
1bb20 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20  rty->pPrevDirty 
1bb30 3d 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74  = pPg->pPrevDirt
1bb40 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  y;.    }.    if(
1bb50 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79   pPg->pPrevDirty
1bb60 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
1bb70 50 72 65 76 44 69 72 74 79 2d 3e 70 44 69 72 74  PrevDirty->pDirt
1bb80 79 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b  y = pPg->pDirty;
1bb90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1bba0 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
1bbb0 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 44 69  Dirty = pPg->pDi
1bbc0 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  rty;.    }.  }.}
1bbd0 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  .../*.** Mark a 
1bbe0 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
1bbf0 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67  teable.  The pag
1bc00 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
1bc10 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a  o the journal .*
1bc20 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  * if it is not t
1bc30 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54  here already.  T
1bc40 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
1bc50 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
1bc60 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e  e making.** chan
1bc70 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a  ges to a page..*
1bc80 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
1bc90 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ime this routine
1bca0 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
1bcb0 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61 20  pager creates a 
1bcc0 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  new.** journal a
1bcd0 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 52 45  nd acquires a RE
1bce0 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
1bcf0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
1bd00 20 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a   the RESERVED.**
1bd10 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20   lock could not 
1bd20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74 68 69  be acquired, thi
1bd30 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1bd40 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  s SQLITE_BUSY.  
1bd50 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72  The.** calling r
1bd60 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63  outine must chec
1bd70 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74 75 72  k for that retur
1bd80 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63  n value and be c
1bd90 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a  areful not to.**
1bda0 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65   change any page
1bdb0 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73   data until this
1bdc0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1bdd0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
1bde0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
1bdf0 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20   file could not 
1be00 62 65 20 77 72 69 74 74 65 6e 20 62 65 63 61 75  be written becau
1be10 73 65 20 74 68 65 20 64 69 73 6b 20 69 73 20 66  se the disk is f
1be20 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69  ull,.** then thi
1be30 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1be40 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e  s SQLITE_FULL an
1be50 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69  d does an immedi
1be60 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ate rollback..**
1be70 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   All subsequent 
1be80 77 72 69 74 65 20 61 74 74 65 6d 70 74 73 20 61  write attempts a
1be90 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54  lso return SQLIT
1bea0 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65  E_FULL until the
1beb0 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20  re.** is a call 
1bec0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
1bed0 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74  ommit() or sqlit
1bee0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1bef0 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a  ) to.** reset..*
1bf00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1bf10 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a  er_write(PgHdr *
1bf20 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44  pPg){.  void *pD
1bf30 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44  ata = PGHDR_TO_D
1bf40 41 54 41 28 70 50 67 29 3b 0a 20 20 50 61 67 65  ATA(pPg);.  Page
1bf50 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1bf60 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
1bf70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
1bf80 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65    /* Check for e
1bf90 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28  rrors.  */.  if(
1bfa0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1bfb0 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20   ){ .    return 
1bfc0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
1bfd0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
1bfe0 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  r->readOnly ){. 
1bff0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c000 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73  _PERM;.  }..  as
1c010 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73  sert( !pPager->s
1c020 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43  etMaster );..  C
1c030 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a  HECK_PAGE(pPg);.
1c040 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61  .  /* If this pa
1c050 67 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  ge was previousl
1c060 79 20 61 63 71 75 69 72 65 64 20 77 69 74 68 20  y acquired with 
1c070 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68  noContent==1, th
1c080 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 77 65  at means.  ** we
1c090 20 64 69 64 6e 27 74 20 72 65 61 6c 6c 79 20 72   didn't really r
1c0a0 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  ead in the conte
1c0b0 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20  nt of the page. 
1c0c0 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   This can happen
1c0d0 0a 20 20 2a 2a 20 28 66 6f 72 20 65 78 61 6d 70  .  ** (for examp
1c0e0 6c 65 29 20 77 68 65 6e 20 74 68 65 20 70 61 67  le) when the pag
1c0f0 65 20 69 73 20 62 65 69 6e 67 20 6d 6f 76 65 64  e is being moved
1c100 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
1c110 2e 20 20 42 75 74 0a 20 20 2a 2a 20 6e 6f 77 20  .  But.  ** now 
1c120 77 65 20 61 72 65 20 28 70 65 72 68 61 70 73 29  we are (perhaps)
1c130 20 6d 6f 76 69 6e 67 20 74 68 65 20 70 61 67 65   moving the page
1c140 20 6f 66 66 20 6f 66 20 74 68 65 20 66 72 65 65   off of the free
1c150 6c 69 73 74 20 66 6f 72 0a 20 20 2a 2a 20 72 65  list for.  ** re
1c160 75 73 65 20 61 6e 64 20 77 65 20 6e 65 65 64 20  use and we need 
1c170 74 6f 20 6b 6e 6f 77 20 69 74 73 20 6f 72 69 67  to know its orig
1c180 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 73 6f 20  inal content so 
1c190 74 68 61 74 20 63 6f 6e 74 65 6e 74 0a 20 20 2a  that content.  *
1c1a0 2a 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64 20  * can be stored 
1c1b0 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
1c1c0 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f 20 64 6f 20  journal.  So do 
1c1d0 74 68 65 20 72 65 61 64 20 61 74 20 74 68 69 73  the read at this
1c1e0 0a 20 20 2a 2a 20 74 69 6d 65 2e 0a 20 20 2a 2f  .  ** time..  */
1c1f0 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 67 65  .  rc = pager_ge
1c200 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a  t_content(pPg);.
1c210 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1c220 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
1c230 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
1c240 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66  ge as dirty.  If
1c250 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c   the page has al
1c260 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1c270 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a  en.  ** to the j
1c280 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63  ournal then we c
1c290 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20  an return right 
1c2a0 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d 61 6b  away..  */.  mak
1c2b0 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69  eDirty(pPg);.  i
1c2c0 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  f( pPg->inJourna
1c2d0 6c 20 26 26 20 28 70 61 67 65 49 6e 53 74 61 74  l && (pageInStat
1c2e0 65 6d 65 6e 74 28 70 50 67 29 20 7c 7c 20 70 50  ement(pPg) || pP
1c2f0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d  ager->stmtInUse=
1c300 3d 30 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65  =0) ){.    pPage
1c310 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
1c320 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20  1;.  }else{..   
1c330 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68   /* If we get th
1c340 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73  is far, it means
1c350 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
1c360 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a  eeds to be.    *
1c370 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  * written to the
1c380 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
1c390 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63  rnal or the ckec
1c3a0 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20  kpoint journal. 
1c3b0 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20     ** or both.. 
1c3c0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72     **.    ** Fir
1c3d0 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  st check to see 
1c3e0 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63  that the transac
1c3f0 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69  tion journal exi
1c400 73 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63  sts and.    ** c
1c410 72 65 61 74 65 20 69 74 20 69 66 20 69 74 20 64  reate it if it d
1c420 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a  oes not..    */.
1c430 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1c440 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
1c450 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  _UNLOCK );.    r
1c460 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1c470 42 65 67 69 6e 28 70 50 67 2c 20 30 29 3b 0a 20  Begin(pPg, 0);. 
1c480 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1c490 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1c4a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1c4b0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1c4c0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
1c4d0 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20  RESERVED );.    
1c4e0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  if( !pPager->jou
1c4f0 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67  rnalOpen && pPag
1c500 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
1c510 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
1c520 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
1c530 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
1c540 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1c550 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1c560 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1c570 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1c580 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  pen || !pPager->
1c590 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
1c5a0 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
1c5b0 61 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20 20  ache = 1;.  .   
1c5c0 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74   /* The transact
1c5d0 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20  ion journal now 
1c5e0 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61  exists and we ha
1c5f0 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ve a RESERVED or
1c600 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55   an.    ** EXCLU
1c610 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
1c620 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
1c630 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  ile.  Write the 
1c640 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a  current page to.
1c650 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73      ** the trans
1c660 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69  action journal i
1c670 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72  f it is not ther
1c680 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  e already..    *
1c690 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e  /.    if( !pPg->
1c6a0 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50  inJournal && (pP
1c6b0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
1c6c0 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20   || MEMDB) ){.  
1c6d0 20 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67      if( (int)pPg
1c6e0 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72  ->pgno <= pPager
1c6f0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
1c700 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 50 67          int szPg
1c710 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 45  ;.        if( ME
1c720 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20  MDB ){.         
1c730 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
1c740 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
1c750 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
1c760 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54            PAGERT
1c770 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25  RACE3("JOURNAL %
1c780 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
1c790 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1c7a0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
1c7b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69       assert( pHi
1c7c0 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a  st->pOrig==0 );.
1c7d0 20 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d            pHist-
1c7e0 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 4d  >pOrig = sqliteM
1c7f0 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72  allocRaw( pPager
1c800 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
1c810 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73          if( pHis
1c820 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20  t->pOrig ){.    
1c830 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
1c840 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48  Hist->pOrig, PGH
1c850 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
1c860 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1c870 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
1c880 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1c890 20 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73           u32 cks
1c8a0 75 6d 2c 20 73 61 76 65 64 3b 0a 20 20 20 20 20  um, saved;.     
1c8b0 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
1c8c0 32 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20  2, *pEnd;.      
1c8d0 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64      /* We should
1c8e0 20 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20   never write to 
1c8f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1c900 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20   the page that. 
1c910 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74           ** cont
1c920 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  ains the databas
1c930 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f  e locks.  The fo
1c940 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76  llowing assert v
1c950 65 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20  erifies.        
1c960 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20    ** that we do 
1c970 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  not. */.        
1c980 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
1c990 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno!=PAGER_MJ_PG
1c9a0 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  NO(pPager) );.  
1c9b0 20 20 20 20 20 20 20 20 70 44 61 74 61 32 20 3d          pData2 =
1c9c0 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
1c9d0 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
1c9e0 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 7);.          
1c9f0 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b  cksum = pager_ck
1ca00 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a  sum(pPager, (u8*
1ca10 29 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20  )pData2);.      
1ca20 20 20 20 20 70 45 6e 64 20 3d 20 70 44 61 74 61      pEnd = pData
1ca30 32 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65  2 + pPager->page
1ca40 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Size;.          
1ca50 70 44 61 74 61 32 20 2d 3d 20 34 3b 0a 20 20 20  pData2 -= 4;.   
1ca60 20 20 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a         saved = *
1ca70 28 75 33 32 2a 29 70 45 6e 64 3b 0a 20 20 20 20  (u32*)pEnd;.    
1ca80 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28        put32bits(
1ca90 70 45 6e 64 2c 20 63 6b 73 75 6d 29 3b 0a 20 20  pEnd, cksum);.  
1caa0 20 20 20 20 20 20 20 20 73 7a 50 67 20 3d 20 70          szPg = p
1cab0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
1cac0 38 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  8;.          put
1cad0 33 32 62 69 74 73 28 70 44 61 74 61 32 2c 20 70  32bits(pData2, p
1cae0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
1caf0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1cb00 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
1cb10 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 73 7a  >jfd, pData2, sz
1cb20 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49  Pg);.          I
1cb30 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70  OTRACE(("JOUT %p
1cb40 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %d %lld %d\n", 
1cb50 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
1cb60 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
1cb70 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1cb80 75 72 6e 61 6c 4f 66 66 2c 20 73 7a 50 67 29 29  urnalOff, szPg))
1cb90 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  ;.          PAGE
1cba0 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
1cbb0 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
1cbc0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  t);.          pP
1cbd0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1cbe0 20 2b 3d 20 73 7a 50 67 3b 0a 20 20 20 20 20 20   += szPg;.      
1cbf0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 34 28      PAGERTRACE4(
1cc00 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  "JOURNAL %d page
1cc10 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c   %d needSync=%d\
1cc20 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1cc30 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
1cc40 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
1cc50 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29  , pPg->needSync)
1cc60 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 75 33  ;.          *(u3
1cc70 32 2a 29 70 45 6e 64 20 3d 20 73 61 76 65 64 3b  2*)pEnd = saved;
1cc80 0a 0a 09 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72  ...  /* An error
1cc90 20 68 61 73 20 6f 63 63 75 72 65 64 20 77 72 69   has occured wri
1cca0 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72  ting to the jour
1ccb0 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a 20  nal file. The . 
1ccc0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e           ** tran
1ccd0 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
1cce0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 74  rolled back by t
1ccf0 68 65 20 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a  he layer above..
1cd00 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1cd10 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1cd20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1cd30 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1cd40 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  c;.          }..
1cd50 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1cd60 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20  ->nRec++;.      
1cd70 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1cd80 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->aInJournal!=
1cd90 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  0 );.          p
1cda0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1cdb0 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  l[pPg->pgno/8] |
1cdc0 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
1cdd0 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  7);.          pP
1cde0 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  g->needSync = !p
1cdf0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20  Pager->noSync;. 
1ce00 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61           if( pPa
1ce10 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
1ce20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  {.            pP
1ce30 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
1ce40 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
1ce50 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
1ce60 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1ce70 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
1ce80 65 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e  e{.        pPg->
1ce90 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67  needSync = !pPag
1cea0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
1ceb0 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e  ed && !pPager->n
1cec0 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 50  oSync;.        P
1ced0 41 47 45 52 54 52 41 43 45 34 28 22 41 50 50 45  AGERTRACE4("APPE
1cee0 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  ND %d page %d ne
1cef0 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20  edSync=%d\n",.  
1cf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
1cf10 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1cf20 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e  Pg->pgno, pPg->n
1cf30 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20  eedSync);.      
1cf40 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d  }.      if( pPg-
1cf50 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
1cf60 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65       pPager->nee
1cf70 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
1cf80 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e   }.      pPg->in
1cf90 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
1cfa0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
1cfb0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
1cfc0 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e  urnal is open an
1cfd0 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  d the page is no
1cfe0 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20  t in it,.    ** 
1cff0 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63  then write the c
1d000 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74  urrent page to t
1d010 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
1d020 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74  rnal.  Note that
1d030 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74  .    ** the stat
1d040 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f  ement journal fo
1d050 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f  rmat differs fro
1d060 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a  m the standard j
1d070 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20  ournal format.  
1d080 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20    ** in that it 
1d090 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73  omits the checks
1d0a0 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64  ums and the head
1d0b0 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  er..    */.    i
1d0c0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
1d0d0 6e 55 73 65 20 0a 20 20 20 20 20 26 26 20 21 70  nUse .     && !p
1d0e0 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 70  ageInStatement(p
1d0f0 50 67 29 20 0a 20 20 20 20 20 26 26 20 28 69 6e  Pg) .     && (in
1d100 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61  t)pPg->pgno<=pPa
1d110 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 0a 20  ger->stmtSize . 
1d120 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65     ){.      asse
1d130 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
1d140 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e  al || (int)pPg->
1d150 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
1d160 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  gDbSize );.     
1d170 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
1d180 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
1d190 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
1d1a0 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
1d1b0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  er);.        ass
1d1c0 65 72 74 28 20 70 48 69 73 74 2d 3e 70 53 74 6d  ert( pHist->pStm
1d1d0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
1d1e0 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73  pHist->pStmt = s
1d1f0 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
1d200 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1d210 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1d220 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a  pHist->pStmt ){.
1d230 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1d240 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50  (pHist->pStmt, P
1d250 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
1d260 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
1d270 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ize);.        }.
1d280 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
1d290 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE3("STMT-JOURNA
1d2a0 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
1d2b0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1d2c0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1d2d0 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74        page_add_t
1d2e0 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
1d2f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1d300 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61         char *pDa
1d310 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61  ta2 = CODEC2(pPa
1d320 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
1d330 3e 70 67 6e 6f 2c 20 37 29 2d 34 3b 0a 20 20 20  >pgno, 7)-4;.   
1d340 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28 70       put32bits(p
1d350 44 61 74 61 32 2c 20 70 50 67 2d 3e 70 67 6e 6f  Data2, pPg->pgno
1d360 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1d370 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
1d380 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 70 44 61  Pager->stfd, pDa
1d390 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
1d3a0 65 53 69 7a 65 2b 34 29 3b 0a 20 20 20 20 20 20  eSize+4);.      
1d3b0 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 53    PAGERTRACE3("S
1d3c0 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70  TMT-JOURNAL %d p
1d3d0 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
1d3e0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
1d3f0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
1d400 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d410 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1d420 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1d430 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
1d440 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a  er->stmtNRec++;.
1d450 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1d460 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21  pPager->aInStmt!
1d470 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  =0 );.        pP
1d480 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
1d490 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
1d4a0 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
1d4b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d4c0 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
1d4d0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1d4e0 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
1d4f0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
1d500 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1d510 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69 66 28  _SHARED );.  if(
1d520 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
1d530 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29  (int)pPg->pgno )
1d540 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
1d550 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Size = pPg->pgno
1d560 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42  ;.    if( !MEMDB
1d570 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69   && pPager->dbSi
1d580 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ze==PENDING_BYTE
1d590 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
1d5a0 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  e ){.      pPage
1d5b0 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20  r->dbSize++;.   
1d5c0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1d5d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1d5e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
1d5f0 65 64 20 74 6f 20 6d 61 72 6b 20 61 20 64 61 74  ed to mark a dat
1d600 61 2d 70 61 67 65 20 61 73 20 77 72 69 74 61 62  a-page as writab
1d610 6c 65 2e 20 49 74 20 75 73 65 73 20 0a 2a 2a 20  le. It uses .** 
1d620 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 74 6f  pager_write() to
1d630 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20   open a journal 
1d640 66 69 6c 65 20 28 69 66 20 69 74 20 69 73 20 6e  file (if it is n
1d650 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29  ot already open)
1d660 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68  .** and write th
1d670 65 20 70 61 67 65 20 2a 70 44 61 74 61 20 74 6f  e page *pData to
1d680 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
1d690 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
1d6a0 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
1d6b0 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67  function and pag
1d6c0 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 74 68  er_write() is th
1d6d0 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  at this.** funct
1d6e0 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77  ion also deals w
1d6f0 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20  ith the special 
1d700 63 61 73 65 20 77 68 65 72 65 20 32 20 6f 72 20  case where 2 or 
1d710 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69  more pages.** fi
1d720 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69  t on a single di
1d730 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68  sk sector. In th
1d740 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72  is case all co-r
1d750 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a  esident pages.**
1d760 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
1d770 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
1d780 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f  ournal file befo
1d790 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
1d7a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
1d7b0 72 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70  rWrite(DbPage *p
1d7c0 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72  DbPage){.  int r
1d7d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
1d7e0 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70    PgHdr *pPg = p
1d7f0 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20  DbPage;.  Pager 
1d800 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1d810 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50  Pager;.  Pgno nP
1d820 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28  agePerSector = (
1d830 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
1d840 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ze/pPager->pageS
1d850 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 21 4d 45  ize);..  if( !ME
1d860 4d 44 42 20 26 26 20 6e 50 61 67 65 50 65 72 53  MDB && nPagePerS
1d870 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50  ector>1 ){.    P
1d880 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20  gno nPageCount; 
1d890 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
1d8a0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
1d8b0 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  s in database fi
1d8c0 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70  le */.    Pgno p
1d8d0 67 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  g1;             
1d8e0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67      /* First pag
1d8f0 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  e of the sector 
1d900 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f  pPg is located o
1d910 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50  n. */.    int nP
1d920 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
1d930 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1d940 20 70 61 67 65 73 20 73 74 61 72 74 69 6e 67 20   pages starting 
1d950 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61  at pg1 to journa
1d960 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  l */.    int ii;
1d970 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
1d980 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20   doNotSync flag 
1d990 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62 65  to 1. This is be
1d9a0 63 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20  cause we cannot 
1d9b0 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 0a  allow a journal.
1d9c0 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74 6f      ** header to
1d9d0 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 74 77   be written betw
1d9e0 65 65 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f  een the pages jo
1d9f0 75 72 6e 61 6c 65 64 20 62 79 20 74 68 69 73 20  urnaled by this 
1da00 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  function..    */
1da10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1da20 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d  ger->doNotSync==
1da30 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
1da40 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a  >doNotSync = 1;.
1da50 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69  .    /* This tri
1da60 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  ck assumes that 
1da70 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73 69  both the page-si
1da80 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69  ze and sector-si
1da90 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e  ze are.    ** an
1daa0 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f   integer power o
1dab0 66 20 32 2e 20 49 74 20 73 65 74 73 20 76 61 72  f 2. It sets var
1dac0 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65  iable pg1 to the
1dad0 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20   identifier.    
1dae0 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ** of the first 
1daf0 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74  page of the sect
1db00 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65  or pPg is locate
1db10 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  d on..    */.   
1db20 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67   pg1 = ((pPg->pg
1db30 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50  no-1) & ~(nPageP
1db40 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31  erSector-1)) + 1
1db50 3b 0a 0a 20 20 20 20 6e 50 61 67 65 43 6f 75 6e  ;..    nPageCoun
1db60 74 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  t = sqlite3Pager
1db70 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
1db80 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  );.    if( pPg->
1db90 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20  pgno>nPageCount 
1dba0 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
1dbb0 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67   (pPg->pgno - pg
1dbc0 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20  1)+1;.    }else 
1dbd0 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65  if( (pg1+nPagePe
1dbe0 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65  rSector-1)>nPage
1dbf0 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e  Count ){.      n
1dc00 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e  Page = nPageCoun
1dc10 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c  t+1-pg1;.    }el
1dc20 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20  se{.      nPage 
1dc30 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  = nPagePerSector
1dc40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
1dc50 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20  rt(nPage>0);.   
1dc60 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67   assert(pg1<=pPg
1dc70 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73  ->pgno);.    ass
1dc80 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e  ert((pg1+nPage)>
1dc90 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20  pPg->pgno);..   
1dca0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50   for(ii=0; ii<nP
1dcb0 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  age && rc==SQLIT
1dcc0 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  E_OK; ii++){.   
1dcd0 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31     Pgno pg = pg1
1dce0 2b 69 69 3b 0a 20 20 20 20 20 20 69 66 28 20 21  +ii;.      if( !
1dcf0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1dd00 61 6c 20 7c 7c 20 70 67 3d 3d 70 50 67 2d 3e 70  al || pg==pPg->p
1dd10 67 6e 6f 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  gno || .        
1dd20 20 20 70 67 3e 70 50 61 67 65 72 2d 3e 6f 72 69    pg>pPager->ori
1dd30 67 44 62 53 69 7a 65 20 7c 7c 20 21 28 70 50 61  gDbSize || !(pPa
1dd40 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
1dd50 70 67 2f 38 5d 26 28 31 3c 3c 28 70 67 26 37 29  pg/8]&(1<<(pg&7)
1dd60 29 29 0a 20 20 20 20 20 20 29 20 7b 0a 20 20 20  )).      ) {.   
1dd70 20 20 20 20 20 69 66 28 20 70 67 21 3d 50 41 47       if( pg!=PAG
1dd80 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
1dd90 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
1dda0 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20  PgHdr *pPage;.  
1ddb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1ddc0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
1ddd0 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29  ger, pg, &pPage)
1dde0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1ddf0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1de00 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1de10 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 50  = pager_write(pP
1de20 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1de30 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1de40 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
1de50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1de60 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1de70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1de80 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d  ger->doNotSync==
1de90 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  1 );.    pPager-
1dea0 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a  >doNotSync = 0;.
1deb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
1dec0 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 44  = pager_write(pD
1ded0 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  bPage);.  }.  re
1dee0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1def0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
1df00 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20   the page given 
1df10 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
1df20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70  was previously p
1df30 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69  assed.** to sqli
1df40 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2e  te3PagerWrite().
1df50 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
1df60 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66  , return TRUE if
1df70 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20   it is ok.** to 
1df80 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65  change the conte
1df90 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nt of the page..
1dfa0 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
1dfb0 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  G.int sqlite3Pag
1dfc0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 44 62  erIswriteable(Db
1dfd0 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
1dfe0 74 75 72 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b  turn pPg->dirty;
1dff0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
1e000 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1e010 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 52 65 70 6c  ACUUM./*.** Repl
1e020 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ace the content 
1e030 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
1e040 20 77 69 74 68 20 74 68 65 20 69 6e 66 6f 72 6d   with the inform
1e050 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 74 68 69  ation in the thi
1e060 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  rd.** argument..
1e070 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
1e080 67 65 72 4f 76 65 72 77 72 69 74 65 28 50 61 67  gerOverwrite(Pag
1e090 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
1e0a0 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 70 44 61   pgno, void *pDa
1e0b0 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
1e0c0 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  g;.  int rc;..  
1e0d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1e0e0 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e  rGet(pPager, pgn
1e0f0 6f 2c 20 26 70 50 67 29 3b 0a 20 20 69 66 28 20  o, &pPg);.  if( 
1e100 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e110 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1e120 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 29  3PagerWrite(pPg)
1e130 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1e140 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e150 20 6d 65 6d 63 70 79 28 73 71 6c 69 74 65 33 50   memcpy(sqlite3P
1e160 61 67 65 72 47 65 74 44 61 74 61 28 70 50 67 29  agerGetData(pPg)
1e170 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , pData, pPager-
1e180 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1e190 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  }.    sqlite3Pag
1e1a0 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
1e1b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1e1c0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
1e1d0 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f   call to this ro
1e1e0 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20  utine tells the 
1e1f0 70 61 67 65 72 20 74 68 61 74 20 69 74 20 69 73  pager that it is
1e200 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
1e210 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69  o.** write the i
1e220 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61  nformation on pa
1e230 67 65 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74  ge pPg back to t
1e240 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68  he disk, even th
1e250 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67  ough.** that pag
1e260 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65  e might be marke
1e270 64 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a  d as dirty..**.*
1e280 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20  * The overlying 
1e290 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20 63  software layer c
1e2a0 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
1e2b0 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68  e when all of th
1e2c0 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65  e data.** on the
1e2d0 20 67 69 76 65 6e 20 70 61 67 65 20 69 73 20 75   given page is u
1e2e0 6e 75 73 65 64 2e 20 20 54 68 65 20 70 61 67 65  nused.  The page
1e2f0 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65  r marks the page
1e300 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20   as clean so.** 
1e310 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74  that it does not
1e320 20 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20   get written to 
1e330 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74  disk..**.** Test
1e340 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 69 73  s show that this
1e350 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74   optimization, t
1e360 6f 67 65 74 68 65 72 20 77 69 74 68 20 74 68 65  ogether with the
1e370 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
1e380 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 62  DontRollback() b
1e390 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20  elow, more than 
1e3a0 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65 65 64  double the speed
1e3b0 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53  .** of large INS
1e3c0 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61  ERT operations a
1e3d0 6e 64 20 71 75 61 64 72 75 70 6c 65 20 74 68 65  nd quadruple the
1e3e0 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20   speed of large 
1e3f0 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57  DELETEs..**.** W
1e400 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1e410 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20   is called, set 
1e420 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  the alwaysRollba
1e430 63 6b 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e  ck flag to true.
1e440 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63  .** Subsequent c
1e450 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50  alls to sqlite3P
1e460 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
1e470 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  () for the same 
1e480 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65  page.** will the
1e490 72 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72  reafter be ignor
1e4a0 65 64 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  ed.  This is nec
1e4b0 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20  essary to avoid 
1e4c0 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65  a problem.** whe
1e4d0 72 65 20 61 20 70 61 67 65 20 77 69 74 68 20 64  re a page with d
1e4e0 61 74 61 20 69 73 20 61 64 64 65 64 20 74 6f 20  ata is added to 
1e4f0 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72  the freelist dur
1e500 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a  ing one part of.
1e510 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
1e520 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72   then removed fr
1e530 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  om the freelist 
1e540 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70  during a later p
1e550 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61  art.** of the sa
1e560 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  me transaction a
1e570 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f  nd reused for so
1e580 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
1e590 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73  .  When it.** is
1e5a0 20 66 69 72 73 74 20 61 64 64 65 64 20 74 6f 20   first added to 
1e5b0 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68  the freelist, th
1e5c0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1e5d0 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73  lled.  When reus
1e5e0 65 64 2c 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74  ed,.** the sqlit
1e5f0 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
1e600 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73  ack() routine is
1e610 20 63 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65   called.  But be
1e620 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 67  cause the.** pag
1e630 65 20 63 6f 6e 74 61 69 6e 73 20 63 72 69 74 69  e contains criti
1e640 63 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69  cal data, we sti
1e650 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75  ll need to be su
1e660 72 65 20 69 74 20 67 65 74 73 0a 2a 2a 20 72 6f  re it gets.** ro
1e670 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69  lled back in spi
1e680 74 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  te of the sqlite
1e690 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
1e6a0 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f  ck() call..*/.vo
1e6b0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  id sqlite3PagerD
1e6c0 6f 6e 74 57 72 69 74 65 28 44 62 50 61 67 65 20  ontWrite(DbPage 
1e6d0 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 50 67 48  *pDbPage){.  PgH
1e6e0 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67  dr *pPg = pDbPag
1e6f0 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e;.  Pager *pPag
1e700 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
1e710 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  ;..  if( MEMDB )
1e720 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 67 2d 3e   return;.  pPg->
1e730 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  alwaysRollback =
1e740 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64   1;.  if( pPg->d
1e750 69 72 74 79 20 26 26 20 21 70 50 61 67 65 72 2d  irty && !pPager-
1e760 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
1e770 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1e780 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
1e790 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28  HARED );.    if(
1e7a0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
1e7b0 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20  =(int)pPg->pgno 
1e7c0 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  && pPager->origD
1e7d0 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62  bSize<pPager->db
1e7e0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
1e7f0 20 49 66 20 74 68 69 73 20 70 61 67 65 73 20 69   If this pages i
1e800 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  s the last page 
1e810 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  in the file and 
1e820 74 68 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f  the file has gro
1e830 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69  wn.      ** duri
1e840 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ng the current t
1e850 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
1e860 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65   do NOT mark the
1e870 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a   page as clean..
1e880 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68        ** When th
1e890 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1e8a0 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d  grows, we must m
1e8b0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
1e8c0 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20  e last page.    
1e8d0 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65    ** gets writte
1e8e0 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20  n at least once 
1e8f0 73 6f 20 74 68 61 74 20 74 68 65 20 64 69 73 6b  so that the disk
1e900 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68   file will be th
1e910 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20  e correct.      
1e920 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20  ** size. If you 
1e930 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69  do not write thi
1e940 73 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 73  s page and the s
1e950 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a  ize of the file.
1e960 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
1e970 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69  disk ends up bei
1e980 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68  ng too small, th
1e990 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64  at can lead to d
1e9a0 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
1e9b0 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69   corruption duri
1e9c0 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e  ng the next tran
1e9d0 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
1e9e0 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /.    }else{.   
1e9f0 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
1ea00 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20  DONT_WRITE page 
1ea10 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67  %d of %d\n", pPg
1ea20 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
1ea30 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
1ea40 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20  IOTRACE(("CLEAN 
1ea50 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
1ea60 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20  , pPg->pgno)).  
1ea70 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50      makeClean(pP
1ea80 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  g);.#ifdef SQLIT
1ea90 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
1eaa0 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
1eab0 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
1eac0 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
1ead0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1eae0 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69  ** A call to thi
1eaf0 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20  s routine tells 
1eb00 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69  the pager that i
1eb10 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  f a rollback occ
1eb20 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f  urs,.** it is no
1eb30 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72  t necessary to r
1eb40 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 20  estore the data 
1eb50 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
1eb60 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e  e.  This.** mean
1eb70 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
1eb80 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
1eb90 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67 69 76  o record the giv
1eba0 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a  en page in the.*
1ebb0 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
1ebc0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65 20  al..**.** If we 
1ebd0 68 61 76 65 20 6e 6f 74 20 79 65 74 20 61 63 74  have not yet act
1ebe0 75 61 6c 6c 79 20 72 65 61 64 20 74 68 65 20 63  ually read the c
1ebf0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 70  ontent of this p
1ec00 61 67 65 20 28 69 66 0a 2a 2a 20 74 68 65 20 50  age (if.** the P
1ec10 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66 6c  gHdr.needRead fl
1ec20 61 67 20 69 73 20 73 65 74 29 20 74 68 65 6e 20  ag is set) then 
1ec30 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74  this routine act
1ec40 73 20 61 73 20 61 20 70 72 6f 6d 69 73 65 0a 2a  s as a promise.*
1ec50 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6e  * that we will n
1ec60 65 76 65 72 20 6e 65 65 64 20 74 6f 20 72 65 61  ever need to rea
1ec70 64 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  d the page conte
1ec80 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
1ec90 2e 0a 2a 2a 20 73 6f 20 74 68 65 20 6e 65 65 64  ..** so the need
1eca0 52 65 61 64 20 66 6c 61 67 20 63 61 6e 20 62 65  Read flag can be
1ecb0 20 63 6c 65 61 72 65 64 20 61 74 20 74 68 69 73   cleared at this
1ecc0 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20   point..*/.void 
1ecd0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
1ece0 52 6f 6c 6c 62 61 63 6b 28 44 62 50 61 67 65 20  Rollback(DbPage 
1ecf0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
1ed00 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1ed10 61 67 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  ager;..  assert(
1ed20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
1ed30 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
1ed40 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1ed50 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
1ed60 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
1ed70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
1ed80 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c  ck || pPager->al
1ed90 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20  waysRollback || 
1eda0 4d 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a  MEMDB ) return;.
1edb0 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f    if( !pPg->inJo
1edc0 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50  urnal && (int)pP
1edd0 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65  g->pgno <= pPage
1ede0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
1edf0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1ee00 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21  ger->aInJournal!
1ee10 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
1ee20 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67  ->aInJournal[pPg
1ee30 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
1ee40 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
1ee50 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
1ee60 6c 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e  l = 1;.    pPg->
1ee70 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20  needRead = 0;.  
1ee80 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1ee90 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20  mtInUse ){.     
1eea0 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
1eeb0 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
1eec0 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
1eed0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 50 41 47  );.    }.    PAG
1eee0 45 52 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 52  ERTRACE3("DONT_R
1eef0 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20 25 64 20  OLLBACK page %d 
1ef00 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70  of %d\n", pPg->p
1ef10 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
1ef20 67 65 72 29 29 3b 0a 20 20 20 20 49 4f 54 52 41  ger));.    IOTRA
1ef30 43 45 28 28 22 47 41 52 42 41 47 45 20 25 70 20  CE(("GARBAGE %p 
1ef40 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
1ef50 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 7d 0a 20  Pg->pgno)).  }. 
1ef60 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
1ef70 74 49 6e 55 73 65 20 0a 20 20 20 26 26 20 21 70  tInUse .   && !p
1ef80 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 70  ageInStatement(p
1ef90 50 67 29 20 0a 20 20 20 26 26 20 28 69 6e 74 29  Pg) .   && (int)
1efa0 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65  pPg->pgno<=pPage
1efb0 72 2d 3e 73 74 6d 74 53 69 7a 65 20 0a 20 20 29  r->stmtSize .  )
1efc0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1efd0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20  g->inJournal || 
1efe0 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70  (int)pPg->pgno>p
1eff0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1f000 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
1f010 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
1f020 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  !=0 );.    pPage
1f030 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e  r->aInStmt[pPg->
1f040 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
1f050 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 7d  Pg->pgno&7);.  }
1f060 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
1f070 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1f080 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74  d to increment t
1f090 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f0a0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c   change-counter,
1f0b0 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20 62 79  .** stored at by
1f0c0 74 65 20 32 34 20 6f 66 20 74 68 65 20 70 61 67  te 24 of the pag
1f0d0 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  er file..*/.stat
1f0e0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63  ic int pager_inc
1f0f0 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
1f100 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1f110 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b    PgHdr *pPgHdr;
1f120 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f  .  u32 change_co
1f130 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  unter;.  int rc;
1f140 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
1f150 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
1f160 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20   ){.    /* Open 
1f170 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 66 69  page 1 of the fi
1f180 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20  le for writing. 
1f190 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
1f1a0 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
1f1b0 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29 3b  er, 1, &pPgHdr);
1f1c0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1f1d0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1f1e0 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  rc;.    rc = sql
1f1f0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1f200 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20  PgHdr);.    if( 
1f210 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1f220 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 0a 20 20  return rc;.  .  
1f230 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 63 75    /* Read the cu
1f240 72 72 65 6e 74 20 76 61 6c 75 65 20 61 74 20 62  rrent value at b
1f250 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63  yte 24. */.    c
1f260 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20  hange_counter = 
1f270 72 65 74 72 69 65 76 65 33 32 62 69 74 73 28 70  retrieve32bits(p
1f280 50 67 48 64 72 2c 20 32 34 29 3b 0a 20 20 0a 20  PgHdr, 24);.  . 
1f290 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20     /* Increment 
1f2a0 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72  the value just r
1f2b0 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74  ead and write it
1f2c0 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34   back to byte 24
1f2d0 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e 67 65 5f  . */.    change_
1f2e0 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 70  counter++;.    p
1f2f0 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
1f300 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
1f310 50 67 48 64 72 29 29 2b 32 34 2c 20 63 68 61 6e  PgHdr))+24, chan
1f320 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 0a  ge_counter);.  .
1f330 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
1f340 68 65 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  he page referenc
1f350 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  e. */.    sqlite
1f360 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48  3PagerUnref(pPgH
1f370 64 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  dr);.    pPager-
1f380 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
1f390 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
1f3a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1f3b0 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
1f3c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
1f3d0 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61 67  r the pager pPag
1f3e0 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e  er. zMaster poin
1f3f0 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a  ts to the name.*
1f400 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * of a master jo
1f410 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
1f420 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65  should be writte
1f430 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76  n into the indiv
1f440 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  idual.** journal
1f450 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d   file. zMaster m
1f460 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63  ay be NULL, whic
1f470 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  h is interpreted
1f480 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   as no master.**
1f490 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67   journal (a sing
1f4a0 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
1f4b0 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
1f4c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73  This routine ens
1f4d0 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6a 6f  ures that the jo
1f4e0 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2c  urnal is synced,
1f4f0 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
1f500 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74   written.** to t
1f510 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f520 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
1f530 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 54  e file synced. T
1f540 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68  he only thing th
1f550 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f  at.** remains to
1f560 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
1f570 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64 65  saction is to de
1f580 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
1f590 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73   file (or.** mas
1f5a0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1f5b0 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a   if specified)..
1f5c0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
1f5d0 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c  if zMaster==NULL
1f5e0 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20  , this does not 
1f5f0 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65 76  overwrite a prev
1f600 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61  ious value.** pa
1f610 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74  ssed to an sqlit
1f620 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
1f630 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a  seOne() call..**
1f640 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
1f650 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a   nTrunc is non-z
1f660 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 61  ero, then the pa
1f670 67 65 72 20 66 69 6c 65 20 69 73 20 74 72 75 6e  ger file is trun
1f680 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75  cated to.** nTru
1f690 6e 63 20 70 61 67 65 73 20 28 74 68 69 73 20 69  nc pages (this i
1f6a0 73 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76  s used by auto-v
1f6b0 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73 29  acuum databases)
1f6c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1f6d0 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
1f6e0 4f 6e 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  One(Pager *pPage
1f6f0 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
1f700 4d 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e 54 72  Master, Pgno nTr
1f710 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  unc){.  int rc =
1f720 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50   SQLITE_OK;..  P
1f730 41 47 45 52 54 52 41 43 45 34 28 22 44 41 54 41  AGERTRACE4("DATA
1f740 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d  BASE SYNC: File=
1f750 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54  %s zMaster=%s nT
1f760 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20  runc=%d\n", .   
1f770 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65     pPager->zFile
1f780 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  name, zMaster, n
1f790 54 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49 66  Trunc);..  /* If
1f7a0 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
1f7b0 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20  emory db, or no 
1f7c0 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
1f7d0 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74  written to, or t
1f7e0 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
1f7f0 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
1f800 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  en called, it is
1f810 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
1f820 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1f830 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te!=PAGER_SYNCED
1f840 20 26 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50   && !MEMDB && pP
1f850 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
1f860 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
1f870 50 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Pg;.    assert( 
1f880 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1f890 70 65 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  pen );..    /* I
1f8a0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
1f8b0 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73  al file name has
1f8c0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
1f8d0 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20 20  itten to the.   
1f8e0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
1f8f0 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69  , then no sync i
1f900 73 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73  s required. This
1f910 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69 74   happens when it
1f920 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74 74   is.    ** writt
1f930 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f  en, then the pro
1f940 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75 70  cess fails to up
1f950 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53  grade from a RES
1f960 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20 20  ERVED to an.    
1f970 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
1f980 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d 65  k. The next time
1f990 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 72 69   the process tri
1f9a0 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65  es to commit the
1f9b0 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
1f9c0 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65  ion the m-j name
1f9d0 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61   will have alrea
1f9e0 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 2e  dy been written.
1f9f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1fa00 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74  !pPager->setMast
1fa10 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  er ){.      rc =
1fa20 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
1fa30 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72  gecounter(pPager
1fa40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1fa50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1fa60 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 23 69 66  o sync_exit;.#if
1fa70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1fa80 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1fa90 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20    if( nTrunc!=0 
1faa0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
1fab0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
1fac0 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65 20 64  n has made the d
1fad0 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c  atabase smaller,
1fae0 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a   then all pages.
1faf0 20 20 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67          ** being
1fb00 20 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68   discarded by th
1fb10 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73  e truncation mus
1fb20 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  t be written to 
1fb30 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
1fb40 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20      ** file..   
1fb50 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1fb60 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20 20  Pgno i;.        
1fb70 69 6e 74 20 69 53 6b 69 70 20 3d 20 50 41 47 45  int iSkip = PAGE
1fb80 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
1fb90 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20  );.        for( 
1fba0 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d 70  i=nTrunc+1; i<=p
1fbb0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1fbc0 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20  e; i++ ){.      
1fbd0 20 20 20 20 69 66 28 20 21 28 70 50 61 67 65 72      if( !(pPager
1fbe0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69 2f 38  ->aInJournal[i/8
1fbf0 5d 20 26 20 28 31 3c 3c 28 69 26 37 29 29 29 20  ] & (1<<(i&7))) 
1fc00 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20  && i!=iSkip ){. 
1fc10 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1fc20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
1fc30 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50 67 29  pPager, i, &pPg)
1fc40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1fc50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1fc60 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
1fc70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
1fc80 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1fc90 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20 20  rite(pPg);.     
1fca0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
1fcb0 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
1fcc0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
1fcd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1fce0 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
1fcf0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1fd00 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a 23 65     } .      }.#e
1fd10 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20  ndif.      rc = 
1fd20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
1fd30 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  al(pPager, zMast
1fd40 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
1fd50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1fd60 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
1fd70 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f       rc = syncJo
1fd80 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
1fd90 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1fda0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1fdb0 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a  nc_exit;.    }..
1fdc0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1fdd0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1fde0 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30     if( nTrunc!=0
1fdf0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1fe00 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
1fe10 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75  ate(pPager, nTru
1fe20 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  nc);.      if( r
1fe30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1fe40 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
1fe50 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1fe60 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69   /* Write all di
1fe70 72 74 79 20 70 61 67 65 73 20 74 6f 20 74 68 65  rty pages to the
1fe80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1fe90 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  /.    pPg = page
1fea0 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
1feb0 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20  pages(pPager);. 
1fec0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
1fed0 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67  ite_pagelist(pPg
1fee0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1fef0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1ff00 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 70  sync_exit;.    p
1ff10 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
1ff20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20  0;..    /* Sync 
1ff30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ff40 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70  e. */.    if( !p
1ff50 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
1ff60 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1ff70 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
1ff80 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ->fd, 0);.    }.
1ff90 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42      IOTRACE(("DB
1ffa0 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
1ffb0 65 72 29 29 0a 0a 20 20 20 20 70 50 61 67 65 72  er))..    pPager
1ffc0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
1ffd0 53 59 4e 43 45 44 3b 0a 20 20 7d 65 6c 73 65 20  SYNCED;.  }else 
1ffe0 69 66 28 20 4d 45 4d 44 42 20 26 26 20 6e 54 72  if( MEMDB && nTr
1fff0 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 63  unc!=0 ){.    rc
20000 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
20010 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
20020 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79  nTrunc);.  }..sy
20030 6e 63 5f 65 78 69 74 3a 0a 20 20 72 65 74 75 72  nc_exit:.  retur
20040 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
20050 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67  Commit all chang
20060 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
20070 73 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74  se and release t
20080 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a  he write lock..*
20090 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d  *.** If the comm
200a0 69 74 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79  it fails for any
200b0 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62   reason, a rollb
200c0 61 63 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d  ack attempt is m
200d0 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72  ade.** and an er
200e0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
200f0 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f  rned.  If the co
20100 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c  mmit worked, SQL
20110 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74  ITE_OK.** is ret
20120 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
20130 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
20140 50 68 61 73 65 54 77 6f 28 50 61 67 65 72 20 2a  PhaseTwo(Pager *
20150 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
20160 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  c;.  PgHdr *pPg;
20170 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
20180 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72  errCode ){.    r
20190 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
201a0 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28  rCode;.  }.  if(
201b0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50   pPager->state<P
201c0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
201d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
201e0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
201f0 50 41 47 45 52 54 52 41 43 45 32 28 22 43 4f 4d  PAGERTRACE2("COM
20200 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  MIT %d\n", PAGER
20210 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69  ID(pPager));.  i
20220 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
20230 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f  pPg = pager_get_
20240 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28  all_dirty_pages(
20250 70 50 61 67 65 72 29 3b 0a 20 20 20 20 77 68 69  pPager);.    whi
20260 6c 65 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20  le( pPg ){.     
20270 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
20280 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
20290 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
202a0 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f        clearHisto
202b0 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20  ry(pHist);.     
202c0 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
202d0 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
202e0 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
202f0 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d   pHist->inStmt =
20300 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   0;.      pPg->n
20310 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
20320 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53     pHist->pPrevS
20330 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65  tmt = pHist->pNe
20340 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  xtStmt = 0;.    
20350 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69    pPg = pPg->pDi
20360 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  rty;.    }.    p
20370 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
20380 30 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  0;.#ifndef NDEBU
20390 47 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  G.    for(pPg=pP
203a0 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
203b0 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
203c0 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73  ll){.      PgHis
203d0 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
203e0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
203f0 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
20400 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c  assert( !pPg->al
20410 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a  waysRollback );.
20420 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
20430 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20  Hist->pOrig );. 
20440 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48       assert( !pH
20450 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20  ist->pStmt );.  
20460 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70    }.#endif.    p
20470 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30  Pager->pStmt = 0
20480 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
20490 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
204a0 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ED;.    return S
204b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
204c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
204d0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21  journalOpen || !
204e0 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
204f0 68 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  he );.  assert( 
20500 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
20510 41 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20 21  AGER_SYNCED || !
20520 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
20530 68 65 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67  he );.  rc = pag
20540 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
20550 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  on(pPager);.  re
20560 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
20570 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a  (pPager, rc);.}.
20580 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
20590 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20 54 68  all changes.  Th
205a0 65 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73  e database falls
205b0 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53   back to PAGER_S
205c0 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41  HARED mode..** A
205d0 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  ll in-memory cac
205e0 68 65 20 70 61 67 65 73 20 72 65 76 65 72 74 20  he pages revert 
205f0 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61  to their origina
20600 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e  l data contents.
20610 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
20620 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a  is deleted..**.*
20630 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
20640 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73  annot fail unles
20650 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  s some other pro
20660 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c  cess is not foll
20670 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72  owing.** the cor
20680 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f  rect locking pro
20690 74 6f 63 6f 6c 20 6f 72 20 75 6e 6c 65 73 73 20  tocol or unless 
206a0 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72  some other.** pr
206b0 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e 67  ocess is writing
206c0 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68 65 20   trash into the 
206d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 53 51  journal file (SQ
206e0 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20 6f 72  LITE_CORRUPT) or
206f0 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70 72 69  .** unless a pri
20700 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  or malloc() fail
20710 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ed (SQLITE_NOMEM
20720 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65 20  ).  Appropriate 
20730 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61  error.** codes a
20740 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20  re returned for 
20750 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61 73 69  all these occasi
20760 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  ons.  Otherwise,
20770 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
20780 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
20790 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  t sqlite3PagerRo
207a0 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
207b0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
207c0 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22  .  PAGERTRACE2("
207d0 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20  ROLLBACK %d\n", 
207e0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
207f0 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
20800 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  .    PgHdr *p;. 
20810 20 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d     for(p=pPager-
20820 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70  >pAll; p; p=p->p
20830 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
20840 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
20850 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
20860 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  !p->alwaysRollba
20870 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ck );.      if( 
20880 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20  !p->dirty ){.   
20890 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28 28       assert( !((
208a0 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44  PgHistory *)PGHD
208b0 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61  R_TO_HIST(p, pPa
208c0 67 65 72 29 29 2d 3e 70 4f 72 69 67 20 29 3b 0a  ger))->pOrig );.
208d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
208e0 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50  !((PgHistory *)P
208f0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20  GHDR_TO_HIST(p, 
20900 70 50 61 67 65 72 29 29 2d 3e 70 53 74 6d 74 20  pPager))->pStmt 
20910 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  );.        conti
20920 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  nue;.      }..  
20930 20 20 20 20 70 48 69 73 74 20 3d 20 50 47 48 44      pHist = PGHD
20940 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61  R_TO_HIST(p, pPa
20950 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
20960 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a  pHist->pOrig ){.
20970 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50          memcpy(P
20980 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c  GHDR_TO_DATA(p),
20990 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70   pHist->pOrig, p
209a0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
209b0 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  ;.        PAGERT
209c0 52 41 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d  RACE3("ROLLBACK-
209d0 50 41 47 45 20 25 64 20 6f 66 20 25 64 5c 6e 22  PAGE %d of %d\n"
209e0 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  , p->pgno, PAGER
209f0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
20a00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20a10 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 50    PAGERTRACE3("P
20a20 41 47 45 20 25 64 20 69 73 20 63 6c 65 61 6e 20  AGE %d is clean 
20a30 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e  on %d\n", p->pgn
20a40 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  o, PAGERID(pPage
20a50 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r));.      }.   
20a60 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28     clearHistory(
20a70 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70 2d  pHist);.      p-
20a80 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
20a90 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d    p->inJournal =
20aa0 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d   0;.      pHist-
20ab0 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  >inStmt = 0;.   
20ac0 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53     pHist->pPrevS
20ad0 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65  tmt = pHist->pNe
20ae0 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  xtStmt = 0;.    
20af0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52    if( pPager->xR
20b00 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20  einiter ){.     
20b10 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e     pPager->xRein
20b20 69 74 65 72 28 70 2c 20 70 50 61 67 65 72 2d 3e  iter(p, pPager->
20b30 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
20b40 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61   }.    }.    pPa
20b50 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  ger->pDirty = 0;
20b60 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
20b70 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  mt = 0;.    pPag
20b80 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
20b90 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b  ger->origDbSize;
20ba0 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63  .    pager_trunc
20bb0 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72  ate_cache(pPager
20bc0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
20bd0 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20  tmtInUse = 0;.  
20be0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
20bf0 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
20c00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
20c10 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  E_OK;.  }..  if(
20c20 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43   !pPager->dirtyC
20c30 61 63 68 65 20 7c 7c 20 21 70 50 61 67 65 72 2d  ache || !pPager-
20c40 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
20c50 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
20c60 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
20c70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
20c80 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
20c90 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
20ca0 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  e && pPager->err
20cb0 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
20cc0 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  L ){.    if( pPa
20cd0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
20ce0 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20  R_EXCLUSIVE ){. 
20cf0 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62       pager_playb
20d00 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
20d10 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
20d20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
20d30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
20d40 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
20d50 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
20d60 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 72 63   int rc2;.    rc
20d70 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
20d80 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
20d90 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f 65 6e    rc2 = pager_en
20da0 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
20db0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
20dc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
20dd0 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
20de0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
20df0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
20e00 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30  ayback(pPager, 0
20e10 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 61 67 65  );.  }.  /* page
20e20 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
20e30 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
20e40 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 2f 2a  Size = -1;..  /*
20e50 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
20e60 75 72 73 20 64 75 72 69 6e 67 20 61 20 52 4f 4c  urs during a ROL
20e70 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f  LBACK, we can no
20e80 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20 74 68   longer trust th
20e90 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 63 61 63  e pager.  ** cac
20ea0 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67 65  he. So call page
20eb0 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74 68 65  r_error() on the
20ec0 20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65   way out to make
20ed0 20 61 6e 79 20 65 72 72 6f 72 20 0a 20 20 2a 2a   any error .  **
20ee0 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20 20 2a   persistent..  *
20ef0 2f 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72  /.  return pager
20f00 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
20f10 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  c);.}../*.** Ret
20f20 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
20f30 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
20f40 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c   opened read-onl
20f50 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  y.  Return FALSE
20f60 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62  .** if the datab
20f70 61 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f 72  ase is (in theor
20f80 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a  y) writable..*/.
20f90 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
20fa0 49 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72  Isreadonly(Pager
20fb0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
20fc0 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64  urn pPager->read
20fd0 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Only;.}../*.** R
20fe0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
20ff0 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
21000 6f 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a  o the pager..*/.
21010 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
21020 52 65 66 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  Refcount(Pager *
21030 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
21040 6e 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a  n pPager->nRef;.
21050 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
21060 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73  _TEST./*.** This
21070 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
21080 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
21090 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a   analysis only..
210a0 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50  */.int *sqlite3P
210b0 61 67 65 72 53 74 61 74 73 28 50 61 67 65 72 20  agerStats(Pager 
210c0 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74  *pPager){.  stat
210d0 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20  ic int a[11];.  
210e0 61 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[0] = pPager->n
210f0 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50  Ref;.  a[1] = pP
21100 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61  ager->nPage;.  a
21110 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78  [2] = pPager->mx
21120 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70  Page;.  a[3] = p
21130 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
21140 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[4] = pPager->
21150 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20  state;.  a[5] = 
21160 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
21170 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72  .  a[6] = pPager
21180 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d  ->nHit;.  a[7] =
21190 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a   pPager->nMiss;.
211a0 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20    a[8] = 0;  /* 
211b0 55 73 65 64 20 74 6f 20 62 65 20 70 50 61 67 65  Used to be pPage
211c0 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b  r->nOvfl */.  a[
211d0 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  9] = pPager->nRe
211e0 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50  ad;.  a[10] = pP
211f0 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20  ager->nWrite;.  
21200 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64  return a;.}.#end
21210 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  if../*.** Set th
21220 65 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c  e statement roll
21230 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a  back point..**.*
21240 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
21250 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
21260 77 69 74 68 20 74 68 65 20 74 72 61 6e 73 61 63  with the transac
21270 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72  tion journal alr
21280 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41  eady.** open.  A
21290 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 20 6a   new statement j
212a0 6f 75 72 6e 61 6c 20 69 73 20 63 72 65 61 74 65  ournal is create
212b0 64 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  d that can be us
212c0 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a  ed to rollback.*
212d0 2a 20 63 68 61 6e 67 65 73 20 6f 66 20 61 20 73  * changes of a s
212e0 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e  ingle SQL comman
212f0 64 20 77 69 74 68 69 6e 20 61 20 6c 61 72 67 65  d within a large
21300 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  r transaction..*
21310 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
21320 65 72 53 74 6d 74 42 65 67 69 6e 28 50 61 67 65  erStmtBegin(Page
21330 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
21340 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
21350 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55  !pPager->stmtInU
21360 73 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  se );.  assert( 
21370 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
21380 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
21390 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
213a0 3e 64 62 53 69 7a 65 3e 3d 30 20 29 3b 0a 20 20  >dbSize>=0 );.  
213b0 50 41 47 45 52 54 52 41 43 45 32 28 22 53 54 4d  PAGERTRACE2("STM
213c0 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22 2c 20 50  T-BEGIN %d\n", P
213d0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
213e0 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
213f0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
21400 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 20 20 70  InUse = 1;.    p
21410 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
21420 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
21430 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
21440 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
21450 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ( !pPager->journ
21460 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70 50  alOpen ){.    pP
21470 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70  ager->stmtAutoop
21480 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  en = 1;.    retu
21490 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
214a0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
214b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
214c0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  );.  pPager->aIn
214d0 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Stmt = sqliteMal
214e0 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53  loc( pPager->dbS
214f0 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69  ize/8 + 1 );.  i
21500 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  f( pPager->aInSt
21510 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  mt==0 ){.    /* 
21520 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
21530 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44  ager->fd, SHARED
21540 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72  _LOCK); */.    r
21550 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
21560 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  EM;.  }.#ifndef 
21570 4e 44 45 42 55 47 0a 20 20 72 63 20 3d 20 73 71  NDEBUG.  rc = sq
21580 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
21590 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50  pPager->jfd, &pP
215a0 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29  ager->stmtJSize)
215b0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
215c0 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69  o stmt_begin_fai
215d0 6c 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70  led;.  assert( p
215e0 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
215f0 20 3d 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   == pPager->jour
21600 6e 61 6c 4f 66 66 20 29 3b 0a 23 65 6e 64 69 66  nalOff );.#endif
21610 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  .  pPager->stmtJ
21620 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a  Size = pPager->j
21630 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61  ournalOff;.  pPa
21640 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
21650 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
21660 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64    pPager->stmtHd
21670 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67  rOff = 0;.  pPag
21680 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20  er->stmtCksum = 
21690 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
216a0 74 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  t;.  if( !pPager
216b0 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20  ->stmtOpen ){.  
216c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
216d0 67 65 72 4f 70 65 6e 74 65 6d 70 28 26 70 50 61  gerOpentemp(&pPa
216e0 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20  ger->stfd);.    
216f0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74  if( rc ) goto st
21700 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b  mt_begin_failed;
21710 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
21720 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70  tOpen = 1;.    p
21730 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20  Pager->stmtNRec 
21740 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 0;.  }.  pPage
21750 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31  r->stmtInUse = 1
21760 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
21770 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67  E_OK;. .stmt_beg
21780 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28  in_failed:.  if(
21790 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
217a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
217b0 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  ee(pPager->aInSt
217c0 6d 74 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  mt);.    pPager-
217d0 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  >aInStmt = 0;.  
217e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
217f0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
21800 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69   statement..*/.i
21810 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
21820 74 6d 74 43 6f 6d 6d 69 74 28 50 61 67 65 72 20  tmtCommit(Pager 
21830 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
21840 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
21850 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  e ){.    PgHdr *
21860 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20  pPg, *pNext;.   
21870 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 54   PAGERTRACE2("ST
21880 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c  MT-COMMIT %d\n",
21890 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
218a0 29 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  );.    if( !MEMD
218b0 42 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  B ){.      sqlit
218c0 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
218d0 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 20  >stfd, 0);.     
218e0 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54 72 75   /* sqlite3OsTru
218f0 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73 74  ncate(pPager->st
21900 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20  fd, 0); */.     
21910 20 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61   sqliteFree( pPa
21920 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a  ger->aInStmt );.
21930 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
21940 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d  nStmt = 0;.    }
21950 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28  else{.      for(
21960 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d  pPg=pPager->pStm
21970 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78  t; pPg; pPg=pNex
21980 74 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69  t){.        PgHi
21990 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
219a0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
219b0 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
219c0 20 20 20 70 4e 65 78 74 20 3d 20 70 48 69 73 74     pNext = pHist
219d0 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20  ->pNextStmt;.   
219e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69       assert( pHi
219f0 73 74 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20  st->inStmt );.  
21a00 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53        pHist->inS
21a10 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tmt = 0;.       
21a20 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d   pHist->pPrevStm
21a30 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74  t = pHist->pNext
21a40 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
21a50 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69    sqliteFree(pHi
21a60 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20  st->pStmt);.    
21a70 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
21a80 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
21a90 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
21aa0 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20  stmtNRec = 0;.  
21ab0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
21ac0 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Use = 0;.    pPa
21ad0 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
21ae0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
21af0 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a  mtAutoopen = 0;.
21b00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21b10 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  OK;.}../*.** Rol
21b20 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e  lback a statemen
21b30 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
21b40 33 50 61 67 65 72 53 74 6d 74 52 6f 6c 6c 62 61  3PagerStmtRollba
21b50 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
21b60 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
21b70 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
21b80 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 41 47 45  nUse ){.    PAGE
21b90 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d 52 4f  RTRACE2("STMT-RO
21ba0 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41  LLBACK %d\n", PA
21bb0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
21bc0 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
21bd0 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50  .      PgHdr *pP
21be0 67 3b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  g;.      PgHisto
21bf0 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20  ry *pHist;.     
21c00 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
21c10 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67  >pStmt; pPg; pPg
21c20 3d 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d  =pHist->pNextStm
21c30 74 29 7b 0a 20 20 20 20 20 20 20 20 70 48 69 73  t){.        pHis
21c40 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
21c50 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
21c60 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73          if( pHis
21c70 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  t->pStmt ){.    
21c80 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48        memcpy(PGH
21c90 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
21ca0 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70   pHist->pStmt, p
21cb0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
21cc0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
21cd0 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53  teFree(pHist->pS
21ce0 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tmt);.          
21cf0 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30  pHist->pStmt = 0
21d00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21d10 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
21d20 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
21d30 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20  r->stmtSize;.   
21d40 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74     pager_truncat
21d50 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  e_cache(pPager);
21d60 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
21d70 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
21d80 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
21d90 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  er_stmt_playback
21da0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
21db0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
21dc0 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65  StmtCommit(pPage
21dd0 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
21de0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21df0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
21e00 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b  tmtAutoopen = 0;
21e10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21e20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
21e30 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
21e40 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
21e50 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
21e60 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65  har *sqlite3Page
21e70 72 46 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20  rFilename(Pager 
21e80 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
21e90 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  rn pPager->zFile
21ea0 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  name;.}../*.** R
21eb0 65 74 75 72 6e 20 74 68 65 20 64 69 72 65 63 74  eturn the direct
21ec0 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74 61 62  ory of the datab
21ed0 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  ase file..*/.con
21ee0 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
21ef0 50 61 67 65 72 44 69 72 6e 61 6d 65 28 50 61 67  PagerDirname(Pag
21f00 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
21f10 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44  eturn pPager->zD
21f20 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a  irectory;.}../*.
21f30 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75  ** Return the fu
21f40 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  ll pathname of t
21f50 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
21f60 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
21f70 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72  sqlite3PagerJour
21f80 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  nalname(Pager *p
21f90 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
21fa0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
21fb0 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  l;.}../*.** Retu
21fc0 72 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e 63  rn true if fsync
21fd0 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73  () calls are dis
21fe0 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70  abled for this p
21ff0 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41  ager.  Return FA
22000 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28  LSE.** if fsync(
22010 29 73 20 61 72 65 20 65 78 65 63 75 74 65 64 20  )s are executed 
22020 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74  normally..*/.int
22030 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73   sqlite3PagerNos
22040 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65  ync(Pager *pPage
22050 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
22060 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a  ger->noSync;.}..
22070 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
22080 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65  S_CODEC./*.** Se
22090 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20  t the codec for 
220a0 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f  this pager.*/.vo
220b0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
220c0 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72  etCodec(.  Pager
220d0 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64   *pPager,.  void
220e0 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64   *(*xCodec)(void
220f0 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74  *,void*,Pgno,int
22100 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65  ),.  void *pCode
22110 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72  cArg.){.  pPager
22120 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65  ->xCodec = xCode
22130 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f  c;.  pPager->pCo
22140 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41  decArg = pCodecA
22150 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  rg;.}.#endif..#i
22160 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22170 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
22180 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65  ** Move the page
22190 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
221a0 44 61 74 61 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  Data to location
221b0 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c   pgno in the fil
221c0 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  e. .**.** There 
221d0 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72  must be no refer
221e0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 63 75 72  ences to the cur
221f0 72 65 6e 74 20 70 61 67 65 20 70 67 6e 6f 2e 20  rent page pgno. 
22200 49 66 20 63 75 72 72 65 6e 74 20 70 61 67 65 0a  If current page.
22210 2a 2a 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61  ** pgno is not a
22220 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 72 6f  lready in the ro
22230 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20  llback journal, 
22240 69 74 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65  it is not writte
22250 6e 20 74 68 65 72 65 20 62 79 0a 2a 2a 20 62 79  n there by.** by
22260 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 54   this routine. T
22270 68 65 20 73 61 6d 65 20 61 70 70 6c 69 65 73 20  he same applies 
22280 74 6f 20 74 68 65 20 70 61 67 65 20 70 44 61 74  to the page pDat
22290 61 20 72 65 66 65 72 73 20 74 6f 20 6f 6e 20 65  a refers to on e
222a0 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 69 73 20  ntry to.** this 
222b0 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52  routine..**.** R
222c0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
222d0 20 70 61 67 65 20 72 65 66 65 72 65 64 20 74 6f   page refered to
222e0 20 62 79 20 70 44 61 74 61 20 72 65 6d 61 69 6e   by pData remain
222f0 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67   valid. Updating
22300 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74   any.** meta-dat
22310 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
22320 68 20 70 61 67 65 20 70 44 61 74 61 20 28 69 2e  h page pData (i.
22330 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69  e. data stored i
22340 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74  n the nExtra byt
22350 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  es.** allocated 
22360 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70  along with the p
22370 61 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70  age) is the resp
22380 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
22390 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20  e caller..**.** 
223a0 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  A transaction mu
223b0 73 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65  st be active whe
223c0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
223d0 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65  s called. It use
223e0 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69  d to be.** requi
223f0 72 65 64 20 74 68 61 74 20 61 20 73 74 61 74 65  red that a state
22400 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
22410 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c   was not active,
22420 20 62 75 74 20 74 68 69 73 20 72 65 73 74 72 69   but this restri
22430 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65  ction.** has bee
22440 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54  n removed (CREAT
22450 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f  E INDEX needs to
22460 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68 65   move a page whe
22470 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  n a statement.**
22480 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
22490 61 63 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20  active)..*/.int 
224a0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
224b0 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  page(Pager *pPag
224c0 65 72 2c 20 44 62 50 61 67 65 20 2a 70 50 67 2c  er, DbPage *pPg,
224d0 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
224e0 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 0a 20  gHdr *pPgOld; . 
224f0 20 69 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20 6e   int h;.  Pgno n
22500 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b  eedSyncPgno = 0;
22510 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ..  assert( pPg-
22520 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 50 41  >nRef>0 );..  PA
22530 47 45 52 54 52 41 43 45 35 28 22 4d 4f 56 45 20  GERTRACE5("MOVE 
22540 25 64 20 70 61 67 65 20 25 64 20 28 6e 65 65 64  %d page %d (need
22550 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74  Sync=%d) moves t
22560 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  o %d\n", .      
22570 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
22580 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d   pPg->pgno, pPg-
22590 3e 6e 65 65 64 53 79 6e 63 2c 20 70 67 6e 6f 29  >needSync, pgno)
225a0 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4d 4f  ;.  IOTRACE(("MO
225b0 56 45 20 25 70 20 25 64 20 25 64 5c 6e 22 2c 20  VE %p %d %d\n", 
225c0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
225d0 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 70 61 67  o, pgno))..  pag
225e0 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70  er_get_content(p
225f0 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg);.  if( pPg->
22600 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
22610 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70  needSyncPgno = p
22620 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73  Pg->pgno;.    as
22630 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75  sert( pPg->inJou
22640 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65  rnal );.    asse
22650 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29  rt( pPg->dirty )
22660 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
22670 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
22680 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69  ;.  }..  /* Unli
22690 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73  nk pPg from it's
226a0 20 68 61 73 68 2d 63 68 61 69 6e 20 2a 2f 0a 20   hash-chain */. 
226b0 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
226c0 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 0a  (pPager, pPg);..
226d0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68    /* If the cach
226e0 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 61 67  e contains a pag
226f0 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62  e with page-numb
22700 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20  er pgno, remove 
22710 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74 27  it.  ** from it'
22720 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c  s hash chain. Al
22730 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48 64 72  so, if the PgHdr
22740 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20 73 65  .needSync was se
22750 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65  t for .  ** page
22760 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74 68 65   pgno before the
22770 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74 69 6f   'move' operatio
22780 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  n, it needs to b
22790 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a  e retained .  **
227a0 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6d 6f   for the page mo
227b0 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a  ved there..  */.
227c0 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67 65 72    pPgOld = pager
227d0 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
227e0 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67  pgno);.  if( pPg
227f0 4f 6c 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Old ){.    asser
22800 74 28 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d  t( pPgOld->nRef=
22810 3d 30 20 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b  =0 );.    unlink
22820 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72  HashChain(pPager
22830 2c 20 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 6d  , pPgOld);.    m
22840 61 6b 65 43 6c 65 61 6e 28 70 50 67 4f 6c 64 29  akeClean(pPgOld)
22850 3b 0a 20 20 20 20 69 66 28 20 70 50 67 4f 6c 64  ;.    if( pPgOld
22860 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
22870 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 4f      assert( pPgO
22880 6c 64 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b  ld->inJournal );
22890 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
228a0 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 20  urnal = 1;.     
228b0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
228c0 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   1;.      assert
228d0 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
228e0 6e 63 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nc );.    }.  }.
228f0 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65  .  /* Change the
22900 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
22910 20 70 50 67 20 61 6e 64 20 69 6e 73 65 72 74 20   pPg and insert 
22920 69 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20  it into the new 
22930 68 61 73 68 2d 63 68 61 69 6e 2e 20 2a 2f 0a 20  hash-chain. */. 
22940 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
22950 20 29 3b 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20   );.  pPg->pgno 
22960 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20 70 67  = pgno;.  h = pg
22970 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48  no & (pPager->nH
22980 61 73 68 2d 31 29 3b 0a 20 20 69 66 28 20 70 50  ash-1);.  if( pP
22990 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 29  ager->aHash[h] )
229a0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
229b0 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e  ager->aHash[h]->
229c0 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a  pPrevHash==0 );.
229d0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73      pPager->aHas
229e0 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 20  h[h]->pPrevHash 
229f0 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67  = pPg;.  }.  pPg
22a00 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
22a10 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a  ager->aHash[h];.
22a20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b    pPager->aHash[
22a30 68 5d 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d  h] = pPg;.  pPg-
22a40 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a  >pPrevHash = 0;.
22a50 0a 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67  .  makeDirty(pPg
22a60 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 69 72  );.  pPager->dir
22a70 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 0a 20 20  tyCache = 1;..  
22a80 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  if( needSyncPgno
22a90 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65   ){.    /* If ne
22aa0 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f  edSyncPgno is no
22ab0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
22ac0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65   journal file ne
22ad0 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a  eds to be .    *
22ae0 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  * sync()ed befor
22af0 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 77 72  e any data is wr
22b00 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73  itten to databas
22b10 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65 65 64  e file page need
22b20 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a  SyncPgno..    **
22b30 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73   Currently, no s
22b40 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73 20  uch page exists 
22b50 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  in the page-cach
22b60 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a  e and the .    *
22b70 2a 20 50 61 67 65 72 2e 61 49 6e 4a 6f 75 72 6e  * Pager.aInJourn
22b80 61 6c 20 62 69 74 20 68 61 73 20 62 65 65 6e 20  al bit has been 
22b90 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64 73 20  set. This needs 
22ba0 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64 20 62  to be remedied b
22bb0 79 20 6c 6f 61 64 69 6e 67 0a 20 20 20 20 2a 2a  y loading.    **
22bc0 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74   the page into t
22bd0 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61  he pager-cache a
22be0 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65 20 50  nd setting the P
22bf0 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  gHdr.needSync fl
22c00 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ag..    **.    *
22c10 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50 61 67  * The sqlite3Pag
22c20 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d 61 79  erGet() call may
22c30 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e   cause the journ
22c40 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d  al to sync. So m
22c50 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20  ake.    ** sure 
22c60 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79  the Pager.needSy
22c70 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  nc flag is set t
22c80 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  oo..    */.    i
22c90 6e 74 20 72 63 3b 0a 20 20 20 20 50 67 48 64 72  nt rc;.    PgHdr
22ca0 20 2a 70 50 67 48 64 72 3b 0a 20 20 20 20 61 73   *pPgHdr;.    as
22cb0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
22cc0 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63  edSync );.    rc
22cd0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
22ce0 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53  et(pPager, needS
22cf0 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48 64 72  yncPgno, &pPgHdr
22d00 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
22d10 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
22d20 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72  n rc;.    pPager
22d30 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
22d40 20 20 20 20 70 50 67 48 64 72 2d 3e 6e 65 65 64      pPgHdr->need
22d50 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50  Sync = 1;.    pP
22d60 67 48 64 72 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  gHdr->inJournal 
22d70 3d 20 31 3b 0a 20 20 20 20 6d 61 6b 65 44 69 72  = 1;.    makeDir
22d80 74 79 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  ty(pPgHdr);.    
22d90 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
22da0 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 0a  f(pPgHdr);.  }..
22db0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22dc0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
22dd0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
22de0 6e 74 65 72 20 74 6f 20 74 68 65 20 64 61 74 61  nter to the data
22df0 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69   for the specifi
22e00 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64  ed page..*/.void
22e10 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65   *sqlite3PagerGe
22e20 74 44 61 74 61 28 44 62 50 61 67 65 20 2a 70 50  tData(DbPage *pP
22e30 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 50 47 48  g){.  return PGH
22e40 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b  DR_TO_DATA(pPg);
22e50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
22e60 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
22e70 65 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62  e Pager.nExtra b
22e80 79 74 65 73 20 6f 66 20 22 65 78 74 72 61 22 20  ytes of "extra" 
22e90 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61  space .** alloca
22ea0 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  ted along with t
22eb0 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
22ec0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  e..*/.void *sqli
22ed0 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
22ee0 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
22ef0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
22f00 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
22f10 72 65 74 75 72 6e 20 28 70 50 61 67 65 72 3f 50  return (pPager?P
22f20 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50  GHDR_TO_EXTRA(pP
22f30 67 2c 20 70 50 61 67 65 72 29 3a 30 29 3b 0a 7d  g, pPager):0);.}
22f40 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20  ../*.** Get/set 
22f50 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65  the locking-mode
22f60 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
22f70 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65   Parameter eMode
22f80 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20   must be one.** 
22f90 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  of PAGER_LOCKING
22fa0 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41 47 45  MODE_QUERY, PAGE
22fb0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
22fc0 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41 47 45  RMAL or .** PAGE
22fd0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
22fe0 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68 65 20  CLUSIVE. If the 
22ff0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
23000 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a   _QUERY, then.**
23010 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64   the locking-mod
23020 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
23030 76 61 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e  value specified.
23040 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
23050 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65 69 74  ned value is eit
23060 68 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  her PAGER_LOCKIN
23070 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a  GMODE_NORMAL or.
23080 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  ** PAGER_LOCKING
23090 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2c 20  MODE_EXCLUSIVE, 
230a0 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20 63  indicating the c
230b0 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79  urrent (possibly
230c0 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c 6f 63   updated).** loc
230d0 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e  king-mode..*/.in
230e0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  t sqlite3PagerLo
230f0 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65 72 20  ckingMode(Pager 
23100 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f  *pPager, int eMo
23110 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65  de){.  assert( e
23120 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
23130 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20  INGMODE_QUERY.  
23140 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
23150 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  de==PAGER_LOCKIN
23160 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20  GMODE_NORMAL.   
23170 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
23180 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
23190 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29  MODE_EXCLUSIVE )
231a0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
231b0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55  R_LOCKINGMODE_QU
231c0 45 52 59 3c 30 20 29 3b 0a 20 20 61 73 73 65 72  ERY<0 );.  asser
231d0 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  t( PAGER_LOCKING
231e0 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26  MODE_NORMAL>=0 &
231f0 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  & PAGER_LOCKINGM
23200 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3e 3d 30  ODE_EXCLUSIVE>=0
23210 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e   );.  if( eMode>
23220 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  =0 && !pPager->t
23230 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70  empFile ){.    p
23240 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
23250 4d 6f 64 65 20 3d 20 65 4d 6f 64 65 3b 0a 20 20  Mode = eMode;.  
23260 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  }.  return (int)
23270 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
23280 65 4d 6f 64 65 3b 0a 7d 0a 0a 23 69 66 20 64 65  eMode;.}..#if de
23290 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
232a0 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
232b0 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  QLITE_TEST)./*.*
232c0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
232d0 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68  rent state of th
232e0 65 20 66 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20  e file lock for 
232f0 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e  the given pager.
23300 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
23310 61 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e  alue is one of N
23320 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c  O_LOCK, SHARED_L
23330 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  OCK, RESERVED_LO
23340 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c  CK,.** PENDING_L
23350 4f 43 4b 2c 20 6f 72 20 45 58 43 4c 55 53 49 56  OCK, or EXCLUSIV
23360 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  E_LOCK..*/.int s
23370 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 73  qlite3PagerLocks
23380 74 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  tate(Pager *pPag
23390 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  er){.  return sq
233a0 6c 69 74 65 33 4f 73 4c 6f 63 6b 53 74 61 74 65  lite3OsLockState
233b0 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 7d 0a  (pPager->fd);.}.
233c0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
233d0 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
233e0 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e  * Print a listin
233f0 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e  g of all referen
23400 63 65 64 20 70 61 67 65 73 20 61 6e 64 20 74 68  ced pages and th
23410 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a  eir ref count..*
23420 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
23430 67 65 72 52 65 66 64 75 6d 70 28 50 61 67 65 72  gerRefdump(Pager
23440 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
23450 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70  dr *pPg;.  for(p
23460 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
23470 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
23480 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66  NextAll){.    if
23490 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29  ( pPg->nRef<=0 )
234a0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73   continue;.    s
234b0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
234c0 66 28 22 50 41 47 45 20 25 33 64 20 61 64 64 72  f("PAGE %3d addr
234d0 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20  =%p nRef=%d\n", 
234e0 0a 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e  .       pPg->pgn
234f0 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  o, PGHDR_TO_DATA
23500 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66  (pPg), pPg->nRef
23510 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
23520 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
23530 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f  E_OMIT_DISKIO */
23540 0a                                               .