/ Hex Artifact Content
Login

Artifact 642f804b20a71933fb83b13a1ce93cb4dd1390f7:


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 32  : pager.c,v 1.32
0350: 33 20 32 30 30 37 2f 30 34 2f 30 35 20 31 37 3a  3 2007/04/05 17:
0360: 31 35 3a 35 33 20 64 61 6e 69 65 6c 6b 31 39 37  15:53 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 50 67 48 64 72 20 2a 70 4e 65   */.  PgHdr *pNe
1b40: 78 74 53 74 6d 74 2c 20 2a 70 50 72 65 76 53 74  xtStmt, *pPrevSt
1b50: 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  mt;  /* List of 
1b60: 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74 61  pages in the sta
1b70: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a  tement journal *
1b80: 2f 0a 20 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c  /.  u8 inJournal
1b90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ba0: 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 68 61     /* TRUE if ha
1bb0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
1bc0: 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  o journal */.  u
1bd0: 38 20 69 6e 53 74 6d 74 3b 20 20 20 20 20 20 20  8 inStmt;       
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bf0: 20 54 52 55 45 20 69 66 20 69 6e 20 74 68 65 20   TRUE if in the 
1c00: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
1c10: 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72  rnal */.  u8 dir
1c20: 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ty;             
1c30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45           /* TRUE
1c40: 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 77   if we need to w
1c50: 72 69 74 65 20 62 61 63 6b 20 63 68 61 6e 67 65  rite back change
1c60: 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79  s */.  u8 needSy
1c70: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
1c80: 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f        /* Sync jo
1c90: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 77 72 69  urnal before wri
1ca0: 74 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 2a  ting this page *
1cb0: 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c  /.  u8 alwaysRol
1cc0: 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20  lback;          
1cd0: 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f     /* Disable Do
1ce0: 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72  ntRollback() for
1cf0: 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
1d00: 73 68 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b 20  short int nRef; 
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d20: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65 72  * Number of user
1d30: 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 2a  s of this page *
1d40: 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72 74  /.  PgHdr *pDirt
1d50: 79 2c 20 2a 70 50 72 65 76 44 69 72 74 79 3b 20  y, *pPrevDirty; 
1d60: 20 20 20 2f 2a 20 44 69 72 74 79 20 70 61 67 65     /* Dirty page
1d70: 73 20 2a 2f 0a 20 20 75 33 32 20 6e 6f 74 55 73  s */.  u32 notUs
1d80: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
1d90: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
1da0: 73 70 61 63 65 20 2a 2f 0a 23 69 66 64 65 66 20  space */.#ifdef 
1db0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
1dc0: 45 53 0a 20 20 75 33 32 20 70 61 67 65 48 61 73  ES.  u32 pageHas
1dd0: 68 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 70  h;.#endif.  /* p
1de0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1df0: 62 79 74 65 73 20 6f 66 20 70 61 67 65 20 64 61  bytes of page da
1e00: 74 61 20 66 6f 6c 6c 6f 77 20 74 68 69 73 20 68  ta follow this h
1e10: 65 61 64 65 72 20 2a 2f 0a 20 20 2f 2a 20 50 61  eader */.  /* Pa
1e20: 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73  ger.nExtra bytes
1e30: 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 20 66   of local data f
1e40: 6f 6c 6c 6f 77 20 74 68 65 20 70 61 67 65 20 64  ollow the page d
1e50: 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ata */.};../*.**
1e60: 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   For an in-memor
1e70: 79 20 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 2c  y only database,
1e80: 20 73 6f 6d 65 20 65 78 74 72 61 20 69 6e 66 6f   some extra info
1e90: 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72  rmation is recor
1ea0: 64 65 64 20 61 62 6f 75 74 0a 2a 2a 20 65 61 63  ded about.** eac
1eb0: 68 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 63  h page so that c
1ec0: 68 61 6e 67 65 73 20 63 61 6e 20 62 65 20 72 6f  hanges can be ro
1ed0: 6c 6c 65 64 20 62 61 63 6b 2e 20 20 28 4a 6f 75  lled back.  (Jou
1ee0: 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20 6e  rnal files are n
1ef0: 6f 74 0a 2a 2a 20 75 73 65 64 20 66 6f 72 20 69  ot.** used for i
1f00: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1f10: 65 73 2e 29 20 20 54 68 65 20 66 6f 6c 6c 6f 77  es.)  The follow
1f20: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
1f30: 69 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74  is added to.** t
1f40: 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20  he end of every 
1f50: 45 58 54 52 41 20 62 6c 6f 63 6b 20 66 6f 72 20  EXTRA block for 
1f60: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
1f70: 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ses..**.** This 
1f80: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 6f 75 6c  information coul
1f90: 64 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65  d have been adde
1fa0: 64 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  d directly to th
1fb0: 65 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72  e PgHdr structur
1fc0: 65 2e 0a 2a 2a 20 42 75 74 20 74 68 65 6e 20 69  e..** But then i
1fd0: 74 20 77 6f 75 6c 64 20 74 61 6b 65 20 75 70 20  t would take up 
1fe0: 61 6e 20 65 78 74 72 61 20 38 20 62 79 74 65 73  an extra 8 bytes
1ff0: 20 6f 66 20 73 74 6f 72 61 67 65 20 6f 6e 20 65   of storage on e
2000: 76 65 72 79 20 50 67 48 64 72 0a 2a 2a 20 65 76  very PgHdr.** ev
2010: 65 6e 20 66 6f 72 20 64 69 73 6b 2d 62 61 73 65  en for disk-base
2020: 64 20 64 61 74 61 62 61 73 65 73 2e 20 20 53 70  d databases.  Sp
2030: 6c 69 74 74 69 6e 67 20 69 74 20 6f 75 74 20 73  litting it out s
2040: 61 76 65 73 20 38 20 62 79 74 65 73 2e 20 20 54  aves 8 bytes.  T
2050: 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61  his.** is only a
2060: 20 73 61 76 69 6e 67 73 20 6f 66 20 30 2e 38 25   savings of 0.8%
2070: 20 62 75 74 20 74 68 6f 73 65 20 70 65 72 63 65   but those perce
2080: 6e 74 61 67 65 73 20 61 64 64 20 75 70 2e 0a 2a  ntages add up..*
2090: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
20a0: 20 50 67 48 69 73 74 6f 72 79 20 50 67 48 69 73   PgHistory PgHis
20b0: 74 6f 72 79 3b 0a 73 74 72 75 63 74 20 50 67 48  tory;.struct PgH
20c0: 69 73 74 6f 72 79 20 7b 0a 20 20 75 38 20 2a 70  istory {.  u8 *p
20d0: 4f 72 69 67 3b 20 20 20 20 20 2f 2a 20 4f 72 69  Orig;     /* Ori
20e0: 67 69 6e 61 6c 20 70 61 67 65 20 74 65 78 74 2e  ginal page text.
20f0: 20 20 52 65 73 74 6f 72 65 20 74 6f 20 74 68 69    Restore to thi
2100: 73 20 6f 6e 20 61 20 66 75 6c 6c 20 72 6f 6c 6c  s on a full roll
2110: 62 61 63 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 53  back */.  u8 *pS
2120: 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54 65 78 74  tmt;     /* Text
2130: 20 61 73 20 69 74 20 77 61 73 20 61 74 20 74 68   as it was at th
2140: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
2150: 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
2160: 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ment */.};../*.*
2170: 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20 66  * A macro used f
2180: 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  or invoking the 
2190: 63 6f 64 65 63 20 69 66 20 74 68 65 72 65 20 69  codec if there i
21a0: 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20  s one.*/.#ifdef 
21b0: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
21c0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31  .# define CODEC1
21d0: 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28 20 50 2d  (P,D,N,X) if( P-
21e0: 3e 78 43 6f 64 65 63 21 3d 30 20 29 7b 20 50 2d  >xCodec!=0 ){ P-
21f0: 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65  >xCodec(P->pCode
2200: 63 41 72 67 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23  cArg,D,N,X); }.#
2210: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50   define CODEC2(P
2220: 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a 29  ,D,N,X) ((char*)
2230: 28 50 2d 3e 78 43 6f 64 65 63 21 3d 30 3f 50 2d  (P->xCodec!=0?P-
2240: 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65  >xCodec(P->pCode
2250: 63 41 72 67 2c 44 2c 4e 2c 58 29 3a 44 29 29 0a  cArg,D,N,X):D)).
2260: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43  #else.# define C
2270: 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20 2f  ODEC1(P,D,N,X) /
2280: 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66  * NO-OP */.# def
2290: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
22a0: 2c 58 29 20 28 28 63 68 61 72 2a 29 44 29 0a 23  ,X) ((char*)D).#
22b0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  endif../*.** Con
22c0: 76 65 72 74 20 61 20 70 6f 69 6e 74 65 72 20 74  vert a pointer t
22d0: 6f 20 61 20 50 67 48 64 72 20 69 6e 74 6f 20 61  o a PgHdr into a
22e0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 73 20   pointer to its 
22f0: 64 61 74 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b  data.** and back
2300: 20 61 67 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69   again..*/.#defi
2310: 6e 65 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  ne PGHDR_TO_DATA
2320: 28 50 29 20 20 28 28 76 6f 69 64 2a 29 28 26 28  (P)  ((void*)(&(
2330: 50 29 5b 31 5d 29 29 0a 23 64 65 66 69 6e 65 20  P)[1])).#define 
2340: 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 44 29  DATA_TO_PGHDR(D)
2350: 20 20 28 26 28 28 50 67 48 64 72 2a 29 28 44 29    (&((PgHdr*)(D)
2360: 29 5b 2d 31 5d 29 0a 23 64 65 66 69 6e 65 20 50  )[-1]).#define P
2370: 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 47 2c  GHDR_TO_EXTRA(G,
2380: 50 29 20 28 28 76 6f 69 64 2a 29 26 28 28 63 68  P) ((void*)&((ch
2390: 61 72 2a 29 28 26 28 47 29 5b 31 5d 29 29 5b 28  ar*)(&(G)[1]))[(
23a0: 50 29 2d 3e 70 61 67 65 53 69 7a 65 5d 29 0a 23  P)->pageSize]).#
23b0: 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f  define PGHDR_TO_
23c0: 48 49 53 54 28 50 2c 50 47 52 29 20 20 5c 0a 20  HIST(P,PGR)  \. 
23d0: 20 20 20 20 20 20 20 20 20 20 20 28 28 50 67 48             ((PgH
23e0: 69 73 74 6f 72 79 2a 29 26 28 28 63 68 61 72 2a  istory*)&((char*
23f0: 29 28 26 28 50 29 5b 31 5d 29 29 5b 28 50 47 52  )(&(P)[1]))[(PGR
2400: 29 2d 3e 70 61 67 65 53 69 7a 65 2b 28 50 47 52  )->pageSize+(PGR
2410: 29 2d 3e 6e 45 78 74 72 61 5d 29 0a 0a 2f 2a 0a  )->nExtra])../*.
2420: 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63  ** A open page c
2430: 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61  ache is an insta
2440: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
2450: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
2460: 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 72 72 43  **.** Pager.errC
2470: 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74 20 74  ode may be set t
2480: 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  o SQLITE_IOERR, 
2490: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20  SQLITE_CORRUPT, 
24a0: 6f 72 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  or.** or SQLITE_
24b0: 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f  FULL. Once one o
24c0: 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  f the first thre
24d0: 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73 2c  e errors occurs,
24e0: 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a 20   it persists.** 
24f0: 61 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64 20  and is returned 
2500: 61 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  as the result of
2510: 20 65 76 65 72 79 20 6d 61 6a 6f 72 20 70 61 67   every major pag
2520: 65 72 20 41 50 49 20 63 61 6c 6c 2e 20 20 54 68  er API call.  Th
2530: 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c  e.** SQLITE_FULL
2540: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20   return code is 
2550: 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72 65  slightly differe
2560: 6e 74 2e 20 49 74 20 70 65 72 73 69 73 74 73 20  nt. It persists 
2570: 6f 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a  only until the.*
2580: 2a 20 6e 65 78 74 20 73 75 63 63 65 73 73 66 75  * next successfu
2590: 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70 65  l rollback is pe
25a0: 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 70  rformed on the p
25b0: 61 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73 6f  ager cache. Also
25c0: 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c  ,.** SQLITE_FULL
25d0: 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63 74   does not affect
25e0: 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
25f0: 72 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74  rGet() and sqlit
2600: 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 0a  e3PagerLookup().
2610: 2a 2a 20 41 50 49 73 2c 20 74 68 65 79 20 6d 61  ** APIs, they ma
2620: 79 20 73 74 69 6c 6c 20 62 65 20 75 73 65 64 20  y still be used 
2630: 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a 2a 2f  successfully..*/
2640: 0a 73 74 72 75 63 74 20 50 61 67 65 72 20 7b 0a  .struct Pager {.
2650: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e    u8 journalOpen
2660: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2670: 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c   True if journal
2680: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2690: 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20  s is valid */.  
26a0: 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  u8 journalStarte
26b0: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  d;          /* T
26c0: 72 75 65 20 69 66 20 68 65 61 64 65 72 20 6f 66  rue if header of
26d0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
26e0: 65 64 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f  ed */.  u8 useJo
26f0: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
2700: 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c      /* Use a rol
2710: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e  lback journal on
2720: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
2730: 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20 20  u8 noReadlock;  
2740: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2750: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f 20  o not bother to 
2760: 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b 73  obtain readlocks
2770: 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70 65   */.  u8 stmtOpe
2780: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
2790: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
27a0: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
27b0: 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a 2f  urnal is open */
27c0: 0a 20 20 75 38 20 73 74 6d 74 49 6e 55 73 65 3b  .  u8 stmtInUse;
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27e0: 2a 20 54 72 75 65 20 77 65 20 61 72 65 20 69 6e  * True we are in
27f0: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
2800: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
2810: 20 75 38 20 73 74 6d 74 41 75 74 6f 6f 70 65 6e   u8 stmtAutoopen
2820: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2830: 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e 61  Open stmt journa
2840: 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75 72  l when main jour
2850: 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f 0a  nal is opened*/.
2860: 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20    u8 noSync;    
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2880: 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65   Do not sync the
2890: 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65   journal if true
28a0: 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e   */.  u8 fullSyn
28b0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
28c0: 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79    /* Do extra sy
28d0: 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ncs of the journ
28e0: 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73  al for robustnes
28f0: 73 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 5f 66  s */.  u8 full_f
2900: 73 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  sync;           
2910: 20 20 20 2f 2a 20 55 73 65 20 46 5f 46 55 4c 4c     /* Use F_FULL
2920: 46 53 59 4e 43 20 77 68 65 6e 20 61 76 61 69 6c  FSYNC when avail
2930: 61 62 6c 65 20 2a 2f 0a 20 20 75 38 20 73 74 61  able */.  u8 sta
2940: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
2950: 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 55        /* PAGER_U
2960: 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20  NLOCK, _SHARED, 
2970: 5f 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e 20  _RESERVED, etc. 
2980: 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c 65  */.  u8 tempFile
2990: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29a0: 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   /* zFilename is
29b0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
29c0: 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e  e */.  u8 readOn
29d0: 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ly;             
29e0: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
29f0: 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
2a00: 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64  ase */.  u8 need
2a10: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
2a20: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2a30: 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e 65  an fsync() is ne
2a40: 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  eded on the jour
2a50: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74  nal */.  u8 dirt
2a60: 79 43 61 63 68 65 3b 20 20 20 20 20 20 20 20 20  yCache;         
2a70: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2a80: 63 61 63 68 65 64 20 70 61 67 65 73 20 68 61 76  cached pages hav
2a90: 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75  e changed */.  u
2aa0: 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  8 alwaysRollback
2ab0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69  ;          /* Di
2ac0: 73 61 62 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62 61  sable DontRollba
2ad0: 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70 61 67  ck() for all pag
2ae0: 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62  es */.  u8 memDb
2af0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b00: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69      /* True to i
2b10: 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c 65 20  nhibit all file 
2b20: 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 73 65 74 4d  I/O */.  u8 setM
2b30: 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  aster;          
2b40: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2b50: 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20 62  a m-j name has b
2b60: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a  een written to j
2b70: 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f  rnl */.  u8 doNo
2b80: 74 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  tSync;          
2b90: 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e       /* Boolean.
2ba0: 20 57 68 69 6c 65 20 74 72 75 65 2c 20 64 6f 20   While true, do 
2bb0: 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63 61  not spill the ca
2bc0: 63 68 65 20 2a 2f 0a 20 20 75 38 20 65 78 63 6c  che */.  u8 excl
2bd0: 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20 20  usiveMode;      
2be0: 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e       /* Boolean.
2bf0: 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e 67   True if locking
2c00: 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56 45  _mode==EXCLUSIVE
2c10: 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43   */.  u8 changeC
2c20: 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20  ountDone;       
2c30: 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69    /* Set after i
2c40: 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ncrementing the 
2c50: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a  change-counter *
2c60: 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b  /.  int errCode;
2c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c80: 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61  /* One of severa
2c90: 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72  l kinds of error
2ca0: 73 20 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a  s */.  int dbSiz
2cb0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2cc0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2cd0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c  pages in the fil
2ce0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44  e */.  int origD
2cf0: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
2d00: 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66     /* dbSize bef
2d10: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
2d20: 63 68 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20  change */.  int 
2d30: 73 74 6d 74 53 69 7a 65 3b 20 20 20 20 20 20 20  stmtSize;       
2d40: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
2d50: 6f 66 20 64 61 74 61 62 61 73 65 20 28 69 6e 20  of database (in 
2d60: 70 61 67 65 73 29 20 61 74 20 73 74 6d 74 5f 62  pages) at stmt_b
2d70: 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  egin() */.  int 
2d80: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
2d90: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2da0: 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74  r of pages writt
2db0: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
2dc0: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
2dd0: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
2de0: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
2df0: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
2e00: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
2e10: 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 4e 52   */.  int stmtNR
2e20: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
2e30: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
2e40: 65 63 6f 72 64 73 20 69 6e 20 73 74 6d 74 20 73  ecords in stmt s
2e50: 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  ubjournal */.  i
2e60: 6e 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20  nt nExtra;      
2e70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
2e80: 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
2e90: 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  s to each in-mem
2ea0: 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
2eb0: 74 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20  t pageSize;     
2ec0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2ed0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
2ee0: 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  a page */.  int 
2ef0: 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
2f00: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
2f10: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
2f20: 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f 0a 20 20  mory pages */.  
2f30: 69 6e 74 20 6e 4d 61 78 50 61 67 65 3b 20 20 20  int nMaxPage;   
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
2f50: 69 67 68 20 77 61 74 65 72 20 6d 61 72 6b 20 6f  igh water mark o
2f60: 66 20 6e 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74  f nPage */.  int
2f70: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
2f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2f90: 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
2fa0: 70 61 67 65 73 20 77 69 74 68 20 50 67 48 64 72  pages with PgHdr
2fb0: 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74  .nRef>0 */.  int
2fc0: 20 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20 20   mxPage;        
2fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
2fe0: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  mum number of pa
2ff0: 67 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63  ges to hold in c
3000: 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49  ache */.  u8 *aI
3010: 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  nJournal;       
3020: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74        /* One bit
3030: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
3040: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
3050: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e  ile */.  u8 *aIn
3060: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
3070: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
3080: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
3090: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
30a0: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
30b0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
30c0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
30d0: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
30e0: 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b   char *zJournal;
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3100: 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  Name of the jour
3110: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  nal file */.  ch
3120: 61 72 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b 20  ar *zDirectory; 
3130: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72            /* Dir
3140: 65 63 74 6f 72 79 20 68 6f 6c 64 20 64 61 74 61  ectory hold data
3150: 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c  base and journal
3160: 20 66 69 6c 65 73 20 2a 2f 0a 20 20 4f 73 46 69   files */.  OsFi
3170: 6c 65 20 2a 66 64 2c 20 2a 6a 66 64 3b 20 20 20  le *fd, *jfd;   
3180: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
3190: 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20  descriptors for 
31a0: 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75  database and jou
31b0: 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73 46 69 6c 65  rnal */.  OsFile
31c0: 20 2a 73 74 66 64 3b 20 20 20 20 20 20 20 20 20   *stfd;         
31d0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
31e0: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65  scriptor for the
31f0: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
3200: 75 72 6e 61 6c 2a 2f 0a 20 20 42 75 73 79 48 61  urnal*/.  BusyHa
3210: 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64  ndler *pBusyHand
3220: 6c 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72  ler;  /* Pointer
3230: 20 74 6f 20 73 71 6c 69 74 65 2e 62 75 73 79 48   to sqlite.busyH
3240: 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 67 48 64  andler */.  PgHd
3250: 72 20 2a 70 46 69 72 73 74 2c 20 2a 70 4c 61 73  r *pFirst, *pLas
3260: 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  t;      /* List 
3270: 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f  of free pages */
3280: 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74  .  PgHdr *pFirst
3290: 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 2f  Synced;        /
32a0: 2a 20 46 69 72 73 74 20 66 72 65 65 20 70 61 67  * First free pag
32b0: 65 20 77 69 74 68 20 50 67 48 64 72 2e 6e 65 65  e with PgHdr.nee
32c0: 64 53 79 6e 63 3d 3d 30 20 2a 2f 0a 20 20 50 67  dSync==0 */.  Pg
32d0: 48 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20  Hdr *pAll;      
32e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
32f0: 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a  t of all pages *
3300: 2f 0a 20 20 50 67 48 64 72 20 2a 70 53 74 6d 74  /.  PgHdr *pStmt
3310: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3320: 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73  /* List of pages
3330: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
3340: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  t subjournal */.
3350: 20 20 50 67 48 64 72 20 2a 70 44 69 72 74 79 3b    PgHdr *pDirty;
3360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3370: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 64 69 72   List of all dir
3380: 74 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 36  ty pages */.  i6
3390: 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20  4 journalOff;   
33a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
33b0: 72 65 6e 74 20 62 79 74 65 20 6f 66 66 73 65 74  rent byte offset
33c0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
33d0: 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  file */.  i64 jo
33e0: 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20  urnalHdr;       
33f0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
3400: 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73  fset to previous
3410: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
3420: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 48 64 72  */.  i64 stmtHdr
3430: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
3440: 20 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e 61   /* First journa
3450: 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  l header written
3460: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
3470: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 43 6b 73  */.  i64 stmtCks
3480: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
3490: 20 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77 68   /* cksumInit wh
34a0: 65 6e 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  en statement was
34b0: 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 36   started */.  i6
34c0: 34 20 73 74 6d 74 4a 53 69 7a 65 3b 20 20 20 20  4 stmtJSize;    
34d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
34e0: 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 74 20  e of journal at 
34f0: 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a  stmt_begin() */.
3500: 20 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a 65    int sectorSize
3510: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3520: 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   Assumed sector 
3530: 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  size during roll
3540: 62 61 63 6b 20 2a 2f 0a 23 69 66 64 65 66 20 53  back */.#ifdef S
3550: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
3560: 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20 20   nHit, nMiss;   
3570: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68           /* Cach
3580: 65 20 68 69 74 73 20 61 6e 64 20 6d 69 73 73 69  e hits and missi
3590: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61  ng */.  int nRea
35a0: 64 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20  d, nWrite;      
35b0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
35c0: 70 61 67 65 73 20 72 65 61 64 2f 77 72 69 74 74  pages read/writt
35d0: 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76  en */.#endif.  v
35e0: 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63 74 6f  oid (*xDestructo
35f0: 72 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 3b  r)(DbPage*,int);
3600: 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f   /* Call this ro
3610: 75 74 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69  utine when freei
3620: 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f  ng pages */.  vo
3630: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
3640: 44 62 50 61 67 65 2a 2c 69 6e 74 29 3b 20 20 20  DbPage*,int);   
3650: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
3660: 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64  tine when reload
3670: 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66  ing pages */.#if
3680: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
3690: 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ODEC.  void *(*x
36a0: 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
36b0: 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a  d*,Pgno,int); /*
36c0: 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f   Routine for en/
36d0: 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f  decoding data */
36e0: 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41  .  void *pCodecA
36f0: 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  rg;            /
3700: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
3710: 20 74 6f 20 78 43 6f 64 65 63 28 29 20 2a 2f 0a   to xCodec() */.
3720: 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 6e 48 61  #endif.  int nHa
3730: 73 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sh;             
3740: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
3750: 74 68 65 20 70 61 67 65 72 20 68 61 73 68 20 74  the pager hash t
3760: 61 62 6c 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  able */.  PgHdr 
3770: 2a 2a 61 48 61 73 68 3b 20 20 20 20 20 20 20 20  **aHash;        
3780: 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61        /* Hash ta
3790: 62 6c 65 20 74 6f 20 6d 61 70 20 70 61 67 65 20  ble to map page 
37a0: 6e 75 6d 62 65 72 20 74 6f 20 50 67 48 64 72 20  number to PgHdr 
37b0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
37c0: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
37d0: 41 4e 41 47 45 4d 45 4e 54 0a 20 20 50 61 67 65  ANAGEMENT.  Page
37e0: 72 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  r *pNext;       
37f0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65          /* Linke
3800: 64 20 6c 69 73 74 20 6f 66 20 70 61 67 65 72 73  d list of pagers
3810: 20 69 6e 20 74 68 69 73 20 74 68 72 65 61 64 20   in this thread 
3820: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72  */.#endif.  char
3830: 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20   *pTmpSpace;    
3840: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
3850: 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  .pageSize bytes 
3860: 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70  of space for tmp
3870: 20 75 73 65 20 2a 2f 0a 20 20 75 33 32 20 69 43   use */.  u32 iC
3880: 68 61 6e 67 65 43 6f 75 6e 74 3b 20 20 20 20 20  hangeCount;     
3890: 20 20 20 20 20 20 2f 2a 20 44 62 20 63 68 61 6e        /* Db chan
38a0: 67 65 2d 63 6f 75 6e 74 65 72 20 66 6f 72 20 77  ge-counter for w
38b0: 68 69 63 68 20 63 61 63 68 65 20 69 73 20 76 61  hich cache is va
38c0: 6c 69 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  lid */.};../*.**
38d0: 20 49 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20   If SQLITE_TEST 
38e0: 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20  is defined then 
38f0: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  increment the va
3900: 72 69 61 62 6c 65 20 67 69 76 65 6e 20 69 6e 0a  riable given in.
3910: 2a 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74 0a  ** the argument.
3920: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
3930: 5f 54 45 53 54 0a 23 20 64 65 66 69 6e 65 20 54  _TEST.# define T
3940: 45 53 54 5f 49 4e 43 52 28 78 29 20 20 78 2b 2b  EST_INCR(x)  x++
3950: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
3960: 54 45 53 54 5f 49 4e 43 52 28 78 29 0a 23 65 6e  TEST_INCR(x).#en
3970: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e  dif../*.** Journ
3980: 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77  al files begin w
3990: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
39a0: 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20  g magic string. 
39b0: 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73   The data.** was
39c0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f   obtained from /
39d0: 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20  dev/random.  It 
39e0: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20  is used only as 
39f0: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a  a sanity check..
3a00: 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73  **.** Since vers
3a10: 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a  ion 2.8.0, the j
3a20: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
3a30: 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61  ntains additiona
3a40: 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63  l sanity.** chec
3a50: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
3a60: 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20  .  If the power 
3a70: 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20  fails while the 
3a80: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 67 69 6e  journal is begin
3a90: 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d  .** written, sem
3aa0: 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65  i-random garbage
3ab0: 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65   data might appe
3ac0: 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ar in the journa
3ad0: 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20  l.** file after 
3ae0: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
3af0: 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70  d.  If an attemp
3b00: 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a  t is then made.*
3b10: 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f  * to roll the jo
3b20: 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20  urnal back, the 
3b30: 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62  database could b
3b40: 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68  e corrupted.  Th
3b50: 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20  e additional.** 
3b60: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
3b70: 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d  data is an attem
3b80: 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  pt to discover t
3b90: 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68  he garbage in th
3ba0: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  e.** journal and
3bb0: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a   ignore it..**.*
3bc0: 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65  * The sanity che
3bd0: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
3be0: 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f  n for the new jo
3bf0: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
3c00: 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32  sists.** of a 32
3c10: 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e  -bit checksum on
3c20: 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61   each page of da
3c30: 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75  ta.  The checksu
3c40: 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a  m covers both.**
3c50: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
3c60: 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d   and the pPager-
3c70: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
3c80: 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  of data for the 
3c90: 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b  page..** This ck
3ca0: 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  sum is initializ
3cb0: 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72  ed to a 32-bit r
3cc0: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74  andom value that
3cd0: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a   appears in the.
3ce0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
3cf0: 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20  right after the 
3d00: 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e  header.  The ran
3d10: 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  dom initializer 
3d20: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a  is important,.**
3d30: 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65   because garbage
3d40: 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61   data that appea
3d50: 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  rs at the end of
3d60: 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69   a journal is li
3d70: 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61  kely.** data tha
3d80: 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74  t was once in ot
3d90: 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68  her files that h
3da0: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c  ave now been del
3db0: 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a  eted.  If the.**
3dc0: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61   garbage data ca
3dd0: 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c  me from an obsol
3de0: 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
3df0: 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  , the checksums 
3e00: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72  might.** be corr
3e10: 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69  ect.  But by ini
3e20: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68  tializing the ch
3e30: 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d  ecksum to random
3e40: 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20   value which.** 
3e50: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  is different for
3e60: 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20   every journal, 
3e70: 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74  we minimize that
3e80: 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   risk..*/.static
3e90: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
3ea0: 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  char aJournalMag
3eb0: 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c  ic[] = {.  0xd9,
3ec0: 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66   0xd5, 0x05, 0xf
3ed0: 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30  9, 0x20, 0xa1, 0
3ee0: 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f  x63, 0xd7,.};../
3ef0: 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *.** The size of
3f00: 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20   the header and 
3f10: 6f 66 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  of each page in 
3f20: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64  the journal is d
3f30: 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20  etermined.** by 
3f40: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
3f50: 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  cros..*/.#define
3f60: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
3f70: 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72  Pager)  ((pPager
3f80: 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29  ->pageSize) + 8)
3f90: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
3fa0: 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20  nal header size 
3fb0: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
3fc0: 49 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74  In the future, t
3fd0: 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20  his could be.** 
3fe0: 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75  set to some valu
3ff0: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
4000: 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e  disk controller.
4010: 20 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a   The important.*
4020: 2a 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  * characteristic
4030: 20 69 73 20 74 68 61 74 20 69 74 20 69 73 20 74   is that it is t
4040: 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20  he same size as 
4050: 61 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a  a disk sector..*
4060: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
4070: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
4080: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
4090: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
40a0: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
40b0: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
40c0: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
40d0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
40e0: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
40f0: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
4100: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
4110: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
4120: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
4130: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
4140: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
4150: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
4160: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
4170: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
4180: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
4190: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
41a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
41b0: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
41c0: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
41d0: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
41e0: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
41f0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 67  endif../*.** Pag
4200: 65 20 6e 75 6d 62 65 72 20 50 41 47 45 52 5f 4d  e number PAGER_M
4210: 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65 72 20  J_PGNO is never 
4220: 75 73 65 64 20 69 6e 20 61 6e 20 53 51 4c 69 74  used in an SQLit
4230: 65 20 64 61 74 61 62 61 73 65 20 28 69 74 20 69  e database (it i
4240: 73 0a 2a 2a 20 72 65 73 65 72 76 65 64 20 66 6f  s.** reserved fo
4250: 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64  r working around
4260: 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78   a windows/posix
4270: 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74 79   incompatibility
4280: 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73 65 64  ). It is.** used
4290: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
42a0: 74 6f 20 73 69 67 6e 69 66 79 20 74 68 61 74 20  to signify that 
42b0: 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  the remainder of
42c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
42d0: 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65 64  e .** is devoted
42e0: 20 74 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d 61   to storing a ma
42f0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
4300: 65 20 2d 20 74 68 65 72 65 20 61 72 65 20 6e 6f  e - there are no
4310: 20 6d 6f 72 65 20 70 61 67 65 73 20 74 6f 0a 2a   more pages to.*
4320: 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65  * roll back. See
4330: 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75   comments for fu
4340: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d 61 73 74  nction writeMast
4350: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20  erJournal() for 
4360: 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23  details..*/./* #
4370: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f  define PAGER_MJ_
4380: 50 47 4e 4f 28 78 29 20 28 50 45 4e 44 49 4e 47  PGNO(x) (PENDING
4390: 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65  _BYTE/((x)->page
43a0: 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e  Size)) */.#defin
43b0: 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  e PAGER_MJ_PGNO(
43c0: 78 29 20 28 28 50 45 4e 44 49 4e 47 5f 42 59 54  x) ((PENDING_BYT
43d0: 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65  E/((x)->pageSize
43e0: 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ))+1)../*.** The
43f0: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
4400: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
4410: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
4420: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
4430: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
4440: 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 72 65 66  /*.** Enable ref
4450: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 74 72 61  erence count tra
4460: 63 6b 69 6e 67 20 28 66 6f 72 20 64 65 62 75 67  cking (for debug
4470: 67 69 6e 67 29 20 68 65 72 65 3a 0a 2a 2f 0a 23  ging) here:.*/.#
4480: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
4490: 55 47 0a 20 20 69 6e 74 20 70 61 67 65 72 33 5f  UG.  int pager3_
44a0: 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d  refinfo_enable =
44b0: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 76 6f 69   0;.  static voi
44c0: 64 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28  d pager_refinfo(
44d0: 50 67 48 64 72 20 2a 70 29 7b 0a 20 20 20 20 73  PgHdr *p){.    s
44e0: 74 61 74 69 63 20 69 6e 74 20 63 6e 74 20 3d 20  tatic int cnt = 
44f0: 30 3b 0a 20 20 20 20 69 66 28 20 21 70 61 67 65  0;.    if( !page
4500: 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c  r3_refinfo_enabl
4510: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  e ) return;.    
4520: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4530: 74 66 28 0a 20 20 20 20 20 20 20 22 52 45 46 43  tf(.       "REFC
4540: 4e 54 3a 20 25 34 64 20 61 64 64 72 3d 25 70 20  NT: %4d addr=%p 
4550: 6e 52 65 66 3d 25 2d 33 64 20 74 6f 74 61 6c 3d  nRef=%-3d total=
4560: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d  %d\n",.       p-
4570: 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f  >pgno, PGHDR_TO_
4580: 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52 65 66  DATA(p), p->nRef
4590: 2c 20 70 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65  , p->pPager->nRe
45a0: 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6e 74  f.    );.    cnt
45b0: 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68 69  ++;   /* Somethi
45c0: 6e 67 20 74 6f 20 73 65 74 20 61 20 62 72 65 61  ng to set a brea
45d0: 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d  kpoint on */.  }
45e0: 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46  .# define REFINF
45f0: 4f 28 58 29 20 20 70 61 67 65 72 5f 72 65 66 69  O(X)  pager_refi
4600: 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20 64  nfo(X).#else.# d
4610: 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29  efine REFINFO(X)
4620: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
4630: 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a 65 20  Change the size 
4640: 6f 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  of the pager has
4650: 68 20 74 61 62 6c 65 20 74 6f 20 4e 2e 20 20 4e  h table to N.  N
4660: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   must be a power
4670: 0a 2a 2a 20 6f 66 20 74 77 6f 2e 0a 2a 2f 0a 73  .** of two..*/.s
4680: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
4690: 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f 74 61 62  _resize_hash_tab
46a0: 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  le(Pager *pPager
46b0: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 50 67 48 64  , int N){.  PgHd
46c0: 72 20 2a 2a 61 48 61 73 68 2c 20 2a 70 50 67 3b  r **aHash, *pPg;
46d0: 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 30 20 26  .  assert( N>0 &
46e0: 26 20 28 4e 26 28 4e 2d 31 29 29 3d 3d 30 20 29  & (N&(N-1))==0 )
46f0: 3b 0a 20 20 61 48 61 73 68 20 3d 20 73 71 6c 69  ;.  aHash = sqli
4700: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
4710: 28 61 48 61 73 68 5b 30 5d 29 2a 4e 20 29 3b 0a  (aHash[0])*N );.
4720: 20 20 69 66 28 20 61 48 61 73 68 3d 3d 30 20 29    if( aHash==0 )
4730: 7b 0a 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65  {.    /* Failure
4740: 20 74 6f 20 72 65 68 61 73 68 20 69 73 20 6e 6f   to rehash is no
4750: 74 20 61 6e 20 65 72 72 6f 72 2e 20 20 49 74 20  t an error.  It 
4760: 69 73 20 6f 6e 6c 79 20 61 20 70 65 72 66 6f 72  is only a perfor
4770: 6d 61 6e 63 65 20 68 69 74 2e 20 2a 2f 0a 20 20  mance hit. */.  
4780: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
4790: 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
47a0: 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70 50 61  r->aHash);.  pPa
47b0: 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20 4e 3b 0a  ger->nHash = N;.
47c0: 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 20    pPager->aHash 
47d0: 3d 20 61 48 61 73 68 3b 0a 20 20 66 6f 72 28 70  = aHash;.  for(p
47e0: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
47f0: 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
4800: 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 6e  NextAll){.    in
4810: 74 20 68 3b 0a 20 20 20 20 69 66 28 20 70 50 67  t h;.    if( pPg
4820: 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  ->pgno==0 ){.   
4830: 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
4840: 70 4e 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20  pNextHash==0 && 
4850: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d  pPg->pPrevHash==
4860: 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  0 );.      conti
4870: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68  nue;.    }.    h
4880: 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28   = pPg->pgno & (
4890: 4e 2d 31 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  N-1);.    pPg->p
48a0: 4e 65 78 74 48 61 73 68 20 3d 20 61 48 61 73 68  NextHash = aHash
48b0: 5b 68 5d 3b 0a 20 20 20 20 69 66 28 20 61 48 61  [h];.    if( aHa
48c0: 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 20 20 61  sh[h] ){.      a
48d0: 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61  Hash[h]->pPrevHa
48e0: 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  sh = pPg;.    }.
48f0: 20 20 20 20 61 48 61 73 68 5b 68 5d 20 3d 20 70      aHash[h] = p
4900: 50 67 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72  Pg;.    pPg->pPr
4910: 65 76 48 61 73 68 20 3d 20 30 3b 0a 20 20 7d 0a  evHash = 0;.  }.
4920: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
4930: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66  32-bit integer f
4940: 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69  rom the given fi
4950: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
4960: 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65  Store the intege
4970: 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61  r.** that is rea
4980: 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74  d in *pRes.  Ret
4990: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
49a0: 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
49b0: 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72  ed, or an.** err
49c0: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
49d0: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
49e0: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65  .**.** All value
49f0: 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20  s are stored on 
4a00: 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69  disk as big-endi
4a10: 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
4a20: 74 20 72 65 61 64 33 32 62 69 74 73 28 4f 73 46  t read32bits(OsF
4a30: 69 6c 65 20 2a 66 64 2c 20 75 33 32 20 2a 70 52  ile *fd, u32 *pR
4a40: 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  es){.  unsigned 
4a50: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e  char ac[4];.  in
4a60: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  t rc = sqlite3Os
4a70: 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a  Read(fd, ac, siz
4a80: 65 6f 66 28 61 63 29 29 3b 0a 20 20 69 66 28 20  eof(ac));.  if( 
4a90: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
4aa0: 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 28 61 63  .    *pRes = (ac
4ab0: 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63 5b 31  [0]<<24) | (ac[1
4ac0: 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32 5d 3c  ]<<16) | (ac[2]<
4ad0: 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 20 20 7d  <8) | ac[3];.  }
4ae0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4af0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
4b00: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
4b10: 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66  to a string buff
4b20: 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e  er in big-endian
4b30: 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a   byte order..*/.
4b40: 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 74 33  static void put3
4b50: 32 62 69 74 73 28 63 68 61 72 20 2a 61 63 2c 20  2bits(char *ac, 
4b60: 75 33 32 20 76 61 6c 29 7b 0a 20 20 61 63 5b 30  u32 val){.  ac[0
4b70: 5d 20 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26 20  ] = (val>>24) & 
4b80: 30 78 66 66 3b 0a 20 20 61 63 5b 31 5d 20 3d 20  0xff;.  ac[1] = 
4b90: 28 76 61 6c 3e 3e 31 36 29 20 26 20 30 78 66 66  (val>>16) & 0xff
4ba0: 3b 0a 20 20 61 63 5b 32 5d 20 3d 20 28 76 61 6c  ;.  ac[2] = (val
4bb0: 3e 3e 38 29 20 26 20 30 78 66 66 3b 0a 20 20 61  >>8) & 0xff;.  a
4bc0: 63 5b 33 5d 20 3d 20 76 61 6c 20 26 20 30 78 66  c[3] = val & 0xf
4bd0: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  f;.}../*.** Writ
4be0: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
4bf0: 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65  er into the give
4c00: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
4c10: 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
4c20: 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
4c30: 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
4c40: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
4c50: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a   goes wrong..*/.
4c60: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
4c70: 33 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66  32bits(OsFile *f
4c80: 64 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63  d, u32 val){.  c
4c90: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74  har ac[4];.  put
4ca0: 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b  32bits(ac, val);
4cb0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
4cc0: 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c  3OsWrite(fd, ac,
4cd0: 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   4);.}../*.** Re
4ce0: 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  ad a 32-bit inte
4cf0: 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 27 6f  ger at offset 'o
4d00: 66 66 73 65 74 27 20 66 72 6f 6d 20 74 68 65 20  ffset' from the 
4d10: 70 61 67 65 20 69 64 65 6e 74 69 66 69 65 64 20  page identified 
4d20: 62 79 0a 2a 2a 20 70 61 67 65 20 68 65 61 64 65  by.** page heade
4d30: 72 20 27 70 27 2e 0a 2a 2f 0a 73 74 61 74 69 63  r 'p'..*/.static
4d40: 20 75 33 32 20 72 65 74 72 69 65 76 65 33 32 62   u32 retrieve32b
4d50: 69 74 73 28 50 67 48 64 72 20 2a 70 2c 20 69 6e  its(PgHdr *p, in
4d60: 74 20 6f 66 66 73 65 74 29 7b 0a 20 20 75 6e 73  t offset){.  uns
4d70: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 63 3b 0a  igned char *ac;.
4d80: 20 20 61 63 20 3d 20 26 28 28 75 6e 73 69 67 6e    ac = &((unsign
4d90: 65 64 20 63 68 61 72 2a 29 50 47 48 44 52 5f 54  ed char*)PGHDR_T
4da0: 4f 5f 44 41 54 41 28 70 29 29 5b 6f 66 66 73 65  O_DATA(p))[offse
4db0: 74 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28 61 63  t];.  return (ac
4dc0: 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63 5b 31  [0]<<24) | (ac[1
4dd0: 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32 5d 3c  ]<<16) | (ac[2]<
4de0: 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 7d 0a 0a  <8) | ac[3];.}..
4df0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
4e00: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 63  tion should be c
4e10: 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 65 72  alled when an er
4e20: 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69  ror occurs withi
4e30: 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 63  n the pager.** c
4e40: 6f 64 65 2e 20 54 68 65 20 66 69 72 73 74 20 61  ode. The first a
4e50: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
4e60: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
4e70: 72 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65  r structure, the
4e80: 0a 2a 2a 20 73 65 63 6f 6e 64 20 74 68 65 20 65  .** second the e
4e90: 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20  rror-code about 
4ea0: 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
4eb0: 79 20 61 20 70 61 67 65 72 20 41 50 49 20 66 75  y a pager API fu
4ec0: 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20  nction. .** The 
4ed0: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
4ee0: 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
4ef0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
4f00: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
4f10: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
4f20: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
4f30: 69 73 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  is SQLITE_IOERR,
4f40: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c   SQLITE_CORRUPT,
4f50: 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a   or SQLITE_FULL.
4f60: 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62 65 63  ** the error bec
4f70: 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e 74 2e  omes persistent.
4f80: 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   All subsequent 
4f90: 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69  API calls on thi
4fa0: 73 20 50 61 67 65 72 0a 2a 2a 20 77 69 6c 6c 20  s Pager.** will 
4fb0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75  immediately retu
4fc0: 72 6e 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f  rn the same erro
4fd0: 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
4fe0: 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f  c int pager_erro
4ff0: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
5000: 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20   int rc){.  int 
5010: 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b  rc2 = rc & 0xff;
5020: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
5030: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
5040: 54 45 5f 46 55 4c 4c 20 7c 7c 20 70 50 61 67 65  TE_FULL || pPage
5050: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
5060: 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 0a 20  TE_OK );.  if(. 
5070: 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46     rc2==SQLITE_F
5080: 55 4c 4c 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d  ULL ||.    rc2==
5090: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a  SQLITE_IOERR ||.
50a0: 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f      rc2==SQLITE_
50b0: 43 4f 52 52 55 50 54 0a 20 20 29 7b 0a 20 20 20  CORRUPT.  ){.   
50c0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
50d0: 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74   = rc;.  }.  ret
50e0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
50f0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
5100: 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  AGES./*.** Retur
5110: 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68 20  n a 32-bit hash 
5120: 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61  of the page data
5130: 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73   for pPage..*/.s
5140: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
5150: 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a  pagehash(PgHdr *
5160: 70 50 61 67 65 29 7b 0a 20 20 75 33 32 20 68 61  pPage){.  u32 ha
5170: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
5180: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
5190: 20 2a 70 44 61 74 61 20 3d 20 28 75 6e 73 69 67   *pData = (unsig
51a0: 6e 65 64 20 63 68 61 72 20 2a 29 50 47 48 44 52  ned char *)PGHDR
51b0: 5f 54 4f 5f 44 41 54 41 28 70 50 61 67 65 29 3b  _TO_DATA(pPage);
51c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
51d0: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
51e0: 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  eSize; i++){.   
51f0: 20 68 61 73 68 20 3d 20 28 68 61 73 68 2b 69 29   hash = (hash+i)
5200: 5e 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20  ^pData[i];.  }. 
5210: 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a   return hash;.}.
5220: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b  ./*.** The CHECK
5230: 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65  _PAGE macro take
5240: 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e  s a PgHdr* as an
5250: 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51   argument. If SQ
5260: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
5270: 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20  .** is defined, 
5280: 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f  and NDEBUG is no
5290: 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  t defined, an as
52a0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
52b0: 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20   checks.** that 
52c0: 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68  the page is eith
52d0: 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c  er dirty or stil
52e0: 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61  l matches the ca
52f0: 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61  lculated page-ha
5300: 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43  sh..*/.#define C
5310: 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65  HECK_PAGE(x) che
5320: 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63  ckPage(x).static
5330: 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28   void checkPage(
5340: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
5350: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
5360: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73  Pg->pPager;.  as
5370: 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67 65  sert( !pPg->page
5380: 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Hash || pPager->
5390: 65 72 72 43 6f 64 65 20 7c 7c 20 4d 45 4d 44 42  errCode || MEMDB
53a0: 20 7c 7c 20 70 50 67 2d 3e 64 69 72 74 79 20 7c   || pPg->dirty |
53b0: 7c 20 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61  | .      pPg->pa
53c0: 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61  geHash==pager_pa
53d0: 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d  gehash(pPg) );.}
53e0: 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ..#else.#define 
53f0: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65  CHECK_PAGE(x).#e
5400: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  ndif../*.** When
5410: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
5420: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5430: 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
5440: 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a  r must be open..
5450: 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
5460: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
5470: 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  is read from the
5480: 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
5490: 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65 6e   and .** written
54a0: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
54b0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
54c0: 65 4d 61 6c 6c 6f 63 28 29 2e 20 2a 70 7a 4d 61  eMalloc(). *pzMa
54d0: 73 74 65 72 20 69 73 0a 2a 2a 20 73 65 74 20 74  ster is.** set t
54e0: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 6d  o point at the m
54f0: 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45  emory and SQLITE
5500: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68  _OK returned. Th
5510: 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a  e caller must.**
5520: 20 73 71 6c 69 74 65 46 72 65 65 28 29 20 2a 70   sqliteFree() *p
5530: 7a 4d 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  zMaster..**.** I
5540: 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  f no master jour
5550: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
5560: 20 70 72 65 73 65 6e 74 20 2a 70 7a 4d 61 73 74   present *pzMast
5570: 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  er is set to 0 a
5580: 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
5590: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
55a0: 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74  tic int readMast
55b0: 65 72 4a 6f 75 72 6e 61 6c 28 4f 73 46 69 6c 65  erJournal(OsFile
55c0: 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 2a   *pJrnl, char **
55d0: 70 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  pzMaster){.  int
55e0: 20 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a   rc;.  u32 len;.
55f0: 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33 32    i64 szJ;.  u32
5600: 20 63 6b 73 75 6d 3b 0a 20 20 69 6e 74 20 69 3b   cksum;.  int i;
5610: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
5620: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41   aMagic[8]; /* A
5630: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
5640: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
5650: 20 2a 2f 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72   */..  *pzMaster
5660: 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73 71   = 0;..  rc = sq
5670: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
5680: 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20  pJrnl, &szJ);.  
5690: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
56a0: 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29 20 72 65  K || szJ<16 ) re
56b0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
56c0: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
56d0: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 29 3b 0a 20  Jrnl, szJ-16);. 
56e0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
56f0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
5700: 20 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62   .  rc = read32b
5710: 69 74 73 28 70 4a 72 6e 6c 2c 20 26 6c 65 6e 29  its(pJrnl, &len)
5720: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
5730: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
5740: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
5750: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26 63 6b  2bits(pJrnl, &ck
5760: 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  sum);.  if( rc!=
5770: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
5780: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73  rn rc;..  rc = s
5790: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
57a0: 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 29 3b 0a  nl, aMagic, 8);.
57b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
57c0: 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d  _OK || memcmp(aM
57d0: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
57e0: 67 69 63 2c 20 38 29 20 29 20 72 65 74 75 72 6e  gic, 8) ) return
57f0: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
5800: 69 74 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c  ite3OsSeek(pJrnl
5810: 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20  , szJ-16-len);. 
5820: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5830: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
5840: 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 28  .  *pzMaster = (
5850: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c  char *)sqliteMal
5860: 6c 6f 63 28 6c 65 6e 2b 31 29 3b 0a 20 20 69 66  loc(len+1);.  if
5870: 28 20 21 2a 70 7a 4d 61 73 74 65 72 20 29 7b 0a  ( !*pzMaster ){.
5880: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5890: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72  E_NOMEM;.  }.  r
58a0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
58b0: 64 28 70 4a 72 6e 6c 2c 20 2a 70 7a 4d 61 73 74  d(pJrnl, *pzMast
58c0: 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20  er, len);.  if( 
58d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
58e0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
58f0: 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  *pzMaster);.    
5900: 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  *pzMaster = 0;. 
5910: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
5920: 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74  }..  /* See if t
5930: 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63  he checksum matc
5940: 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  hes the master j
5950: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20  ournal name */. 
5960: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b   for(i=0; i<len;
5970: 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d   i++){.    cksum
5980: 20 2d 3d 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b   -= (*pzMaster)[
5990: 69 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b  i];.  }.  if( ck
59a0: 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  sum ){.    /* If
59b0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f   the checksum do
59c0: 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68  esn't add up, th
59d0: 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  en one or more o
59e0: 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f  f the disk secto
59f0: 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69  rs.    ** contai
5a00: 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ning the master 
5a10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
5a20: 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54   is corrupted. T
5a30: 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a  his means.    **
5a40: 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c   definitely roll
5a50: 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72   back, so just r
5a60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
5a70: 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75  and report a (nu
5a80: 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  l).    ** master
5a90: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d  -journal filenam
5aa0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  e..    */.    sq
5ab0: 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74  liteFree(*pzMast
5ac0: 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74  er);.    *pzMast
5ad0: 65 72 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  er = 0;.  }else{
5ae0: 0a 20 20 20 20 28 2a 70 7a 4d 61 73 74 65 72 29  .    (*pzMaster)
5af0: 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  [len] = '\0';.  
5b00: 7d 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53  }.   .  return S
5b10: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
5b20: 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72  ** Seek the jour
5b30: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
5b40: 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  tor to the next 
5b50: 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20  sector boundary 
5b60: 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e  where a.** journ
5b70: 61 6c 20 68 65 61 64 65 72 20 6d 61 79 20 62 65  al header may be
5b80: 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
5b90: 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  . Pager.journalO
5ba0: 66 66 20 69 73 20 75 70 64 61 74 65 64 20 77 69  ff is updated wi
5bb0: 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73 65  th.** the new se
5bc0: 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a  ek offset..**.**
5bd0: 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f   i.e for a secto
5be0: 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a  r size of 512:.*
5bf0: 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73 65  *.** Input Offse
5c00: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  t              O
5c10: 75 74 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a 20  utput Offset.** 
5c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c40: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20  -------.** 0    
5c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c60: 20 20 20 20 20 30 0a 2a 2a 20 35 31 32 20 20 20       0.** 512   
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c80: 20 20 20 20 35 31 32 0a 2a 2a 20 31 30 30 20 20      512.** 100  
5c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ca0: 20 20 20 20 20 35 31 32 0a 2a 2a 20 32 30 30 30       512.** 2000
5cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cc0: 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a        2048.** .*
5cd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
5ce0: 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  kJournalHdr(Page
5cf0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36  r *pPager){.  i6
5d00: 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  4 offset = 0;.  
5d10: 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e  i64 c = pPager->
5d20: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66  journalOff;.  if
5d30: 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65  ( c ){.    offse
5d40: 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e  t = ((c-1)/JOURN
5d50: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
5d60: 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c  ) + 1) * JOURNAL
5d70: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
5d80: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
5d90: 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44  ffset%JOURNAL_HD
5da0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20  R_SZ(pPager)==0 
5db0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  );.  assert( off
5dc0: 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65  set>=c );.  asse
5dd0: 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a  rt( (offset-c)<J
5de0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
5df0: 61 67 65 72 29 20 29 3b 0a 20 20 70 50 61 67 65  ager) );.  pPage
5e00: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
5e10: 6f 66 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e  offset;.  return
5e20: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
5e30: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
5e40: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b  er->journalOff);
5e50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
5e60: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
5e70: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
5e80: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
5e90: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a  led. A journal.*
5ea0: 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41  * header (JOURNA
5eb0: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
5ec0: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
5ed0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5ee0: 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   at the.** curre
5ef0: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  nt location..**.
5f00: 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f  ** The format fo
5f10: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  r the journal he
5f20: 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ader is as follo
5f30: 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73  ws:.** - 8 bytes
5f40: 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79  : Magic identify
5f50: 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ing journal form
5f60: 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  at..** - 4 bytes
5f70: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  : Number of reco
5f80: 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  rds in journal, 
5f90: 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f  or -1 no-sync mo
5fa0: 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34  de is on..** - 4
5fb0: 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e   bytes: Random n
5fc0: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70  umber used for p
5fd0: 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34  age hash..** - 4
5fe0: 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20   bytes: Initial 
5ff0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
6000: 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  unt..** - 4 byte
6010: 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75  s: Sector size u
6020: 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65  sed by the proce
6030: 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
6040: 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 0a  is journal..** .
6050: 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28  ** Followed by (
6060: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d  JOURNAL_HDR_SZ -
6070: 20 32 34 29 20 62 79 74 65 73 20 6f 66 20 75 6e   24) bytes of un
6080: 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  used space..*/.s
6090: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a  tatic int writeJ
60a0: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
60b0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 63 68 61 72  *pPager){.  char
60c0: 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28   zHeader[sizeof(
60d0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
60e0: 36 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  6];.  int rc;.. 
60f0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
6100: 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  tHdrOff==0 ){.  
6110: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64    pPager->stmtHd
6120: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
6130: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 7d 0a 0a  ournalOff;.  }..
6140: 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e    rc = seekJourn
6150: 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
6160: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6170: 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e   rc;..  pPager->
6180: 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
6190: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
61a0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
61b0: 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c  alOff += JOURNAL
61c0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
61d0: 0a 0a 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 0a  ..  /* FIX ME: .
61e0: 20 20 2a 2a 0a 20 20 2a 2a 20 50 6f 73 73 69 62    **.  ** Possib
61f0: 6c 79 20 66 6f 72 20 61 20 70 61 67 65 72 20 6e  ly for a pager n
6200: 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ot in no-sync mo
6210: 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  de, the journal 
6220: 6d 61 67 69 63 20 73 68 6f 75 6c 64 20 6e 6f 74  magic should not
6230: 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e  .  ** be written
6240: 20 75 6e 74 69 6c 20 6e 52 65 63 20 69 73 20 66   until nRec is f
6250: 69 6c 6c 65 64 20 69 6e 20 61 73 20 70 61 72 74  illed in as part
6260: 20 6f 66 20 6e 65 78 74 20 73 79 6e 63 4a 6f 75   of next syncJou
6270: 72 6e 61 6c 28 29 2e 20 0a 20 20 2a 2a 0a 20 20  rnal(). .  **.  
6280: 2a 2a 20 41 63 74 75 61 6c 6c 79 20 6d 61 79 62  ** Actually mayb
6290: 65 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72  e the whole jour
62a0: 6e 61 6c 20 68 65 61 64 65 72 20 73 68 6f 75 6c  nal header shoul
62b0: 64 20 62 65 20 64 65 6c 61 79 65 64 20 75 6e 74  d be delayed unt
62c0: 69 6c 20 74 68 61 74 0a 20 20 2a 2a 20 70 6f 69  il that.  ** poi
62d0: 6e 74 2e 20 54 68 69 6e 6b 20 61 62 6f 75 74 20  nt. Think about 
62e0: 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  this..  */.  mem
62f0: 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
6300: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
6310: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
6320: 29 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6e 52 65  ));.  /* The nRe
6330: 63 20 46 69 65 6c 64 2e 20 30 78 46 46 46 46 46  c Field. 0xFFFFF
6340: 46 46 46 20 66 6f 72 20 6e 6f 2d 73 79 6e 63 20  FFF for no-sync 
6350: 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20 70  journals. */.  p
6360: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
6370: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
6380: 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72  lMagic)], pPager
6390: 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66 66  ->noSync ? 0xfff
63a0: 66 66 66 66 66 20 3a 20 30 29 3b 0a 20 20 2f 2a  fffff : 0);.  /*
63b0: 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63   The random chec
63c0: 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73  k-hash initialis
63d0: 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33  er */ .  sqlite3
63e0: 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  Randomness(sizeo
63f0: 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  f(pPager->cksumI
6400: 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63  nit), &pPager->c
6410: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74  ksumInit);.  put
6420: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
6430: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
6440: 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72  agic)+4], pPager
6450: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
6460: 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64  /* The initial d
6470: 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a  atabase size */.
6480: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
6490: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
64a0: 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70  rnalMagic)+8], p
64b0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
64c0: 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64    /* The assumed
64d0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72   sector size for
64e0: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f   this process */
64f0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
6500: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
6510: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c  urnalMagic)+12],
6520: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
6530: 69 7a 65 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  ize);.  IOTRACE(
6540: 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
6550: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
6560: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
6570: 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72  , sizeof(zHeader
6580: 29 29 29 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ))).  rc = sqlit
6590: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
65a0: 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20  ->jfd, zHeader, 
65b0: 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 29  sizeof(zHeader))
65c0: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72  ;..  /* The jour
65d0: 6e 61 6c 20 68 65 61 64 65 72 20 68 61 73 20 62  nal header has b
65e0: 65 65 6e 20 77 72 69 74 74 65 6e 20 73 75 63 63  een written succ
65f0: 65 73 73 66 75 6c 6c 79 2e 20 53 65 65 6b 20 74  essfully. Seek t
6600: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
6610: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
6620: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
6630: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
6640: 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20   sector..  */.  
6650: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6660: 4b 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  K ){.    IOTRACE
6670: 28 28 22 4a 54 41 49 4c 20 25 70 20 25 6c 6c 64  (("JTAIL %p %lld
6680: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
6690: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d  ger->journalOff-
66a0: 31 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  1)).    rc = sql
66b0: 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
66c0: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
66d0: 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a 20  journalOff-1);. 
66e0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
66f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
6700: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
6710: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22  e(pPager->jfd, "
6720: 5c 30 30 30 22 2c 20 31 29 3b 0a 20 20 20 20 7d  \000", 1);.    }
6730: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6740: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
6750: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
6760: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
6770: 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  is is called. A 
6780: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
6790: 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f  ile.** (JOURNAL_
67a0: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
67b0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63   read from the c
67c0: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
67d0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
67e0: 2a 20 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d  * file. See comm
67f0: 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74  ents above funct
6800: 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  ion writeJournal
6810: 48 64 72 28 29 20 66 6f 72 20 61 20 64 65 73 63  Hdr() for a desc
6820: 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68  ription of.** th
6830: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
6840: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49   format..**.** I
6850: 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20  f the header is 
6860: 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c  read successfull
6870: 79 2c 20 2a 6e 52 65 63 20 69 73 20 73 65 74 20  y, *nRec is set 
6880: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
6890: 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73  .** page records
68a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
68b0: 68 65 61 64 65 72 20 61 6e 64 20 2a 64 62 53 69  header and *dbSi
68c0: 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ze is set to the
68d0: 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
68e0: 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20  database before 
68f0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
6900: 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e  began, in pages.
6910: 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63   Also, pPager->c
6920: 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73  ksumInit.** is s
6930: 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
6940: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
6950: 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51  urnal header. SQ
6960: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
6970: 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ned.** in this c
6980: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
6990: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
69a0: 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f   file appears to
69b0: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53   be corrupted, S
69c0: 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a  QLITE_DONE is.**
69d0: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e   returned and *n
69e0: 52 65 63 20 61 6e 64 20 2a 64 62 53 69 7a 65 20  Rec and *dbSize 
69f0: 61 72 65 20 6e 6f 74 20 73 65 74 2e 20 20 49 66  are not set.  If
6a00: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20   JOURNAL_HDR_SZ 
6a10: 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20  bytes.** cannot 
6a20: 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
6a30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
6a40: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
6a50: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
6a60: 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e  ic int readJourn
6a70: 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a  alHdr(.  Pager *
6a80: 70 50 61 67 65 72 2c 20 0a 20 20 69 36 34 20 6a  pPager, .  i64 j
6a90: 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33  ournalSize,.  u3
6aa0: 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33 32  2 *pNRec, .  u32
6ab0: 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69   *pDbSize.){.  i
6ac0: 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65  nt rc;.  unsigne
6ad0: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
6ae0: 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f  ; /* A buffer to
6af0: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
6b00: 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 72 63 20  header */..  rc 
6b10: 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72  = seekJournalHdr
6b20: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
6b30: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
6b40: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
6b50: 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41  ournalOff+JOURNA
6b60: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
6b70: 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29   > journalSize )
6b80: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
6b90: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20  ITE_DONE;.  }.. 
6ba0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
6bb0: 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
6bc0: 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28   aMagic, sizeof(
6bd0: 61 4d 61 67 69 63 29 29 3b 0a 20 20 69 66 28 20  aMagic));.  if( 
6be0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
6bf0: 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d  .  if( memcmp(aM
6c00: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
6c10: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
6c20: 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  ic))!=0 ){.    r
6c30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
6c40: 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72  E;.  }..  rc = r
6c50: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
6c60: 2d 3e 6a 66 64 2c 20 70 4e 52 65 63 29 3b 0a 20  ->jfd, pNRec);. 
6c70: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6c80: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61   rc;..  rc = rea
6c90: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
6ca0: 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  jfd, &pPager->ck
6cb0: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28 20  sumInit);.  if( 
6cc0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
6cd0: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
6ce0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
6cf0: 70 44 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  pDbSize);.  if( 
6d00: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
6d10: 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
6d20: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d   assumed sector-
6d30: 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68  size to match th
6d40: 65 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20  e value used by 
6d50: 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73  .  ** the proces
6d60: 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74  s that created t
6d70: 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  his journal. If 
6d80: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
6d90: 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79  .  ** created by
6da0: 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72   a process other
6db0: 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20   than this one, 
6dc0: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
6dd0: 65 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20  e.  ** is being 
6de0: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68  called from with
6df0: 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  in pager_playbac
6e00: 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76  k(). The local v
6e10: 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67  alue.  ** of Pag
6e20: 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73  er.sectorSize is
6e30: 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65   restored at the
6e40: 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75   end of that rou
6e50: 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tine..  */.  rc 
6e60: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
6e70: 67 65 72 2d 3e 6a 66 64 2c 20 28 75 33 32 20 2a  ger->jfd, (u32 *
6e80: 29 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  )&pPager->sector
6e90: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Size);.  if( rc 
6ea0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6eb0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
6ec0: 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  ff += JOURNAL_HD
6ed0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
6ee0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
6ef0: 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ek(pPager->jfd, 
6f00: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
6f10: 66 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ff);.  return rc
6f20: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
6f30: 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d  e the supplied m
6f40: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
6f50: 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  me into the jour
6f60: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
6f70: 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20  er.** pPager at 
6f80: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
6f90: 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72  tion. The master
6fa0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
6fb0: 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a  st be the last.*
6fc0: 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20  * thing written 
6fd0: 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  to a journal fil
6fe0: 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  e. If the pager 
6ff0: 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  is in full-sync 
7000: 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75  mode, the.** jou
7010: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
7020: 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64  ptor is advanced
7030: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
7040: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66  tor boundary bef
7050: 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20  ore.** anything 
7060: 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20  is written. The 
7070: 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a  format is:.**.**
7080: 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45   + 4 bytes: PAGE
7090: 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20  R_MJ_PGNO..** + 
70a0: 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74 68 20  N bytes: length 
70b0: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
70c0: 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62  l name..** + 4 b
70d0: 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62  ytes: N.** + 4 b
70e0: 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75  ytes: Master jou
70f0: 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73  rnal name checks
7100: 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73  um..** + 8 bytes
7110: 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  : aJournalMagic[
7120: 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73  ]..**.** The mas
7130: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter journal page
7140: 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65   checksum is the
7150: 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65   sum of the byte
7160: 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a  s in the master.
7170: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  ** journal name.
7180: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65  .**.** If zMaste
7190: 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  r is a NULL poin
71a0: 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20  ter (occurs for 
71b0: 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
71c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20  e transaction), 
71d0: 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73  .** this call is
71e0: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
71f0: 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73  tic int writeMas
7200: 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  terJournal(Pager
7210: 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
7220: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
7230: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
7240: 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20 0a  len; .  int i; .
7250: 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b    u32 cksum = 0;
7260: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69 7a  .  char zBuf[siz
7270: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
7280: 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28 20  c)+2*4];..  if( 
7290: 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67  !zMaster || pPag
72a0: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20 72  er->setMaster) r
72b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
72c0: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
72d0: 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e  ster = 1;..  len
72e0: 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65   = strlen(zMaste
72f0: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
7300: 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <len; i++){.    
7310: 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72  cksum += zMaster
7320: 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  [i];.  }..  /* I
7330: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
7340: 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20  ode, advance to 
7350: 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65  the next disk se
7360: 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74  ctor before writ
7370: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73  ing.  ** the mas
7380: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
7390: 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73  . This is in cas
73a0: 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70  e the previous p
73b0: 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  age written to. 
73c0: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
73d0: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
73e0: 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20   synced..  */.  
73f0: 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
7400: 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  Sync ){.    rc =
7410: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
7420: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
7430: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
7440: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
7450: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
7460: 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29  lOff += (len+20)
7470: 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33  ;..  rc = write3
7480: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
7490: 64 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  d, PAGER_MJ_PGNO
74a0: 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
74b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
74c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
74d0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
74e0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
74f0: 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20  zMaster, len);. 
7500: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
7510: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
7520: 0a 20 20 70 75 74 33 32 62 69 74 73 28 7a 42 75  .  put32bits(zBu
7530: 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74 33 32  f, len);.  put32
7540: 62 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c 20 63  bits(&zBuf[4], c
7550: 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70 79 28  ksum);.  memcpy(
7560: 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e  &zBuf[8], aJourn
7570: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
7580: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
7590: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
75a0: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
75b0: 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69 7a 65  fd, zBuf, 8+size
75c0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
75d0: 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65  ));.  pPager->ne
75e0: 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72  edSync = !pPager
75f0: 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 72 65 74 75  ->noSync;.  retu
7600: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
7610: 41 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20  Add or remove a 
7620: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6c 69  page from the li
7630: 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20  st of all pages 
7640: 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 0a  that are in the.
7650: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  ** statement jou
7660: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rnal..**.** The 
7670: 50 61 67 65 72 20 6b 65 65 70 73 20 61 20 73 65  Pager keeps a se
7680: 70 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20 70  parate list of p
7690: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 63 75  ages that are cu
76a0: 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68  rrently in.** th
76b0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
76c0: 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70 73  nal.  This helps
76d0: 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
76e0: 72 53 74 6d 74 43 6f 6d 6d 69 74 28 29 0a 2a 2a  rStmtCommit().**
76f0: 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55 43   routine run MUC
7700: 48 20 66 61 73 74 65 72 20 66 6f 72 20 74 68 65  H faster for the
7710: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
7720: 72 65 20 74 68 65 72 65 20 61 72 65 20 6d 61 6e  re there are man
7730: 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d 65  y.** pages in me
7740: 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20 61 20  mory but only a 
7750: 66 65 77 20 61 72 65 20 69 6e 20 74 68 65 20 73  few are in the s
7760: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
7770: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7780: 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
7790: 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50  t_list(PgHdr *pP
77a0: 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
77b0: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
77c0: 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e  r;.  if( pPg->in
77d0: 53 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a 20  Stmt ) return;. 
77e0: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
77f0: 72 65 76 53 74 6d 74 3d 3d 30 20 26 26 20 70 50  revStmt==0 && pP
7800: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 30 20  g->pNextStmt==0 
7810: 29 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 53  );.  pPg->pPrevS
7820: 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  tmt = 0;.  if( p
7830: 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 29 7b 0a  Pager->pStmt ){.
7840: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
7850: 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  t->pPrevStmt = p
7860: 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  Pg;.  }.  pPg->p
7870: 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 61 67 65  NextStmt = pPage
7880: 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 70 50 61 67  r->pStmt;.  pPag
7890: 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67 3b  er->pStmt = pPg;
78a0: 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d  .  pPg->inStmt =
78b0: 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69   1;.}.static voi
78c0: 64 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72  d page_remove_fr
78d0: 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48  om_stmt_list(PgH
78e0: 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
78f0: 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72  !pPg->inStmt ) r
7900: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67  eturn;.  if( pPg
7910: 2d 3e 70 50 72 65 76 53 74 6d 74 20 29 7b 0a 20  ->pPrevStmt ){. 
7920: 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
7930: 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74  pPrevStmt->pNext
7940: 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20  Stmt==pPg );.   
7950: 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 2d   pPg->pPrevStmt-
7960: 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 67  >pNextStmt = pPg
7970: 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d  ->pNextStmt;.  }
7980: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
7990: 28 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70  ( pPg->pPager->p
79a0: 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20  Stmt==pPg );.   
79b0: 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 53   pPg->pPager->pS
79c0: 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  tmt = pPg->pNext
79d0: 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Stmt;.  }.  if( 
79e0: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 29  pPg->pNextStmt )
79f0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
7a00: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50  g->pNextStmt->pP
7a10: 72 65 76 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a  revStmt==pPg );.
7a20: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 53 74      pPg->pNextSt
7a30: 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  mt->pPrevStmt = 
7a40: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 3b 0a  pPg->pPrevStmt;.
7a50: 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74    }.  pPg->pNext
7a60: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d  Stmt = 0;.  pPg-
7a70: 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a  >pPrevStmt = 0;.
7a80: 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20    pPg->inStmt = 
7a90: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  0;.}../*.** Find
7aa0: 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 68   a page in the h
7ab0: 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ash table given 
7ac0: 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  its page number.
7ad0: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f    Return.** a po
7ae0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
7af0: 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  e or NULL if not
7b00: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
7b10: 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c  c PgHdr *pager_l
7b20: 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
7b30: 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
7b40: 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 69  .  PgHdr *p;.  i
7b50: 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  f( pPager->aHash
7b60: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
7b70: 20 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 61 48    p = pPager->aH
7b80: 61 73 68 5b 70 67 6e 6f 20 26 20 28 70 50 61 67  ash[pgno & (pPag
7b90: 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 3b 0a 20  er->nHash-1)];. 
7ba0: 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
7bb0: 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20  pgno!=pgno ){.  
7bc0: 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61    p = p->pNextHa
7bd0: 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  sh;.  }.  return
7be0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c   p;.}../*.** Unl
7bf0: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
7c00: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
7c10: 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f   void pager_unlo
7c20: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
7c30: 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ){.  if( !pPager
7c40: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
7c50: 29 7b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  ){.    if( !MEMD
7c60: 42 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  B ){.      sqlit
7c70: 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  e3OsUnlock(pPage
7c80: 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
7c90: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
7ca0: 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20  bSize = -1;.    
7cb0: 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f    IOTRACE(("UNLO
7cc0: 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  CK %p\n", pPager
7cd0: 29 29 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  )).    }.    pPa
7ce0: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
7cf0: 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 70  ER_UNLOCK;.    p
7d00: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
7d10: 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a  ntDone = 0;.  }.
7d20: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65  }../*.** Execute
7d30: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61   a rollback if a
7d40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
7d50: 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63  active and unloc
7d60: 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  k the .** databa
7d70: 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  se file. This is
7d80: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
7d90: 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64  pager has alread
7da0: 79 20 65 6e 74 65 72 65 64 0a 2a 2a 20 74 68 65  y entered.** the
7db0: 20 65 72 72 6f 72 2d 73 74 61 74 65 2e 0a 2a 2f   error-state..*/
7dc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
7dd0: 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
7de0: 61 63 6b 28 50 61 67 65 72 20 2a 70 29 7b 0a 20  ack(Pager *p){. 
7df0: 20 69 66 28 20 70 2d 3e 65 72 72 43 6f 64 65 20   if( p->errCode 
7e00: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
7e10: 72 74 28 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41  rt( p->state>=PA
7e20: 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20  GER_RESERVED || 
7e30: 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  p->journalOpen==
7e40: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 74  0 );.  if( p->st
7e50: 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
7e60: 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  VED ){.    sqlit
7e70: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
7e80: 70 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f  p);.  }.  pager_
7e90: 75 6e 6c 6f 63 6b 28 70 29 3b 0a 20 20 61 73 73  unlock(p);.  ass
7ea0: 65 72 74 28 20 70 2d 3e 65 72 72 43 6f 64 65 20  ert( p->errCode 
7eb0: 7c 7c 20 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  || !p->journalOp
7ec0: 65 6e 20 7c 7c 20 28 70 2d 3e 65 78 63 6c 75 73  en || (p->exclus
7ed0: 69 76 65 4d 6f 64 65 26 26 21 70 2d 3e 6a 6f 75  iveMode&&!p->jou
7ee0: 72 6e 61 6c 4f 66 66 29 20 29 3b 0a 20 20 61 73  rnalOff) );.  as
7ef0: 73 65 72 74 28 20 70 2d 3e 65 72 72 43 6f 64 65  sert( p->errCode
7f00: 20 7c 7c 20 21 70 2d 3e 73 74 6d 74 4f 70 65 6e   || !p->stmtOpen
7f10: 20 7c 7c 20 70 2d 3e 65 78 63 6c 75 73 69 76 65   || p->exclusive
7f20: 4d 6f 64 65 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  Mode );.}.../*.*
7f30: 2a 20 43 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d  * Clear the in-m
7f40: 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 54 68  emory cache.  Th
7f50: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65  is routine.** se
7f60: 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ts the state of 
7f70: 74 68 65 20 70 61 67 65 72 20 62 61 63 6b 20 74  the pager back t
7f80: 6f 20 77 68 61 74 20 69 74 20 77 61 73 20 77 68  o what it was wh
7f90: 65 6e 20 69 74 20 77 61 73 20 66 69 72 73 74 0a  en it was first.
7fa0: 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20  ** opened.  Any 
7fb0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
7fc0: 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
7fd0: 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
7fe0: 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20   attempts.** to 
7ff0: 61 63 63 65 73 73 20 74 68 6f 73 65 20 70 61 67  access those pag
8000: 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72  es will likely r
8010: 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64  esult in a cored
8020: 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ump..*/.static v
8030: 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74 28  oid pager_reset(
8040: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
8050: 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70    PgHdr *pPg, *p
8060: 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 50 61 67  Next;.  if( pPag
8070: 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65  er->errCode ) re
8080: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 50 67 3d  turn;.  for(pPg=
8090: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
80a0: 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20  g; pPg=pNext){. 
80b0: 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e     pNext = pPg->
80c0: 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71  pNextAll;.    sq
80d0: 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20  liteFree(pPg);. 
80e0: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 53 74   }.  pPager->pSt
80f0: 6d 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  mt = 0;.  pPager
8100: 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20  ->pFirst = 0;.  
8110: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
8120: 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67  nced = 0;.  pPag
8130: 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20  er->pLast = 0;. 
8140: 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20   pPager->pAll = 
8150: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48 61  0;.  pPager->nHa
8160: 73 68 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  sh = 0;.  sqlite
8170: 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61  Free(pPager->aHa
8180: 73 68 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  sh);.  pPager->n
8190: 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Page = 0;.  pPag
81a0: 65 72 2d 3e 61 48 61 73 68 20 3d 20 30 3b 0a 20  er->aHash = 0;. 
81b0: 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20   pPager->nRef = 
81c0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
81d0: 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20   routine ends a 
81e0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 41 20  transaction.  A 
81f0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65  transaction is e
8200: 6e 64 65 64 20 62 79 20 65 69 74 68 65 72 0a 2a  nded by either.*
8210: 2a 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20  * a COMMIT or a 
8220: 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20  ROLLBACK..**.** 
8230: 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
8240: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  e is called, the
8250: 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20 6a   pager has the j
8260: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e  ournal file open
8270: 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56   and.** a RESERV
8280: 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
8290: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
82a0: 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  base.  This rout
82b0: 69 6e 65 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  ine will release
82c0: 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
82d0: 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72   lock and acquir
82e0: 65 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  es a SHARED lock
82f0: 20 69 6e 20 69 74 73 20 70 6c 61 63 65 20 69 66   in its place if
8300: 20 74 68 61 74 20 69 73 0a 2a 2a 20 74 68 65 20   that is.** the 
8310: 61 70 70 72 6f 70 72 69 61 74 65 20 74 68 69 6e  appropriate thin
8320: 67 20 74 6f 20 64 6f 2e 20 20 52 65 6c 65 61 73  g to do.  Releas
8330: 65 20 6c 6f 63 6b 73 20 75 73 75 61 6c 6c 79 20  e locks usually 
8340: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2c 0a  is appropriate,.
8350: 2a 2a 20 75 6e 6c 65 73 73 20 77 65 20 61 72 65  ** unless we are
8360: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63   in exclusive ac
8370: 63 65 73 73 20 6d 6f 64 65 20 6f 72 20 75 6e 6c  cess mode or unl
8380: 65 73 73 20 74 68 69 73 20 69 73 20 61 20 0a 2a  ess this is a .*
8390: 2a 20 43 4f 4d 4d 49 54 20 41 4e 44 20 42 45 47  * COMMIT AND BEG
83a0: 49 4e 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 41  IN or ROLLBACK A
83b0: 4e 44 20 42 45 47 49 4e 20 6f 70 65 72 61 74 69  ND BEGIN operati
83c0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  on..**.** The jo
83d0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 65 69  urnal file is ei
83e0: 74 68 65 72 20 64 65 6c 65 74 65 64 20 6f 72 20  ther deleted or 
83f0: 74 72 75 6e 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  truncated..**.**
8400: 20 54 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20   TODO: Consider 
8410: 6b 65 65 70 69 6e 67 20 74 68 65 20 6a 6f 75 72  keeping the jour
8420: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f  nal file open fo
8430: 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  r temporary data
8440: 62 61 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d  bases..** This m
8450: 69 67 68 74 20 67 69 76 65 20 61 20 70 65 72 66  ight give a perf
8460: 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d  ormance improvem
8470: 65 6e 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77  ent on windows w
8480: 68 65 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20  here opening.** 
8490: 61 20 66 69 6c 65 20 69 73 20 61 6e 20 65 78 70  a file is an exp
84a0: 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e  ensive operation
84b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
84c0: 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
84d0: 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  ction(Pager *pPa
84e0: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
84f0: 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Pg;.  int rc = S
8500: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
8510: 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
8520: 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44  .  assert( !MEMD
8530: 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  B );.  if( pPage
8540: 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
8550: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72  ESERVED ){.    r
8560: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8570: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61  .  }.  sqlite3Pa
8580: 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50  gerStmtCommit(pP
8590: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
85a0: 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 26 26  ger->stmtOpen &&
85b0: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
85c0: 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 73  iveMode ){.    s
85d0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70  qlite3OsClose(&p
85e0: 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20  Pager->stfd);.  
85f0: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70    pPager->stmtOp
8600: 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  en = 0;.  }.  if
8610: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
8620: 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 69 66 28  lOpen ){.    if(
8630: 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
8640: 76 65 4d 6f 64 65 20 0a 20 20 20 20 20 20 20 20  veMode .        
8650: 20 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74    && (rc = sqlit
8660: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
8670: 67 65 72 2d 3e 6a 66 64 2c 20 30 29 29 3d 3d 53  ger->jfd, 0))==S
8680: 51 4c 49 54 45 5f 4f 4b 20 29 7b 3b 0a 20 20 20  QLITE_OK ){;.   
8690: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b     sqlite3OsSeek
86a0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
86b0: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
86c0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
86d0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
86e0: 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
86f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8700: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
8710: 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  e(&pPager->jfd);
8720: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
8730: 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a  ournalOpen = 0;.
8740: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
8750: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
8760: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
8770: 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
8780: 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  zJournal);.     
8790: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
87a0: 69 74 65 46 72 65 65 28 20 70 50 61 67 65 72 2d  iteFree( pPager-
87b0: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >aInJournal );. 
87c0: 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f     pPager->aInJo
87d0: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66  urnal = 0;.    f
87e0: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
87f0: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
8800: 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
8810: 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
8820: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  al = 0;.      pP
8830: 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
8840: 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
8850: 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  c = 0;.      pPg
8860: 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
8870: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
8880: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
8890: 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48        pPg->pageH
88a0: 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
88b0: 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
88c0: 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  f.    }.    pPag
88d0: 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  er->pDirty = 0;.
88e0: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
88f0: 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20  yCache = 0;.    
8900: 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
8910: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
8920: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
8930: 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
8940: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
8950: 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d  er->dirtyCache==
8960: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 75 73 65  0 || pPager->use
8970: 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
8980: 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  }..  if( !pPager
8990: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
89a0: 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  ){.    rc2 = sql
89b0: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  ite3OsUnlock(pPa
89c0: 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
89d0: 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65  LOCK);.    pPage
89e0: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
89f0: 5f 53 48 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65  _SHARED;.  }else
8a00: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
8a10: 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te==PAGER_SYNCED
8a20: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
8a30: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58  state = PAGER_EX
8a40: 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70  CLUSIVE;.  }.  p
8a50: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
8a60: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
8a70: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
8a80: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
8a90: 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nc = 0;.  pPager
8aa0: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
8ab0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b   pPager->pFirst;
8ac0: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
8ad0: 65 20 3d 20 2d 31 3b 0a 0a 20 20 72 65 74 75 72  e = -1;..  retur
8ae0: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
8af0: 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  ?rc2:rc);.}../*.
8b00: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72  ** Compute and r
8b10: 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d  eturn a checksum
8b20: 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66   for the page of
8b30: 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   data..**.** Thi
8b40: 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20  s is not a real 
8b50: 63 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73  checksum.  It is
8b60: 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65   really just the
8b70: 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20   sum of the .** 
8b80: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76  random initial v
8b90: 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61 67  alue and the pag
8ba0: 65 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 65 78  e number.  We ex
8bb0: 70 65 72 69 6d 65 6e 74 65 64 20 77 69 74 68 0a  perimented with.
8bc0: 2a 2a 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66  ** a checksum of
8bd0: 20 74 68 65 20 65 6e 74 69 72 65 20 64 61 74 61   the entire data
8be0: 2c 20 62 75 74 20 74 68 61 74 20 77 61 73 20 66  , but that was f
8bf0: 6f 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73  ound to be too s
8c00: 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  low..**.** Note 
8c10: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75  that the page nu
8c20: 6d 62 65 72 20 69 73 20 73 74 6f 72 65 64 20 61  mber is stored a
8c30: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
8c40: 6f 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74  of data and.** t
8c50: 68 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73  he checksum is s
8c60: 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
8c70: 2e 20 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  .  This is impor
8c80: 74 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61  tant.  If journa
8c90: 6c 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20  l.** corruption 
8ca0: 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20  occurs due to a 
8cb0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74  power failure, t
8cc0: 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73  he most likely s
8cd0: 63 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68  cenario.** is th
8ce0: 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68  at one end or th
8cf0: 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72  e other of the r
8d00: 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68  ecord will be ch
8d10: 61 6e 67 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a  anged.  It is.**
8d20: 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c   much less likel
8d30: 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65  y that the two e
8d40: 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nds of the journ
8d50: 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  al record will b
8d60: 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64  e.** correct and
8d70: 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63   the middle be c
8d80: 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74  orrupt.  Thus, t
8d90: 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73  his "checksum" s
8da0: 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68  cheme,.** though
8db0: 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65   fast and simple
8dc0: 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f  , catches the mo
8dd0: 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64  stly likely kind
8de0: 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a   of corruption..
8df0: 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43  **.** FIX ME:  C
8e00: 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 65  onsider adding e
8e10: 76 65 72 79 20 32 30 30 74 68 20 28 6f 72 20 73  very 200th (or s
8e20: 6f 29 20 62 79 74 65 20 6f 66 20 74 68 65 20 64  o) byte of the d
8e30: 61 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68  ata to the.** ch
8e40: 65 63 6b 73 75 6d 2e 20 20 54 68 61 74 20 77 61  ecksum.  That wa
8e50: 79 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61  y if a single pa
8e60: 67 65 20 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f  ge spans 3 or mo
8e70: 72 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 20  re disk sectors 
8e80: 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20  and.** only the 
8e90: 6d 69 64 64 6c 65 20 73 65 63 74 6f 72 20 69 73  middle sector is
8ea0: 20 63 6f 72 72 75 70 74 2c 20 77 65 20 77 69 6c   corrupt, we wil
8eb0: 6c 20 73 74 69 6c 6c 20 68 61 76 65 20 61 20 72  l still have a r
8ec0: 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61  easonable.** cha
8ed0: 6e 63 65 20 6f 66 20 66 61 69 6c 69 6e 67 20 74  nce of failing t
8ee0: 68 65 20 63 68 65 63 6b 73 75 6d 20 61 6e 64 20  he checksum and 
8ef0: 74 68 75 73 20 64 65 74 65 63 74 69 6e 67 20 74  thus detecting t
8f00: 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73  he problem..*/.s
8f10: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
8f20: 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61  cksum(Pager *pPa
8f30: 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61  ger, const u8 *a
8f40: 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73  Data){.  u32 cks
8f50: 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73  um = pPager->cks
8f60: 75 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20  umInit;.  int i 
8f70: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
8f80: 7a 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65 28  ze-200;.  while(
8f90: 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75   i>0 ){.    cksu
8fa0: 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20  m += aData[i];. 
8fb0: 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d     i -= 200;.  }
8fc0: 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b  .  return cksum;
8fd0: 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  .}../* Forward d
8fe0: 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74  eclaration */.st
8ff0: 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c  atic void makeCl
9000: 65 61 6e 28 50 67 48 64 72 2a 29 3b 0a 0a 2f 2a  ean(PgHdr*);../*
9010: 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c  .** Read a singl
9020: 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
9030: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
9040: 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  ned on file desc
9050: 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20  riptor.** jfd.  
9060: 50 6c 61 79 62 61 63 6b 20 74 68 69 73 20 6f 6e  Playback this on
9070: 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e page..**.** If
9080: 20 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20   useCksum==0 it 
9090: 6d 65 61 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e  means this journ
90a0: 61 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  al does not use 
90b0: 63 68 65 63 6b 73 75 6d 73 2e 20 20 43 68 65 63  checksums.  Chec
90c0: 6b 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74  ksums.** are not
90d0: 20 75 73 65 64 20 69 6e 20 73 74 61 74 65 6d 65   used in stateme
90e0: 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61  nt journals beca
90f0: 75 73 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  use statement jo
9100: 75 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a  urnals do not.**
9110: 20 6e 65 65 64 20 74 6f 20 73 75 72 76 69 76 65   need to survive
9120: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 2e   power failures.
9130: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
9140: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
9150: 65 5f 70 61 67 65 28 50 61 67 65 72 20 2a 70 50  e_page(Pager *pP
9160: 61 67 65 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66  ager, OsFile *jf
9170: 64 2c 20 69 6e 74 20 75 73 65 43 6b 73 75 6d 29  d, int useCksum)
9180: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
9190: 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20  Hdr *pPg;       
91a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
91b0: 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20  n existing page 
91c0: 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  in the cache */.
91d0: 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91f0: 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
9200: 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  er of a page in 
9210: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
9220: 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
9230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
9240: 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20  ecksum used for 
9250: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
9260: 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74 61 20 3d  */.  u8 *aData =
9270: 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70   (u8 *)pPager->p
9280: 54 6d 70 53 70 61 63 65 3b 20 20 20 2f 2a 20 54  TmpSpace;   /* T
9290: 65 6d 70 20 73 74 6f 72 61 67 65 20 66 6f 72 20  emp storage for 
92a0: 61 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  a page */..  /* 
92b0: 75 73 65 43 6b 73 75 6d 20 73 68 6f 75 6c 64 20  useCksum should 
92c0: 62 65 20 74 72 75 65 20 66 6f 72 20 74 68 65 20  be true for the 
92d0: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  main journal and
92e0: 20 66 61 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20   false for.  ** 
92f0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
9300: 6c 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74  ls.  Verify that
9310: 20 74 68 69 73 20 69 73 20 61 6c 77 61 79 73 20   this is always 
9320: 74 68 65 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20  the case.  */.  
9330: 61 73 73 65 72 74 28 20 6a 66 64 20 3d 3d 20 28  assert( jfd == (
9340: 75 73 65 43 6b 73 75 6d 20 3f 20 70 50 61 67 65  useCksum ? pPage
9350: 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d  r->jfd : pPager-
9360: 3e 73 74 66 64 29 20 29 3b 0a 20 20 61 73 73 65  >stfd) );.  asse
9370: 72 74 28 20 61 44 61 74 61 20 29 3b 0a 0a 20 20  rt( aData );..  
9380: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
9390: 6a 66 64 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69  jfd, &pgno);.  i
93a0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
93b0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
93c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
93d0: 61 64 28 6a 66 64 2c 20 61 44 61 74 61 2c 20 70  ad(jfd, aData, p
93e0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
93f0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
9400: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
9410: 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  c;.  pPager->jou
9420: 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65  rnalOff += pPage
9430: 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 3b  r->pageSize + 4;
9440: 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68  ..  /* Sanity ch
9450: 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61  ecking on the pa
9460: 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72  ge.  This is mor
9470: 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  e important that
9480: 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20   I originally.  
9490: 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20  ** thought.  If 
94a0: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
94b0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65  occurs while the
94c0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e   journal is bein
94d0: 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20  g written,.  ** 
94e0: 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69  it could cause i
94f0: 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62  nvalid data to b
9500: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
9510: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20  he journal.  We 
9520: 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74  need to.  ** det
9530: 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64  ect this invalid
9540: 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68   data (with high
9550: 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e   probability) an
9560: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a  d ignore it..  *
9570: 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  /.  if( pgno==0 
9580: 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
9590: 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
95a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
95b0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
95c0: 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e  if( pgno>(unsign
95d0: 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ed)pPager->dbSiz
95e0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
95f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
9600: 20 69 66 28 20 75 73 65 43 6b 73 75 6d 20 29 7b   if( useCksum ){
9610: 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32  .    rc = read32
9620: 62 69 74 73 28 6a 66 64 2c 20 26 63 6b 73 75 6d  bits(jfd, &cksum
9630: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
9640: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
9650: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
9660: 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28 20  f += 4;.    if( 
9670: 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
9680: 65 72 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75  er, aData)!=cksu
9690: 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
96a0: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
96b0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
96c0: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
96d0: 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
96e0: 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61  D || pPager->sta
96f0: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
9700: 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  IVE );..  /* If 
9710: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
9720: 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
9730: 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20  then there must 
9740: 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69  be a copy of thi
9750: 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74  s.  ** page in t
9760: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
9770: 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73  In this case jus
9780: 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  t update the pag
9790: 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e  er cache,.  ** n
97a0: 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ot the database 
97b0: 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  file. The page i
97c0: 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69  s left marked di
97d0: 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65  rty in this case
97e0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69  ..  **.  ** If i
97f0: 6e 20 45 58 43 4c 55 53 49 56 45 20 73 74 61 74  n EXCLUSIVE stat
9800: 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74  e, then we updat
9810: 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  e the pager cach
9820: 65 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 20  e if it exists. 
9830: 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e   ** and the main
9840: 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
9850: 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e  is then marked n
9860: 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20  ot dirty..  **. 
9870: 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31   ** Ticket #1171
9880: 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74  :  The statement
9890: 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63   journal might c
98a0: 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74  ontain page cont
98b0: 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  ent that is.  **
98c0: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
98d0: 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
98e0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
98f0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
9900: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75  ..  ** This occu
9910: 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  rs when a page i
9920: 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  s changed prior 
9930: 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
9940: 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  a statement.  **
9950: 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67   then changed ag
9960: 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73  ain within the s
9970: 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20  tatement.  When 
9980: 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63  rolling back suc
9990: 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  h a.  ** stateme
99a0: 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77  nt we must not w
99b0: 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67  rite to the orig
99c0: 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e  inal database un
99d0: 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a  less we know.  *
99e0: 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68  * for certain th
99f0: 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  at original page
9a00: 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 69 6e   contents are in
9a10: 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
9a20: 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
9a30: 20 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20    Otherwise, if 
9a40: 61 20 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20  a full ROLLBACK 
9a50: 6f 63 63 75 72 73 20 61 66 74 65 72 20 74 68 65  occurs after the
9a60: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
9a70: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 66 75 6c  rollback the ful
9a80: 6c 20 52 4f 4c 4c 42 41 43 4b 20 77 69 6c 6c 20  l ROLLBACK will 
9a90: 6e 6f 74 20 72 65 73 74 6f 72 65 20 74 68 65 20  not restore the 
9aa0: 70 61 67 65 20 74 6f 20 69 74 73 20 6f 72 69 67  page to its orig
9ab0: 69 6e 61 6c 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e  inal.  ** conten
9ac0: 74 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f  t.  Two conditio
9ad0: 6e 73 20 6d 75 73 74 20 62 65 20 6d 65 74 20 62  ns must be met b
9ae0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
9af0: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
9b00: 2a 2a 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68  ** files. (1) th
9b10: 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
9b20: 62 65 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20  be locked.  (2) 
9b30: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
9b40: 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 70   original.  ** p
9b50: 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 69  age content is i
9b60: 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  n the main journ
9b70: 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73  al either becaus
9b80: 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  e the page is no
9b90: 74 20 69 6e 0a 20 20 2a 2a 20 63 61 63 68 65 20  t in.  ** cache 
9ba0: 6f 72 20 65 6c 73 65 20 69 74 20 69 73 20 6d 61  or else it is ma
9bb0: 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63  rked as needSync
9bc0: 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20  ==0..  */.  pPg 
9bd0: 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
9be0: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
9bf0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9c00: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
9c10: 4c 55 53 49 56 45 20 7c 7c 20 70 50 67 21 3d 30  LUSIVE || pPg!=0
9c20: 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45   );.  PAGERTRACE
9c30: 33 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70  3("PLAYBACK %d p
9c40: 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
9c50: 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
9c60: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
9c70: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
9c80: 43 4c 55 53 49 56 45 20 26 26 20 28 70 50 67 3d  CLUSIVE && (pPg=
9c90: 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53  =0 || pPg->needS
9ca0: 79 6e 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72  ync==0) ){.    r
9cb0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
9cc0: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70  k(pPager->fd, (p
9cd0: 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
9ce0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
9cf0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
9d00: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
9d10: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
9d20: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44  e(pPager->fd, aD
9d30: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
9d40: 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
9d50: 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
9d60: 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
9d70: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
9d80: 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a  f( pPg ){.    /*
9d90: 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20   No page should 
9da0: 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74  ever be explicit
9db0: 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ly rolled back t
9dc0: 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65  hat is in use, e
9dd0: 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72  xcept.    ** for
9de0: 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73   page 1 which is
9df0: 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20   held in use in 
9e00: 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68  order to keep th
9e10: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  e lock on the.  
9e20: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63    ** database ac
9e30: 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75  tive. However su
9e40: 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65  ch a page may be
9e50: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
9e60: 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  a result.    ** 
9e70: 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65  of an internal e
9e80: 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69  rror resulting i
9e90: 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63  n an automatic c
9ea0: 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
9eb0: 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
9ec0: 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ck()..    */.   
9ed0: 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20   void *pData;.  
9ee0: 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50 67    /* assert( pPg
9ef0: 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67  ->nRef==0 || pPg
9f00: 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a  ->pgno==1 ); */.
9f10: 20 20 20 20 70 44 61 74 61 20 3d 20 50 47 48 44      pData = PGHD
9f20: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a  R_TO_DATA(pPg);.
9f30: 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
9f40: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
9f50: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
9f60: 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73  if( pPager->xDes
9f70: 74 72 75 63 74 6f 72 20 29 7b 20 20 2f 2a 2a 2a  tructor ){  /***
9f80: 20 46 49 58 20 4d 45 3a 20 20 53 68 6f 75 6c 64   FIX ME:  Should
9f90: 20 74 68 69 73 20 62 65 20 78 52 65 69 6e 69 74   this be xReinit
9fa0: 3f 20 2a 2a 2a 2f 0a 20 20 20 20 20 20 70 50 61  ? ***/.      pPa
9fb0: 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
9fc0: 28 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61  (pPg, pPager->pa
9fd0: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23  geSize);.    }.#
9fe0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
9ff0: 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67  CK_PAGES.    pPg
a000: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
a010: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
a020: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 43 4f 44  ;.#endif.    COD
a030: 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC1(pPager, pDat
a040: 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29  a, pPg->pgno, 3)
a050: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
a060: 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68  s was page 1, th
a070: 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76  en restore the v
a080: 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 69 43  alue of Pager.iC
a090: 68 61 6e 67 65 43 6f 75 6e 74 20 2a 2f 0a 20 20  hangeCount */.  
a0a0: 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
a0b0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 69  .      pPager->i
a0c0: 43 68 61 6e 67 65 43 6f 75 6e 74 20 3d 20 72 65  ChangeCount = re
a0d0: 74 72 69 65 76 65 33 32 62 69 74 73 28 70 50 67  trieve32bits(pPg
a0e0: 2c 20 32 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  , 24);.    }.  }
a0f0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
a100: 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
a110: 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20   zMaster is the 
a120: 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
a130: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
a140: 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a   single journal.
a150: 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66  ** file that ref
a160: 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73  erred to the mas
a170: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
a180: 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72   has just been r
a190: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54  olled back..** T
a1a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
a1b0: 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ks if it is poss
a1c0: 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
a1d0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
a1e0: 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64  l file,.** and d
a1f0: 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e  oes so if it is.
a200: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
a210: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  r journal file c
a220: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65  ontains the name
a230: 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a  s of all child j
a240: 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74  ournals..** To t
a250: 65 6c 6c 20 69 66 20 61 20 6d 61 73 74 65 72 20  ell if a master 
a260: 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64  journal can be d
a270: 65 6c 65 74 65 64 2c 20 63 68 65 63 6b 20 74 6f  eleted, check to
a280: 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20   each of the.** 
a290: 63 68 69 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c  children.  If al
a2a0: 6c 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 65  l children are e
a2b0: 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72  ither missing or
a2c0: 20 64 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f   do not refer to
a2d0: 0a 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20  .** a different 
a2e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20  master journal, 
a2f0: 74 68 65 6e 20 74 68 69 73 20 6d 61 73 74 65 72  then this master
a300: 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
a310: 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  deleted..*/.stat
a320: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c  ic int pager_del
a330: 6d 61 73 74 65 72 28 63 6f 6e 73 74 20 63 68 61  master(const cha
a340: 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
a350: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73  nt rc;.  int mas
a360: 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20  ter_open = 0;.  
a370: 4f 73 46 69 6c 65 20 2a 6d 61 73 74 65 72 20 3d  OsFile *master =
a380: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   0;.  char *zMas
a390: 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20  terJournal = 0; 
a3a0: 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d  /* Contents of m
a3b0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
a3c0: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73  le */.  i64 nMas
a3d0: 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  terJournal;     
a3e0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73    /* Size of mas
a3f0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
a400: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74   */..  /* Open t
a410: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
a420: 6c 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65  l file exclusive
a430: 6c 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20  ly in case some 
a440: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20  other process.  
a450: 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68  ** is running th
a460: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e  is routine also.
a470: 20 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b   Not that it mak
a480: 65 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66  es too much diff
a490: 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 72  erence..  */.  r
a4a0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
a4b0: 6e 52 65 61 64 4f 6e 6c 79 28 7a 4d 61 73 74 65  nReadOnly(zMaste
a4c0: 72 2c 20 26 6d 61 73 74 65 72 29 3b 0a 20 20 61  r, &master);.  a
a4d0: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
a4e0: 45 5f 4f 4b 20 7c 7c 20 6d 61 73 74 65 72 20 29  E_OK || master )
a4f0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
a500: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
a510: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61  master_out;.  ma
a520: 73 74 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 20  ster_open = 1;. 
a530: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
a540: 69 6c 65 53 69 7a 65 28 6d 61 73 74 65 72 2c 20  ileSize(master, 
a550: 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  &nMasterJournal)
a560: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
a570: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
a580: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69  master_out;..  i
a590: 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( nMasterJourna
a5a0: 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  l>0 ){.    char 
a5b0: 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63  *zJournal;.    c
a5c0: 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20  har *zMasterPtr 
a5d0: 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61  = 0;..    /* Loa
a5e0: 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73  d the entire mas
a5f0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
a600: 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61   into space obta
a610: 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ined from.    **
a620: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
a630: 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  and pointed to b
a640: 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  y zMasterJournal
a650: 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d  . .    */.    zM
a660: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28  asterJournal = (
a670: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c  char *)sqliteMal
a680: 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  loc(nMasterJourn
a690: 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d  al);.    if( !zM
a6a0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
a6b0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
a6c0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
a6d0: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
a6e0: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
a6f0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
a700: 6d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a  master, zMasterJ
a710: 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a  ournal, nMasterJ
a720: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28  ournal);.    if(
a730: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
a740: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
a750: 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e  out;..    zJourn
a760: 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72  al = zMasterJour
a770: 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  nal;.    while( 
a780: 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65  (zJournal-zMaste
a790: 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65  rJournal)<nMaste
a7a0: 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
a7b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46    if( sqlite3OsF
a7c0: 69 6c 65 45 78 69 73 74 73 28 7a 4a 6f 75 72 6e  ileExists(zJourn
a7d0: 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  al) ){.        /
a7e0: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75  * One of the jou
a7f0: 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f  rnals pointed to
a800: 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a   by the master j
a810: 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20  ournal exists.. 
a820: 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69         ** Open i
a830: 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69  t and check if i
a840: 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  t points at the 
a850: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
a860: 49 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  If.        ** so
a870: 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  , return without
a880: 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61   deleting the ma
a890: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
a8a0: 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
a8b0: 20 20 20 20 20 20 4f 73 46 69 6c 65 20 2a 6a 6f        OsFile *jo
a8c0: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
a8d0: 20 20 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20 20     int c;..     
a8e0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
a8f0: 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4a  sOpenReadOnly(zJ
a900: 6f 75 72 6e 61 6c 2c 20 26 6a 6f 75 72 6e 61 6c  ournal, &journal
a910: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
a920: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
a930: 20 7c 7c 20 6a 6f 75 72 6e 61 6c 20 29 3b 0a 20   || journal );. 
a940: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
a950: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
a960: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
a970: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
a980: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20    }..        rc 
a990: 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
a9a0: 6e 61 6c 28 6a 6f 75 72 6e 61 6c 2c 20 26 7a 4d  nal(journal, &zM
a9b0: 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20  asterPtr);.     
a9c0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
a9d0: 65 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  e(&journal);.   
a9e0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
a9f0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
aa00: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
aa10: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
aa20: 7d 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a  }..        c = z
aa30: 4d 61 73 74 65 72 50 74 72 21 3d 30 20 26 26 20  MasterPtr!=0 && 
aa40: 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
aa50: 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
aa60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
aa70: 65 65 28 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a  ee(zMasterPtr);.
aa80: 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b          if( c ){
aa90: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
aaa0: 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44   have a match. D
aab0: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
aac0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
aad0: 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  file. */.       
aae0: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
aaf0: 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
ab00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
ab10: 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c  Journal += (strl
ab20: 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b  en(zJournal)+1);
ab30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
ab40: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
ab50: 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 0a  lete(zMaster);..
ab60: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20  delmaster_out:. 
ab70: 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72   if( zMasterJour
ab80: 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nal ){.    sqlit
ab90: 65 46 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75  eFree(zMasterJou
aba0: 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69  rnal);.  }  .  i
abb0: 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29  f( master_open )
abc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
abd0: 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20  lose(&master);. 
abe0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
abf0: 7d 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 4d  }..#if 0./*.** M
ac00: 61 6b 65 20 65 76 65 72 79 20 70 61 67 65 20 69  ake every page i
ac10: 6e 20 74 68 65 20 63 61 63 68 65 20 61 67 72 65  n the cache agre
ac20: 65 20 77 69 74 68 20 77 68 61 74 20 69 73 20 6f  e with what is o
ac30: 6e 20 64 69 73 6b 2e 20 20 49 6e 20 6f 74 68 65  n disk.  In othe
ac40: 72 20 77 6f 72 64 73 2c 0a 2a 2a 20 72 65 72 65  r words,.** rere
ac50: 61 64 20 74 68 65 20 64 69 73 6b 20 74 6f 20 72  ad the disk to r
ac60: 65 73 65 74 20 74 68 65 20 73 74 61 74 65 20 6f  eset the state o
ac70: 66 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a  f the cache..**.
ac80: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
ac90: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
aca0: 61 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 20 77 68  a rollback in wh
acb0: 69 63 68 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  ich some of the 
acc0: 64 69 72 74 79 20 63 61 63 68 65 0a 2a 2a 20 70  dirty cache.** p
acd0: 61 67 65 73 20 68 61 64 20 6e 65 76 65 72 20 62  ages had never b
ace0: 65 65 6e 20 77 72 69 74 74 65 6e 20 6f 75 74 20  een written out 
acf0: 74 6f 20 64 69 73 6b 2e 20 20 57 65 20 6e 65 65  to disk.  We nee
ad00: 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74  d to roll back t
ad10: 68 65 0a 2a 2a 20 63 61 63 68 65 20 63 6f 6e 74  he.** cache cont
ad20: 65 6e 74 20 61 6e 64 20 74 68 65 20 65 61 73 69  ent and the easi
ad30: 65 73 74 20 77 61 79 20 74 6f 20 64 6f 20 74 68  est way to do th
ad40: 61 74 20 69 73 20 74 6f 20 72 65 72 65 61 64 20  at is to reread 
ad50: 74 68 65 20 6f 6c 64 20 63 6f 6e 74 65 6e 74 0a  the old content.
ad60: 2a 2a 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ** back from the
ad70: 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   disk..*/.static
ad80: 20 69 6e 74 20 70 61 67 65 72 5f 72 65 6c 6f 61   int pager_reloa
ad90: 64 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a 70  d_cache(Pager *p
ada0: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
adb0: 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *pPg;.  int rc =
adc0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66 6f   SQLITE_OK;.  fo
add0: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
ade0: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
adf0: 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
ae00: 20 63 68 61 72 20 2a 7a 42 75 66 20 3d 20 70 50   char *zBuf = pP
ae10: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
ae20: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
ae30: 73 74 6f 72 61 67 65 20 66 6f 72 20 6f 6e 65 20  storage for one 
ae40: 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  page */.    if( 
ae50: 21 70 50 67 2d 3e 64 69 72 74 79 20 29 20 63 6f  !pPg->dirty ) co
ae60: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
ae70: 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c  (int)pPg->pgno <
ae80: 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
ae90: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 63  Size ){.      rc
aea0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
aeb0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
aec0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69  ger->pageSize*(i
aed0: 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29  64)(pPg->pgno-1)
aee0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
aef0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
af00: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
af10: 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
af20: 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65  >fd, zBuf, pPage
af30: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
af40: 20 20 20 20 7d 0a 20 20 20 20 20 20 50 41 47 45      }.      PAGE
af50: 52 54 52 41 43 45 33 28 22 52 45 46 45 54 43 48  RTRACE3("REFETCH
af60: 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
af70: 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
af80: 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
af90: 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
afa0: 6b 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28  k;.      CODEC1(
afb0: 70 50 61 67 65 72 2c 20 7a 42 75 66 2c 20 70 50  pPager, zBuf, pP
afc0: 67 2d 3e 70 67 6e 6f 2c 20 32 29 3b 0a 20 20 20  g->pgno, 2);.   
afd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
afe0: 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 70 50  mset(zBuf, 0, pP
aff0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
b000: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
b010: 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 6d  Pg->nRef==0 || m
b020: 65 6d 63 6d 70 28 7a 42 75 66 2c 20 50 47 48 44  emcmp(zBuf, PGHD
b030: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
b040: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
b050: 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ) ){.      memcp
b060: 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
b070: 70 50 67 29 2c 20 7a 42 75 66 2c 20 70 50 61 67  pPg), zBuf, pPag
b080: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
b090: 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
b0a0: 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20  >xReiniter ){.  
b0b0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52        pPager->xR
b0c0: 65 69 6e 69 74 65 72 28 70 50 67 2c 20 70 50 61  einiter(pPg, pPa
b0d0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
b0e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b0f0: 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
b100: 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20  R_TO_EXTRA(pPg, 
b110: 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67  pPager), 0, pPag
b120: 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20  er->nExtra);.   
b130: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
b140: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
b150: 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79  ;.    pPg->dirty
b160: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
b170: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
b180: 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
b190: 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
b1a0: 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
b1b0: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 44    }.  pPager->pD
b1c0: 69 72 74 79 20 3d 20 30 3b 0a 20 20 72 65 74 75  irty = 0;.  retu
b1d0: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
b1e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
b1f0: 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68  er_truncate_cach
b200: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
b210: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  ;../*.** Truncat
b220: 65 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 20  e the main file 
b230: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  of the given pag
b240: 65 72 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  er to the number
b250: 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e 64   of pages.** ind
b260: 69 63 61 74 65 64 2e 20 41 6c 73 6f 20 74 72 75  icated. Also tru
b270: 6e 63 61 74 65 20 74 68 65 20 63 61 63 68 65 64  ncate the cached
b280: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
b290: 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a  of the file..*/.
b2a0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
b2b0: 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  _truncate(Pager 
b2c0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50 61  *pPager, int nPa
b2d0: 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ge){.  int rc = 
b2e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
b2f0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
b300: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
b310: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
b320: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
b330: 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
b340: 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29  ->pageSize*(i64)
b350: 6e 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66  nPage);.  }.  if
b360: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
b370: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
b380: 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  bSize = nPage;. 
b390: 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74     pager_truncat
b3a0: 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  e_cache(pPager);
b3b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
b3c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  ;.}../*.** Playb
b3d0: 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ack the journal 
b3e0: 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65  and thus restore
b3f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
b400: 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61  le to.** the sta
b410: 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66  te it was in bef
b420: 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d  ore we started m
b430: 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20  aking changes.  
b440: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
b450: 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69  al file format i
b460: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a  s as follows: .*
b470: 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74  *.**  (1)  8 byt
b480: 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70  e prefix.  A cop
b490: 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  y of aJournalMag
b4a0: 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34  ic[]..**  (2)  4
b4b0: 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
b4c0: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
b4d0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
b4e0: 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72  valid page recor
b4f0: 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74  ds.**       in t
b500: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20  he journal.  If 
b510: 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78  this value is 0x
b520: 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63  ffffffff, then c
b530: 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20  ompute the.**   
b540: 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61      number of pa
b550: 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ge records from 
b560: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65  the journal size
b570: 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74  ..**  (3)  4 byt
b580: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
b590: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
b5a0: 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
b5b0: 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20  for the .**     
b5c0: 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75    sanity checksu
b5d0: 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79  m..**  (4)  4 by
b5e0: 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
b5f0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
b600: 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63  f pages to trunc
b610: 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ate the.**      
b620: 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72   database to dur
b630: 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a  ing a rollback..
b640: 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20  **  (5)  4 byte 
b650: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
b660: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
b670: 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74  ytes in the mast
b680: 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  er journal.**   
b690: 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20 76      name.  The v
b6a0: 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f  alue may be zero
b6b0: 20 28 69 6e 64 69 63 61 74 65 20 74 68 61 74 20   (indicate that 
b6c0: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74  there is no mast
b6d0: 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72  er.**       jour
b6e0: 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36 29 20 20 4e  nal.).**  (6)  N
b6f0: 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d 61   bytes of the ma
b700: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
b710: 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69 6c  e.  The name wil
b720: 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  l be nul-termina
b730: 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64  ted.**       and
b740: 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65   might be shorte
b750: 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75 65  r than the value
b760: 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e 20   read from (5). 
b770: 20 49 66 20 74 68 65 20 66 69 72 73 74 20 62 79   If the first by
b780: 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 74  te.**       of t
b790: 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30 20  he name is \000 
b7a0: 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  then there is no
b7b0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
b7c0: 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20    The master.** 
b7d0: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e 61        journal na
b7e0: 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  me is stored in 
b7f0: 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 37 29 20 20  UTF-8..**  (7)  
b800: 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67  Zero or more pag
b810: 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61  es instances, ea
b820: 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ch as follows:.*
b830: 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
b840: 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  te page number..
b850: 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61  **        +  pPa
b860: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
b870: 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20  tes of data..** 
b880: 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65         +  4 byte
b890: 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20   checksum.**.** 
b8a0: 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66  When we speak of
b8b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
b8c0: 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65  der, we mean the
b8d0: 20 66 69 72 73 74 20 36 20 69 74 65 6d 73 20 61   first 6 items a
b8e0: 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e  bove..** Each en
b8f0: 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  try in the journ
b900: 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  al is an instanc
b910: 65 20 6f 66 20 74 68 65 20 37 74 68 20 69 74 65  e of the 7th ite
b920: 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  m..**.** Call th
b930: 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65  e value from the
b940: 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22   second bullet "
b950: 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20  nRec".  nRec is 
b960: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
b970: 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72   valid page entr
b980: 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ies in the journ
b990: 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73  al.  In most cas
b9a0: 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70  es, you can comp
b9b0: 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65  ute the.** value
b9c0: 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68   of nRec from th
b9d0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
b9e0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74  urnal file.  But
b9f0: 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66   if a power.** f
ba00: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20  ailure occurred 
ba10: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
ba20: 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74  l was being writ
ba30: 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65  ten, it could be
ba40: 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61   the.** case tha
ba50: 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
ba60: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
ba70: 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ad already been 
ba80: 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a  increased but.**
ba90: 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69   the extra entri
baa0: 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d  es had not yet m
bab0: 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f  ade it safely to
bac0: 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20   disk.  In such 
bad0: 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76  a case,.** the v
bae0: 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d  alue of nRec com
baf0: 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  puted from the f
bb00: 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62  ile size would b
bb10: 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f  e too large.  Fo
bb20: 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e  r.** that reason
bb30: 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  , we always use 
bb40: 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
bb50: 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a  n the header..**
bb60: 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20  .** If the nRec 
bb70: 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
bb80: 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61  fff it means tha
bb90: 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65  t nRec should be
bba0: 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f   computed.** fro
bbb0: 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e  m the file size.
bbc0: 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20    This value is 
bbd0: 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73  used when the us
bbe0: 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a  er selects the.*
bbf0: 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e  * no-sync option
bc00: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
bc10: 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75  .  A power failu
bc20: 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f  re could lead to
bc30: 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69   corruption.** i
bc40: 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75  n this case.  Bu
bc50: 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b  t for things lik
bc60: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
bc70: 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65  e (which will be
bc80: 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e  .** deleted when
bc90: 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65   the power is re
bca0: 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74  stored) we don't
bcb0: 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49   care.  .**.** I
bcc0: 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  f the file opene
bcd0: 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d as the journal
bce0: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77   file is not a w
bcf0: 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f  ell-formed.** jo
bd00: 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20  urnal file then 
bd10: 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20  all pages up to 
bd20: 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70  the first corrup
bd30: 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c  ted page are rol
bd40: 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20  led.** back (or 
bd50: 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20  no pages if the 
bd60: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
bd70: 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68  s corrupted). Th
bd80: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  e journal file.*
bd90: 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65  * is then delete
bda0: 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
bdb0: 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61  returned, just a
bdc0: 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69  s if no corrupti
bdd0: 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65  on had.** been e
bde0: 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a  ncountered..**.*
bdf0: 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d  * If an I/O or m
be00: 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63  alloc() error oc
be10: 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61  curs, the journa
be20: 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65  l-file is not de
be30: 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20  leted.** and an 
be40: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
be50: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
be60: 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79  c int pager_play
be70: 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
be80: 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a  er, int isHot){.
be90: 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
bea0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
beb0: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
bec0: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
bed0: 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20  */.  u32 nRec;  
bee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bef0: 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
bf00: 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ds in the journa
bf10: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  l */.  int i;   
bf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf30: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
bf40: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d  */.  Pgno mxPg =
bf50: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
bf60: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69   Size of the ori
bf70: 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61  ginal file in pa
bf80: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ges */.  int rc;
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfa0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
bfb0: 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65   of a subroutine
bfc0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
bfd0: 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ter = 0;       /
bfe0: 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72  * Name of master
bff0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
c000: 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69   any */..  /* Fi
c010: 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
c020: 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e  y records are in
c030: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
c040: 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20  bort early if.  
c050: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** the journal i
c060: 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20  s empty..  */.  
c070: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
c080: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
c090: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
c0a0: 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
c0b0: 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66  jfd, &szJ);.  if
c0c0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c0d0: 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20  || szJ==0 ){.   
c0e0: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
c0f0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ck;.  }..  /* Re
c100: 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ad the master jo
c110: 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20  urnal name from 
c120: 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20  the journal, if 
c130: 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20  it is present.. 
c140: 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20   ** If a master 
c150: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
c160: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
c170: 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20  but the file is 
c180: 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74  not.  ** present
c190: 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74   on disk, then t
c1a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  he journal is no
c1b0: 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e  t hot and does n
c1c0: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20  ot need to be.  
c1d0: 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  ** played back..
c1e0: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64    */.  rc = read
c1f0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
c200: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61 73  ager->jfd, &zMas
c210: 74 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ter);.  assert( 
c220: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
c230: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
c240: 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73 74  ITE_OK || (zMast
c250: 65 72 20 26 26 20 21 73 71 6c 69 74 65 33 4f 73  er && !sqlite3Os
c260: 46 69 6c 65 45 78 69 73 74 73 28 7a 4d 61 73 74  FileExists(zMast
c270: 65 72 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  er)) ){.    sqli
c280: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  teFree(zMaster);
c290: 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30  .    zMaster = 0
c2a0: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
c2b0: 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d  LITE_DONE ) rc =
c2c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
c2d0: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
c2e0: 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  k;.  }.  sqlite3
c2f0: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a  OsSeek(pPager->j
c300: 66 64 2c 20 30 29 3b 0a 20 20 70 50 61 67 65 72  fd, 0);.  pPager
c310: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
c320: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f  ;..  /* This loo
c330: 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74  p terminates eit
c340: 68 65 72 20 77 68 65 6e 20 74 68 65 20 72 65 61  her when the rea
c350: 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63 61  dJournalHdr() ca
c360: 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20  ll returns.  ** 
c370: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61  SQLITE_DONE or a
c380: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
c390: 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31  s. */.  while( 1
c3a0: 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64   ){..    /* Read
c3b0: 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61   the next journa
c3c0: 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68  l header from th
c3d0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
c3e0: 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20   If there are.  
c3f0: 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20    ** not enough 
c400: 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68  bytes left in th
c410: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
c420: 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65  or a complete he
c430: 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20  ader, or.    ** 
c440: 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c  it is corrupted,
c450: 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   then a process 
c460: 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77  must of failed w
c470: 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e  hile writing it.
c480: 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64  .    ** This ind
c490: 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d  icates nothing m
c4a0: 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ore needs to be 
c4b0: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20  rolled back..   
c4c0: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61   */.    rc = rea
c4d0: 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
c4e0: 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20  er, szJ, &nRec, 
c4f0: 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20  &mxPg);.    if( 
c500: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
c510: 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d   .      if( rc==
c520: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
c530: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
c540: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
c550: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
c560: 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20  ayback;.    }.. 
c570: 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73     /* If nRec is
c580: 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
c590: 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77  n this journal w
c5a0: 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20  as created by a 
c5b0: 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77  process.    ** w
c5c0: 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e  orking in no-syn
c5d0: 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61  c mode. This mea
c5e0: 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74  ns that the rest
c5f0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
c600: 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73      ** file cons
c610: 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74  ists of pages, t
c620: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
c630: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73   journal headers
c640: 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a  . Compute.    **
c650: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52   the value of nR
c660: 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73  ec based on this
c670: 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20   assumption..   
c680: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63   */.    if( nRec
c690: 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a  ==0xffffffff ){.
c6a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
c6b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
c6c0: 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
c6d0: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
c6e0: 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20    nRec = (szJ - 
c6f0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
c700: 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f  Pager))/JOURNAL_
c710: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  PG_SZ(pPager);. 
c720: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
c730: 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68  nRec is 0 and th
c740: 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f  is rollback is o
c750: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
c760: 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a  created by this.
c770: 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 2e 20      ** process. 
c780: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
c790: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
c7a0: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 73 69 73  rnal file consis
c7b0: 74 73 20 6f 66 0a 20 20 20 20 2a 2a 20 6a 6f 75  ts of.    ** jou
c7c0: 72 6e 61 6c 6c 65 64 20 63 6f 70 69 65 73 20 6f  rnalled copies o
c7d0: 66 20 70 61 67 65 73 20 74 68 61 74 20 6e 65 65  f pages that nee
c7e0: 64 20 74 6f 20 62 65 20 72 65 61 64 20 62 61 63  d to be read bac
c7f0: 6b 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  k into the cache
c800: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
c810: 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48   nRec==0 && !isH
c820: 6f 74 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63  ot ){.      nRec
c830: 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72   = (szJ - pPager
c840: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20  ->journalOff) / 
c850: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
c860: 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ager);.    }..  
c870: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
c880: 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
c890: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
c8a0: 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65  ournal, truncate
c8b0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
c8c0: 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74  base file back t
c8d0: 6f 20 69 74 27 73 20 6f 72 69 67 69 6e 61 6c 20  o it's original 
c8e0: 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
c8f0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
c900: 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
c910: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
c920: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
c930: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
c940: 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20  ger, mxPg);.    
c950: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
c960: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
c970: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
c980: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c990: 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69  .    /* Copy ori
c9a0: 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20  ginal pages out 
c9b0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
c9c0: 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
c9d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
c9e0: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
c9f0: 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29  =0; i<nRec; i++)
ca00: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
ca10: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
ca20: 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61  page(pPager, pPa
ca30: 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20  ger->jfd, 1);.  
ca40: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
ca50: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
ca60: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
ca70: 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
ca80: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
ca90: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
caa0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
cab0: 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20   szJ;.          
cac0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
cad0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
cae0: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
caf0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
cb00: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
cb10: 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a   /*NOTREACHED*/.
cb20: 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a    assert( 0 );..
cb30: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  end_playback:.  
cb40: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
cb50: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
cb60: 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
cb70: 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ion(pPager);.  }
cb80: 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 20 29  .  if( zMaster )
cb90: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
cba0: 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a  e was a master j
cbb0: 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20  ournal and this 
cbc0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
cbd0: 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20  urn success,.   
cbe0: 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
cbf0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
cc00: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
cc10: 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20  ournal..    */. 
cc20: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
cc30: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
cc40: 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74   = pager_delmast
cc50: 65 72 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  er(zMaster);.   
cc60: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65   }.    sqliteFre
cc70: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a  e(zMaster);.  }.
cc80: 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e  .  /* The Pager.
cc90: 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61  sectorSize varia
cca0: 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  ble may have bee
ccb0: 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20  n updated while 
ccc0: 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63  rolling.  ** bac
ccd0: 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61  k a journal crea
cce0: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
ccf0: 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
cd00: 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20  t sector size.  
cd10: 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20  ** value. Reset 
cd20: 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  it to the correc
cd30: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73  t value for this
cd40: 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20   process..  */. 
cd50: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
cd60: 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  ize = sqlite3OsS
cd70: 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
cd80: 2d 3e 66 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  ->fd);.  return 
cd90: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61  rc;.}../*.** Pla
cda0: 79 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d  yback the statem
cdb0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  ent journal..**.
cdc0: 2a 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  ** This is simil
cdd0: 61 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61  ar to playing ba
cde0: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
cdf0: 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77  on journal but w
ce00: 69 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74  ith.** a few ext
ce10: 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a  ra twists..**.**
ce20: 20 20 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d      (1)  The num
ce30: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
ce40: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
ce50: 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
ce60: 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65  f.**         the
ce70: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 74   statement is st
ce80: 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e  ored in pPager->
ce90: 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e  stmtSize, not in
cea0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
ceb0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73  journal file its
cec0: 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  elf..**.**    (2
ced0: 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  )  In addition t
cee0: 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  o playing back t
cef0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
cf00: 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20  rnal, also.**   
cf10: 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61        playback a
cf20: 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65 20  ll pages of the 
cf30: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
cf40: 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a  nal beginning.**
cf50: 20 20 20 20 20 20 20 20 20 61 74 20 6f 66 66 73           at offs
cf60: 65 74 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  et pPager->stmtJ
cf70: 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Size..*/.static 
cf80: 69 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f 70  int pager_stmt_p
cf90: 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70  layback(Pager *p
cfa0: 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73 7a  Pager){.  i64 sz
cfb0: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
cfc0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
cfd0: 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a  e full journal *
cfe0: 2f 0a 20 20 69 36 34 20 68 64 72 4f 66 66 3b 0a  /.  i64 hdrOff;.
cff0: 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20    int nRec;     
d000: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
d010: 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
d020: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
d030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d040: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
d050: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a  .  int rc;..  sz
d060: 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J = pPager->jour
d070: 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e 64 65 66 20  nalOff;.#ifndef 
d080: 4e 44 45 42 55 47 20 0a 20 20 7b 0a 20 20 20 20  NDEBUG .  {.    
d090: 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20  i64 os_szJ;.    
d0a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
d0b0: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
d0c0: 66 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20  fd, &os_szJ);.  
d0d0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d0e0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
d0f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 4a  .    assert( szJ
d100: 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a  ==os_szJ );.  }.
d110: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74  #endif..  /* Set
d120: 20 68 64 72 4f 66 66 20 74 6f 20 62 65 20 74 68   hdrOff to be th
d130: 65 20 6f 66 66 73 65 74 20 6a 75 73 74 20 61 66  e offset just af
d140: 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ter the end of t
d150: 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 0a  he last journal.
d160: 20 20 2a 2a 20 70 61 67 65 20 77 72 69 74 74 65    ** page writte
d170: 6e 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  n before the fir
d180: 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  st journal-heade
d190: 72 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65  r for this state
d1a0: 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ment.  ** transa
d1b0: 63 74 69 6f 6e 20 77 61 73 20 77 72 69 74 74 65  ction was writte
d1c0: 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64 20 6f 66  n, or the end of
d1d0: 20 74 68 65 20 66 69 6c 65 20 69 66 20 6e 6f 20   the file if no 
d1e0: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61  journal.  ** hea
d1f0: 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2e  der was written.
d200: 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d  .  */.  hdrOff =
d210: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
d220: 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Off;.  assert( p
d230: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
d240: 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a 20 20  || !hdrOff );.  
d250: 69 66 28 20 21 68 64 72 4f 66 66 20 29 7b 0a 20  if( !hdrOff ){. 
d260: 20 20 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b     hdrOff = szJ;
d270: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72 75  .  }.  .  /* Tru
d280: 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61  ncate the databa
d290: 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  se back to its o
d2a0: 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
d2b0: 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  */.  rc = pager_
d2c0: 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
d2d0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
d2e0: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e);.  assert( pP
d2f0: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
d300: 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20  ER_SHARED );..  
d310: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
d320: 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
d330: 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  re in the statem
d340: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  ent journal..  *
d350: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
d360: 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26  er->stmtInUse &&
d370: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d380: 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65  Open );.  sqlite
d390: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
d3a0: 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52 65 63  stfd, 0);.  nRec
d3b0: 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e   = pPager->stmtN
d3c0: 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70  Rec;.  .  /* Cop
d3d0: 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  y original pages
d3e0: 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74 61 74   out of the stat
d3f0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e  ement journal an
d400: 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a  d back into the.
d410: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
d420: 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74  le.  Note that t
d430: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
d440: 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b  rnal omits check
d450: 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65  sums from.  ** e
d460: 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e 63 65  ach record since
d470: 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 72   power-failure r
d480: 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20 69  ecovery is not i
d490: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74 61 74  mportant to stat
d4a0: 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e  ement.  ** journ
d4b0: 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  als..  */.  for(
d4c0: 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20  i=nRec-1; i>=0; 
d4d0: 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  i--){.    rc = p
d4e0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
d4f0: 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  e_page(pPager, p
d500: 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b  Pager->stfd, 0);
d510: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
d520: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
d530: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
d540: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
d550: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
d560: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f    }..  /* Now ro
d570: 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73 20 62 61  ll some pages ba
d580: 63 6b 20 66 72 6f 6d 20 74 68 65 20 74 72 61 6e  ck from the tran
d590: 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e  saction journal.
d5a0: 20 50 61 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65   Pager.stmtJSize
d5b0: 0a 20 20 2a 2a 20 77 61 73 20 74 68 65 20 73 69  .  ** was the si
d5c0: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
d5d0: 6c 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73  l file when this
d5e0: 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73   statement was s
d5f0: 74 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20  tarted, so.  ** 
d600: 65 76 65 72 79 74 68 69 6e 67 20 61 66 74 65 72  everything after
d610: 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
d620: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65  e rolled back, e
d630: 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65 0a 20  ither into the. 
d640: 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68   ** database, th
d650: 65 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2c 20  e memory cache, 
d660: 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20  or both..  **.  
d670: 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  ** If it is not 
d680: 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61 67 65 72  zero, then Pager
d690: 2e 73 74 6d 74 48 64 72 4f 66 66 20 69 73 20 74  .stmtHdrOff is t
d6a0: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
d6b0: 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74   start.  ** of t
d6c0: 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
d6d0: 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20   header written 
d6e0: 64 75 72 69 6e 67 20 74 68 69 73 20 73 74 61 74  during this stat
d6f0: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
d700: 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  n..  */.  rc = s
d710: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
d720: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
d730: 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20  ->stmtJSize);.  
d740: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d750: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
d760: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
d770: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
d780: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67  ournalOff = pPag
d790: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20  er->stmtJSize;. 
d7a0: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
d7b0: 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  it = pPager->stm
d7c0: 74 43 6b 73 75 6d 3b 0a 20 20 77 68 69 6c 65 28  tCksum;.  while(
d7d0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d7e0: 4f 66 66 20 3c 20 68 64 72 4f 66 66 20 29 7b 0a  Off < hdrOff ){.
d7f0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
d800: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
d810: 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
d820: 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 61 73  >jfd, 1);.    as
d830: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
d840: 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28  _DONE );.    if(
d850: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d860: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
d870: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
d880: 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a  while( pPager->j
d890: 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 20  ournalOff < szJ 
d8a0: 29 7b 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63  ){.    u32 nJRec
d8b0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
d8c0: 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52  ber of Journal R
d8d0: 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33  ecords */.    u3
d8e0: 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20  2 dummy;.    rc 
d8f0: 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
d900: 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e  (pPager, szJ, &n
d910: 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  JRec, &dummy);. 
d920: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
d930: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
d940: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
d950: 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 67  _DONE );.      g
d960: 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
d970: 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  yback;.    }.   
d980: 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 29 7b   if( nJRec==0 ){
d990: 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28  .      nJRec = (
d9a0: 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
d9b0: 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70 50 61  urnalOff) / (pPa
d9c0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29  ger->pageSize+8)
d9d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
d9e0: 69 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d 30 20  i=nJRec-1; i>=0 
d9f0: 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
da00: 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d  alOff < szJ; i--
da10: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
da20: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
da30: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  _page(pPager, pP
da40: 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20  ager->jfd, 1);. 
da50: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
da60: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
da70: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
da80: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
da90: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
daa0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
dab0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
dac0: 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f  f = szJ;.  .end_
dad0: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  stmt_playback:. 
dae0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
daf0: 4f 4b 29 20 7b 0a 20 20 20 20 70 50 61 67 65 72  OK) {.    pPager
db00: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
db10: 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72  zJ;.    /* pager
db20: 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50  _reload_cache(pP
db30: 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20  ager); */.  }.  
db40: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
db50: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d  .** Change the m
db60: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
db70: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
db80: 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65   that are allowe
db90: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
dba0: 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
dbb0: 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
dbc0: 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
dbd0: 20 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20    if( mxPage>10 
dbe0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
dbf0: 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a  xPage = mxPage;.
dc00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
dc10: 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30  ger->mxPage = 10
dc20: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
dc30: 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74  djust the robust
dc40: 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61  ness of the data
dc50: 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64  base to damage d
dc60: 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
dc70: 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69  .** or power fai
dc80: 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e  lures by changin
dc90: 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  g the number of 
dca0: 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72  syncs()s when wr
dcb0: 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c  iting.** the rol
dcc0: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20  lback journal.  
dcd0: 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
dce0: 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  levels:.**.**   
dcf0: 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74   OFF       sqlit
dd00: 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65  e3OsSync() is ne
dd10: 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69  ver called.  Thi
dd20: 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  s is the default
dd30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
dd40: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61   for temporary a
dd50: 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c  nd transient fil
dd60: 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52  es..**.**    NOR
dd70: 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  MAL    The journ
dd80: 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63  al is synced onc
dd90: 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
dda0: 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
ddb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
ddc0: 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20  abase.  This is 
ddd0: 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74  normally adequat
dde0: 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75  e protection, bu
ddf0: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
de00: 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69    it is theoreti
de10: 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20  cally possible, 
de20: 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69  though very unli
de30: 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20  kely,.**        
de40: 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e        that an in
de50: 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66  opertune power f
de60: 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
de70: 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  ve the journal.*
de80: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
de90: 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20  n a state which 
dea0: 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61  would cause dama
deb0: 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
dec0: 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  se.**           
ded0: 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f     when it is ro
dee0: 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
def0: 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68      FULL      Th
df00: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
df10: 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65  ced twice before
df20: 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
df30: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
df40: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77       database (w
df50: 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f  ith some additio
df60: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
df70: 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  - the nRec field
df80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
df90: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
dfa0: 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77  header - being w
dfb0: 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65  ritten in betwee
dfc0: 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20  n the two.**    
dfd0: 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29            syncs)
dfe0: 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20  .  If we assume 
dff0: 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a  that writing a.*
e000: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
e010: 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
e020: 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65  r is atomic, the
e030: 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76  n this mode prov
e040: 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ides.**         
e050: 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74       assurance t
e060: 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
e070: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72  will not be corr
e080: 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  upted to the.** 
e090: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69               poi
e0a0: 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61  nt of causing da
e0b0: 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
e0c0: 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  base during roll
e0d0: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65  back..**.** Nume
e0e0: 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63  ric values assoc
e0f0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65  iated with these
e100: 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d   states are OFF=
e110: 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a  =1, NORMAL=2,.**
e120: 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a   and FULL=3..*/.
e130: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e140: 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
e150: 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  S.void sqlite3Pa
e160: 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65  gerSetSafetyLeve
e170: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
e180: 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20   int level, int 
e190: 66 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20 20 70  full_fsync){.  p
e1a0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
e1b0: 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61   level==1 || pPa
e1c0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
e1d0: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
e1e0: 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20  c = level==3 && 
e1f0: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
e200: 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  e;.  pPager->ful
e210: 6c 5f 66 73 79 6e 63 20 3d 20 66 75 6c 6c 5f 66  l_fsync = full_f
e220: 73 79 6e 63 3b 0a 20 20 69 66 28 20 70 50 61 67  sync;.  if( pPag
e230: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61  er->noSync ) pPa
e240: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
e250: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
e260: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
e270: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
e280: 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
e290: 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62  whenever the lib
e2a0: 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73  rary.** attempts
e2b0: 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
e2c0: 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73  rary file.  This
e2d0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
e2e0: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
e2f0: 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
e300: 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64   only.  .*/.#ifd
e310: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
e320: 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  nt sqlite3_opent
e330: 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  emp_count = 0;.#
e340: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  endif../*.** Ope
e350: 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
e360: 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  le. .**.** Write
e370: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
e380: 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20  ptor into *fd.  
e390: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
e3a0: 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 73   on success or s
e3b0: 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72  ome.** other err
e3c0: 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61  or code if we fa
e3d0: 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 53  il..**.** The OS
e3e0: 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61   will automatica
e3f0: 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20 74  lly delete the t
e400: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68  emporary file wh
e410: 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63 6c 6f 73  en it is.** clos
e420: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
e430: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  t sqlite3PagerOp
e440: 65 6e 74 65 6d 70 28 4f 73 46 69 6c 65 20 2a 2a  entemp(OsFile **
e450: 70 46 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20  pFd){.  int cnt 
e460: 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 8;.  int rc;. 
e470: 20 63 68 61 72 20 7a 46 69 6c 65 5b 53 51 4c 49   char zFile[SQLI
e480: 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45  TE_TEMPNAME_SIZE
e490: 5d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ];..#ifdef SQLIT
e4a0: 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33  E_TEST.  sqlite3
e4b0: 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b  _opentemp_count+
e4c0: 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20  +;  /* Used for 
e4d0: 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
e4e0: 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e  ysis only */.#en
e4f0: 64 69 66 0a 20 20 64 6f 7b 0a 20 20 20 20 63 6e  dif.  do{.    cn
e500: 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t--;.    sqlite3
e510: 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a  OsTempFileName(z
e520: 46 69 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  File);.    rc = 
e530: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
e540: 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c 20 70 46  lusive(zFile, pF
e550: 64 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72  d, 1);.    asser
e560: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
e570: 20 7c 7c 20 2a 70 46 64 20 29 3b 0a 20 20 7d 77   || *pFd );.  }w
e580: 68 69 6c 65 28 20 63 6e 74 3e 30 20 26 26 20 72  hile( cnt>0 && r
e590: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
e5a0: 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc!=SQLITE_NOMEM
e5b0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
e5c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
e5d0: 20 61 20 6e 65 77 20 70 61 67 65 20 63 61 63 68   a new page cach
e5e0: 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e  e and put a poin
e5f0: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
e600: 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65  cache in *ppPage
e610: 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74  r..** The file t
e620: 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65 65 64  o be cached need
e630: 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65   not exist.  The
e640: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63   file is not loc
e650: 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65  ked until.** the
e660: 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73   first call to s
e670: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
e680: 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c   and is only hel
e690: 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65  d open until the
e6a0: 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73  .** last page is
e6b0: 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20   released using 
e6c0: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
e6d0: 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  f()..**.** If zF
e6e0: 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
e6f0: 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
e700: 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
e710: 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
e720: 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
e730: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
e740: 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20  ched.  The file 
e750: 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a  will be deleted.
e760: 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
e770: 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
e780: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ed..**.** If zFi
e790: 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
e7a0: 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e  ry:" then all in
e7b0: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c  formation is hel
e7c0: 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49  d in cache..** I
e7d0: 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
e7e0: 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54 68 69  en to disk.  Thi
e7f0: 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  s can be used to
e800: 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a   implement an.**
e810: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
e820: 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
e830: 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20  te3PagerOpen(.  
e840: 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c  Pager **ppPager,
e850: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
e860: 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72  rn the Pager str
e870: 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
e880: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
e890: 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d  lename,   /* Nam
e8a0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
e8b0: 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  e file to open *
e8c0: 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  /.  int nExtra, 
e8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e8e0: 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65  Extra bytes appe
e8f0: 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  nd to each in-me
e900: 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
e910: 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
e920: 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73          /* flags
e930: 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69   controlling thi
e940: 73 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50  s file */.){.  P
e950: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30  ager *pPager = 0
e960: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50  ;.  char *zFullP
e970: 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69  athname = 0;.  i
e980: 6e 74 20 6e 61 6d 65 4c 65 6e 3b 20 20 2f 2a 20  nt nameLen;  /* 
e990: 43 6f 6d 70 69 6c 65 72 20 69 73 20 77 72 6f 6e  Compiler is wron
e9a0: 67 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61 79  g. This is alway
e9b0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 65  s initialized be
e9c0: 66 6f 72 65 20 75 73 65 20 2a 2f 0a 20 20 4f 73  fore use */.  Os
e9d0: 46 69 6c 65 20 2a 66 64 20 3d 20 30 3b 0a 20 20  File *fd = 0;.  
e9e0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
e9f0: 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  OK;.  int i;.  i
ea00: 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b  nt tempFile = 0;
ea10: 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30  .  int memDb = 0
ea20: 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79  ;.  int readOnly
ea30: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a   = 0;.  int useJ
ea40: 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20  ournal = (flags 
ea50: 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55  & PAGER_OMIT_JOU
ea60: 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20  RNAL)==0;.  int 
ea70: 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c  noReadlock = (fl
ea80: 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52  ags & PAGER_NO_R
ea90: 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20 63  EADLOCK)!=0;.  c
eaa0: 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45  har zTemp[SQLITE
eab0: 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b  _TEMPNAME_SIZE];
eac0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
ead0: 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
eae0: 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41 20 6d  AGEMENT.  /* A m
eaf0: 61 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74 20 66  alloc() cannot f
eb00: 61 69 6c 20 69 6e 20 73 71 6c 69 74 65 33 54 68  ail in sqlite3Th
eb10: 72 65 61 64 44 61 74 61 28 29 20 61 73 20 6f 6e  readData() as on
eb20: 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20  e or more calls 
eb30: 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28  to .  ** malloc(
eb40: 29 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  ) must have alre
eb50: 61 64 79 20 62 65 65 6e 20 6d 61 64 65 20 62 79  ady been made by
eb60: 20 74 68 69 73 20 74 68 72 65 61 64 20 62 65 66   this thread bef
eb70: 6f 72 65 20 69 74 20 67 65 74 73 0a 20 20 2a 2a  ore it gets.  **
eb80: 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2e 20   to this point. 
eb90: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 54  This means the T
eba0: 68 72 65 61 64 44 61 74 61 20 6d 75 73 74 20 68  hreadData must h
ebb0: 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ave been allocat
ebc0: 65 64 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ed already.  ** 
ebd0: 73 6f 20 74 68 61 74 20 54 68 72 65 61 64 44 61  so that ThreadDa
ebe0: 74 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20 62 65  ta.nAlloc can be
ebf0: 20 73 65 74 2e 20 49 74 20 77 6f 75 6c 64 20 62   set. It would b
ec00: 65 20 6e 69 63 65 20 74 6f 20 61 73 73 65 72 74  e nice to assert
ec10: 0a 20 20 2a 2a 20 74 68 61 74 20 54 68 72 65 61  .  ** that Threa
ec20: 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 69 73 20  dData.nAlloc is 
ec30: 6e 6f 6e 2d 7a 65 72 6f 2c 20 62 75 74 20 61 6c  non-zero, but al
ec40: 61 73 20 74 68 69 73 20 62 72 65 61 6b 73 20 74  as this breaks t
ec50: 65 73 74 20 63 61 73 65 73 20 0a 20 20 2a 2a 20  est cases .  ** 
ec60: 77 72 69 74 74 65 6e 20 74 6f 20 69 6e 76 6f 6b  written to invok
ec70: 65 20 74 68 65 20 70 61 67 65 72 20 64 69 72 65  e the pager dire
ec80: 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 54 68 72  ctly..  */.  Thr
ec90: 65 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20  eadData *pTsd = 
eca0: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
ecb0: 61 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  a();.  assert( p
ecc0: 54 73 64 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Tsd );.#endif.. 
ecd0: 20 2f 2a 20 57 65 20 75 73 65 64 20 74 6f 20 74   /* We used to t
ece0: 65 73 74 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20  est if malloc() 
ecf0: 68 61 64 20 61 6c 72 65 61 64 79 20 66 61 69 6c  had already fail
ed00: 65 64 20 62 65 66 6f 72 65 20 70 72 6f 63 65 65  ed before procee
ed10: 64 69 6e 67 2e 20 0a 20 20 2a 2a 20 42 75 74 20  ding. .  ** But 
ed20: 74 68 65 20 77 61 79 20 74 68 69 73 20 66 75 6e  the way this fun
ed30: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 69 6e  ction is used in
ed40: 20 53 51 4c 69 74 65 20 6d 65 61 6e 73 20 74 68   SQLite means th
ed50: 61 74 20 63 61 6e 20 6e 65 76 65 72 0a 20 20 2a  at can never.  *
ed60: 2a 20 68 61 70 70 65 6e 2e 20 46 75 72 74 68 65  * happen. Furthe
ed70: 72 6d 6f 72 65 2c 20 69 66 20 74 68 65 20 6d 61  rmore, if the ma
ed80: 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61 67  lloc-failed flag
ed90: 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74 2c   is already set,
eda0: 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 74 68   .  ** either th
edb0: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
edc0: 53 74 72 44 75 70 28 29 20 6f 72 20 73 71 6c 69  StrDup() or sqli
edd0: 74 65 4d 61 6c 6c 6f 63 28 29 20 62 65 6c 6f 77  teMalloc() below
ede0: 20 77 69 6c 6c 0a 20 20 2a 2a 20 66 61 69 6c 20   will.  ** fail 
edf0: 73 68 6f 72 74 6c 79 20 61 6e 64 20 53 51 4c 49  shortly and SQLI
ee00: 54 45 5f 4e 4f 4d 45 4d 20 72 65 74 75 72 6e 65  TE_NOMEM returne
ee10: 64 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2f 0a 20  d anyway..  */. 
ee20: 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a   *ppPager = 0;..
ee30: 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61    /* Open the pa
ee40: 67 65 72 20 66 69 6c 65 20 61 6e 64 20 73 65 74  ger file and set
ee50: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 74   zFullPathname t
ee60: 6f 20 70 6f 69 6e 74 20 61 74 20 6d 61 6c 6c 6f  o point at mallo
ee70: 63 28 29 65 64 20 0a 20 20 2a 2a 20 6d 65 6d 6f  c()ed .  ** memo
ee80: 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ry containing th
ee90: 65 20 63 6f 6d 70 6c 65 74 65 20 66 69 6c 65 6e  e complete filen
eea0: 61 6d 65 20 28 69 2e 65 2e 20 69 6e 63 6c 75 64  ame (i.e. includ
eeb0: 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f 72  ing the director
eec0: 79 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  y)..  */.  if( z
eed0: 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
eee0: 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23 69 66 6e  ename[0] ){.#ifn
eef0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ef00: 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28  MEMORYDB.    if(
ef10: 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d   strcmp(zFilenam
ef20: 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30  e,":memory:")==0
ef30: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20   ){.      memDb 
ef40: 3d 20 31 3b 0a 20 20 20 20 20 20 7a 46 75 6c 6c  = 1;.      zFull
ef50: 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
ef60: 65 53 74 72 44 75 70 28 22 22 29 3b 0a 20 20 20  eStrDup("");.   
ef70: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
ef80: 20 20 7b 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50    {.      zFullP
ef90: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
efa0: 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
efb0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
efc0: 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e    if( zFullPathn
efd0: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ame ){.        r
efe0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
eff0: 6e 52 65 61 64 57 72 69 74 65 28 7a 46 75 6c 6c  nReadWrite(zFull
f000: 50 61 74 68 6e 61 6d 65 2c 20 26 66 64 2c 20 26  Pathname, &fd, &
f010: 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20 20 20  readOnly);.     
f020: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
f030: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 66 64 20 29  QLITE_OK || fd )
f040: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
f050: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
f060: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
f070: 65 6e 74 65 6d 70 28 26 66 64 29 3b 0a 20 20 20  entemp(&fd);.   
f080: 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69   sqlite3OsTempFi
f090: 6c 65 4e 61 6d 65 28 7a 54 65 6d 70 29 3b 0a 20  leName(zTemp);. 
f0a0: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a     zFilename = z
f0b0: 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75 6c 6c 50  Temp;.    zFullP
f0c0: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
f0d0: 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
f0e0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
f0f0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
f100: 4b 20 29 7b 0a 20 20 20 20 20 20 74 65 6d 70 46  K ){.      tempF
f110: 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ile = 1;.    }. 
f120: 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
f130: 65 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  e the Pager stru
f140: 63 74 75 72 65 2e 20 41 73 20 70 61 72 74 20 6f  cture. As part o
f150: 66 20 74 68 65 20 73 61 6d 65 20 61 6c 6c 6f 63  f the same alloc
f160: 61 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74 65 0a  ation, allocate.
f170: 20 20 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74    ** space for t
f180: 68 65 20 66 75 6c 6c 20 70 61 74 68 73 20 6f 66  he full paths of
f190: 20 74 68 65 20 66 69 6c 65 2c 20 64 69 72 65 63   the file, direc
f1a0: 74 6f 72 79 20 61 6e 64 20 6a 6f 75 72 6e 61 6c  tory and journal
f1b0: 20 0a 20 20 2a 2a 20 28 50 61 67 65 72 2e 7a 46   .  ** (Pager.zF
f1c0: 69 6c 65 6e 61 6d 65 2c 20 50 61 67 65 72 2e 7a  ilename, Pager.z
f1d0: 44 69 72 65 63 74 6f 72 79 20 61 6e 64 20 50 61  Directory and Pa
f1e0: 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 29 2e 0a 20  ger.zJournal).. 
f1f0: 20 2a 2f 0a 20 20 69 66 28 20 7a 46 75 6c 6c 50   */.  if( zFullP
f200: 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 6e  athname ){.    n
f210: 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  ameLen = strlen(
f220: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
f230: 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c      pPager = sql
f240: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
f250: 66 28 2a 70 50 61 67 65 72 29 20 2b 20 6e 61 6d  f(*pPager) + nam
f260: 65 4c 65 6e 2a 33 20 2b 20 33 30 20 29 3b 0a 20  eLen*3 + 30 );. 
f270: 20 20 20 69 66 28 20 70 50 61 67 65 72 20 26 26     if( pPager &&
f280: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
f290: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
f2a0: 70 54 6d 70 53 70 61 63 65 20 3d 20 28 63 68 61  pTmpSpace = (cha
f2b0: 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  r *)sqliteMalloc
f2c0: 52 61 77 28 53 51 4c 49 54 45 5f 44 45 46 41 55  Raw(SQLITE_DEFAU
f2d0: 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  LT_PAGE_SIZE);. 
f2e0: 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20     }.  }...  /* 
f2f0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
f300: 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66  red in either of
f310: 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76   the blocks abov
f320: 65 2c 20 66 72 65 65 20 74 68 65 20 6d 65 6d 6f  e, free the memo
f330: 72 79 20 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 64  ry .  ** pointed
f340: 20 74 6f 20 62 79 20 7a 46 75 6c 6c 50 61 74 68   to by zFullPath
f350: 6e 61 6d 65 2c 20 66 72 65 65 20 74 68 65 20 50  name, free the P
f360: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
f370: 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 0a 20 20  nd close the .  
f380: 2a 2a 20 66 69 6c 65 2e 20 53 69 6e 63 65 20 74  ** file. Since t
f390: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
f3a0: 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 72 65 20  allocated there 
f3b0: 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65  is no need to se
f3c0: 74 20 0a 20 20 2a 2a 20 61 6e 79 20 50 61 67 65  t .  ** any Page
f3d0: 72 2e 65 72 72 4d 61 73 6b 20 76 61 72 69 61 62  r.errMask variab
f3e0: 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  les..  */.  if( 
f3f0: 21 70 50 61 67 65 72 20 7c 7c 20 21 7a 46 75 6c  !pPager || !zFul
f400: 6c 50 61 74 68 6e 61 6d 65 20 7c 7c 20 21 70 50  lPathname || !pP
f410: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
f420: 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  || rc!=SQLITE_OK
f430: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
f440: 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20  sClose(&fd);.   
f450: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c   sqliteFree(zFul
f460: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
f470: 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
f480: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28  r);.    return (
f490: 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f  (rc==SQLITE_OK)?
f4a0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29  SQLITE_NOMEM:rc)
f4b0: 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
f4c0: 41 43 45 33 28 22 4f 50 45 4e 20 25 64 20 25 73  ACE3("OPEN %d %s
f4d0: 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49  \n", FILEHANDLEI
f4e0: 44 28 66 64 29 2c 20 7a 46 75 6c 6c 50 61 74 68  D(fd), zFullPath
f4f0: 6e 61 6d 65 29 3b 0a 20 20 49 4f 54 52 41 43 45  name);.  IOTRACE
f500: 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22  (("OPEN %p %s\n"
f510: 2c 20 70 50 61 67 65 72 2c 20 7a 46 75 6c 6c 50  , pPager, zFullP
f520: 61 74 68 6e 61 6d 65 29 29 0a 20 20 70 50 61 67  athname)).  pPag
f530: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  er->zFilename = 
f540: 28 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b 31  (char*)&pPager[1
f550: 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69  ];.  pPager->zDi
f560: 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65  rectory = &pPage
f570: 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d  r->zFilename[nam
f580: 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50 61 67 65  eLen+1];.  pPage
f590: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70  r->zJournal = &p
f5a0: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
f5b0: 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20  y[nameLen+1];.  
f5c0: 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  strcpy(pPager->z
f5d0: 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Filename, zFullP
f5e0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63  athname);.  strc
f5f0: 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  py(pPager->zDire
f600: 63 74 6f 72 79 2c 20 7a 46 75 6c 6c 50 61 74 68  ctory, zFullPath
f610: 6e 61 6d 65 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  name);..  for(i=
f620: 6e 61 6d 65 4c 65 6e 3b 20 69 3e 30 20 26 26 20  nameLen; i>0 && 
f630: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
f640: 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d  ry[i-1]!='/'; i-
f650: 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20 29  -){}.  if( i>0 )
f660: 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
f670: 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20 20  ory[i-1] = 0;.  
f680: 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  strcpy(pPager->z
f690: 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61  Journal, zFullPa
f6a0: 74 68 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  thname);.  sqlit
f6b0: 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  eFree(zFullPathn
f6c0: 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28 26  ame);.  strcpy(&
f6d0: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
f6e0: 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75  [nameLen], "-jou
f6f0: 72 6e 61 6c 22 29 3b 0a 20 20 70 50 61 67 65 72  rnal");.  pPager
f700: 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 2f 2a 20  ->fd = fd;.  /* 
f710: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
f720: 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  pen = 0; */.  pP
f730: 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
f740: 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26   = useJournal &&
f750: 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65   !memDb;.  pPage
f760: 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20  r->noReadlock = 
f770: 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65  noReadlock && re
f780: 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61  adOnly;.  /* pPa
f790: 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
f7a0: 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
f7b0: 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
f7c0: 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
f7d0: 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20  ->nRef = 0; */. 
f7e0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
f7f0: 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61  = memDb-1;.  pPa
f800: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
f810: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
f820: 41 47 45 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20 70  AGE_SIZE;.  /* p
f830: 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
f840: 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
f850: 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
f860: 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
f870: 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a  er->nPage = 0; *
f880: 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
f890: 4d 61 78 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a  MaxPage = 0; */.
f8a0: 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
f8b0: 20 3d 20 31 30 30 3b 0a 20 20 61 73 73 65 72 74   = 100;.  assert
f8c0: 28 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3d 3d  ( PAGER_UNLOCK==
f8d0: 30 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  0 );.  /* pPager
f8e0: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
f8f0: 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20  UNLOCK; */.  /* 
f900: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
f910: 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
f920: 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d  ->tempFile = tem
f930: 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28  pFile;.  assert(
f940: 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52   tempFile==PAGER
f950: 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
f960: 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c  MAL .          |
f970: 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  | tempFile==PAGE
f980: 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
f990: 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73  CLUSIVE );.  ass
f9a0: 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
f9b0: 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
f9c0: 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ==1 );.  pPager-
f9d0: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
f9e0: 20 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50   tempFile; .  pP
f9f0: 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65  ager->memDb = me
fa00: 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72  mDb;.  pPager->r
fa10: 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e  eadOnly = readOn
fa20: 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  ly;.  /* pPager-
fa30: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a  >needSync = 0; *
fa40: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  /.  pPager->noSy
fa50: 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  nc = pPager->tem
fa60: 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75  pFile || !useJou
fa70: 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e  rnal;.  pPager->
fa80: 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61 67  fullSync = (pPag
fa90: 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b  er->noSync?0:1);
faa0: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46  .  /* pPager->pF
fab0: 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  irst = 0; */.  /
fac0: 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
fad0: 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20  Synced = 0; */. 
fae0: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73   /* pPager->pLas
faf0: 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  t = 0; */.  pPag
fb00: 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 46 4f 52  er->nExtra = FOR
fb10: 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45 78  CE_ALIGNMENT(nEx
fb20: 74 72 61 29 3b 0a 20 20 61 73 73 65 72 74 28 66  tra);.  assert(f
fb30: 64 7c 7c 6d 65 6d 44 62 29 3b 0a 20 20 69 66 28  d||memDb);.  if(
fb40: 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70   !memDb ){.    p
fb50: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
fb60: 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63  e = sqlite3OsSec
fb70: 74 6f 72 53 69 7a 65 28 66 64 29 3b 0a 20 20 7d  torSize(fd);.  }
fb80: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42  .  /* pPager->pB
fb90: 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20  usyHandler = 0; 
fba0: 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70  */.  /* memset(p
fbb0: 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c  Pager->aHash, 0,
fbc0: 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
fbd0: 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2a 70  aHash)); */.  *p
fbe0: 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
fbf0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
fc00: 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
fc10: 41 47 45 4d 45 4e 54 0a 20 20 70 50 61 67 65 72  AGEMENT.  pPager
fc20: 2d 3e 70 4e 65 78 74 20 3d 20 70 54 73 64 2d 3e  ->pNext = pTsd->
fc30: 70 50 61 67 65 72 3b 0a 20 20 70 54 73 64 2d 3e  pPager;.  pTsd->
fc40: 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
fc50: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
fc60: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
fc70: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73  *.** Set the bus
fc80: 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y handler functi
fc90: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
fca0: 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
fcb0: 61 6e 64 6c 65 72 28 50 61 67 65 72 20 2a 70 50  andler(Pager *pP
fcc0: 61 67 65 72 2c 20 42 75 73 79 48 61 6e 64 6c 65  ager, BusyHandle
fcd0: 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 29  r *pBusyHandler)
fce0: 7b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73  {.  pPager->pBus
fcf0: 79 48 61 6e 64 6c 65 72 20 3d 20 70 42 75 73 79  yHandler = pBusy
fd00: 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  Handler;.}../*.*
fd10: 2a 20 53 65 74 20 74 68 65 20 64 65 73 74 72 75  * Set the destru
fd20: 63 74 6f 72 20 66 6f 72 20 74 68 69 73 20 70 61  ctor for this pa
fd30: 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c  ger.  If not NUL
fd40: 4c 2c 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  L, the destructo
fd50: 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77  r is called.** w
fd60: 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63  hen the referenc
fd70: 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68 20  e count on each 
fd80: 70 61 67 65 20 72 65 61 63 68 65 73 20 7a 65 72  page reaches zer
fd90: 6f 2e 20 20 54 68 65 20 64 65 73 74 72 75 63 74  o.  The destruct
fda0: 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65  or can.** be use
fdb0: 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 69 6e  d to clean up in
fdc0: 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65  formation in the
fdd0: 20 65 78 74 72 61 20 73 65 67 6d 65 6e 74 20 61   extra segment a
fde0: 70 70 65 6e 64 65 64 20 74 6f 20 65 61 63 68 20  ppended to each 
fdf0: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
fe00: 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 6e 6f  destructor is no
fe10: 74 20 63 61 6c 6c 65 64 20 61 73 20 61 20 72 65  t called as a re
fe20: 73 75 6c 74 20 73 71 6c 69 74 65 33 50 61 67 65  sult sqlite3Page
fe30: 72 43 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44  rClose().  .** D
fe40: 65 73 74 72 75 63 74 6f 72 73 20 61 72 65 20 6f  estructors are o
fe50: 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71  nly called by sq
fe60: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
fe70: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
fe80: 65 33 50 61 67 65 72 53 65 74 44 65 73 74 72 75  e3PagerSetDestru
fe90: 63 74 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67  ctor(Pager *pPag
fea0: 65 72 2c 20 76 6f 69 64 20 28 2a 78 44 65 73 63  er, void (*xDesc
feb0: 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 29 7b  )(DbPage*,int)){
fec0: 0a 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74  .  pPager->xDest
fed0: 72 75 63 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a  ructor = xDesc;.
fee0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
fef0: 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66   reinitializer f
ff00: 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20  or this pager.  
ff10: 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  If not NULL, the
ff20: 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a   reinitializer.*
ff30: 2a 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  * is called when
ff40: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
ff50: 61 20 70 61 67 65 20 69 6e 20 63 61 63 68 65 20  a page in cache 
ff60: 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  is restored to i
ff70: 74 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76  ts original.** v
ff80: 61 6c 75 65 20 61 73 20 61 20 72 65 73 75 6c 74  alue as a result
ff90: 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20   of a rollback. 
ffa0: 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 67 69   The callback gi
ffb0: 76 65 73 20 68 69 67 68 65 72 2d 6c 65 76 65 6c  ves higher-level
ffc0: 20 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f   code.** an oppo
ffd0: 72 74 75 6e 69 74 79 20 74 6f 20 72 65 73 74 6f  rtunity to resto
ffe0: 72 65 20 74 68 65 20 45 58 54 52 41 20 73 65 63  re the EXTRA sec
fff0: 74 69 6f 6e 20 74 6f 20 61 67 72 65 65 20 77 69  tion to agree wi
10000 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 0a  th the restored.
10010 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f  ** page data..*/
10020 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
10030 65 72 53 65 74 52 65 69 6e 69 74 65 72 28 50 61  erSetReiniter(Pa
10040 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69  ger *pPager, voi
10050 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50  d (*xReinit)(DbP
10060 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50  age*,int)){.  pP
10070 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
10080 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a  = xReinit;.}../*
10090 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 61 67 65  .** Set the page
100a0 20 73 69 7a 65 2e 20 20 52 65 74 75 72 6e 20 74   size.  Return t
100b0 68 65 20 6e 65 77 20 73 69 7a 65 2e 20 20 49 66  he new size.  If
100c0 20 74 68 65 20 73 75 67 67 65 73 74 20 6e 65 77   the suggest new
100d0 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 69 73   page.** size is
100e0 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 2c 20   inappropriate, 
100f0 74 68 65 6e 20 61 6e 20 61 6c 74 65 72 6e 61 74  then an alternat
10100 69 76 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  ive page size is
10110 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61 6e 64   selected.** and
10120 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
10130 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  t sqlite3PagerSe
10140 74 50 61 67 65 73 69 7a 65 28 50 61 67 65 72 20  tPagesize(Pager 
10150 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 70 61 67  *pPager, int pag
10160 65 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74  eSize){.  assert
10170 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ( pageSize>=512 
10180 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
10190 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
101a0 45 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  E );.  if( !pPag
101b0 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70 50 61  er->memDb && pPa
101c0 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ger->nRef==0 ){.
101d0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
101e0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61  pPager);.    pPa
101f0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
10200 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 50  pageSize;.    pP
10210 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
10220 3d 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  = sqlite3Realloc
10230 4f 72 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  OrFree(pPager->p
10240 54 6d 70 53 70 61 63 65 2c 20 70 61 67 65 53 69  TmpSpace, pageSi
10250 7a 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ze);.  }.  retur
10260 6e 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  n pPager->pageSi
10270 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ze;.}../*.** The
10280 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f   following set o
10290 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  f routines are u
102a0 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  sed to disable t
102b0 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20  he simulated.** 
102c0 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e  I/O error mechan
102d0 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74  ism.  These rout
102e0 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
102f0 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64   avoid simulated
10300 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c  .** errors in pl
10310 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f  aces where we do
10320 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
10330 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e  errors..**.** Un
10340 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45  less -DSQLITE_TE
10350 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68  ST=1 is used, th
10360 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
10370 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61   all no-ops.** a
10380 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63  nd generate no c
10390 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ode..*/.#ifdef S
103a0 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72  QLITE_TEST.exter
103b0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
103c0 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
103d0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
103e0 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b  e3_io_error_hit;
103f0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
10400 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61  d_cnt;.void disa
10410 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
10420 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
10430 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c   saved_cnt = sql
10440 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
10450 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33  nding;.  sqlite3
10460 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
10470 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65  g = -1;.}.void e
10480 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
10490 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
104a0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
104b0 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61  ror_pending = sa
104c0 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65  ved_cnt;.}.#else
104d0 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c  .# define disabl
104e0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
104f0 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65  rrors().# define
10500 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
10510 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65  d_io_errors().#e
10520 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
10530 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74   the first N byt
10540 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  es from the begi
10550 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c  nning of the fil
10560 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a  e into memory.**
10570 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e   that pDest poin
10580 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f  ts to. .**.** No
10590 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20   error checking 
105a0 69 73 20 64 6f 6e 65 2e 20 54 68 65 20 72 61 74  is done. The rat
105b0 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69 73 20 69  ional for this i
105c0 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63  s that this func
105d0 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20  tion .** may be 
105e0 63 61 6c 6c 65 64 20 65 76 65 6e 20 69 66 20 74  called even if t
105f0 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
10600 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61 69   exist or contai
10610 6e 20 61 20 68 65 61 64 65 72 2e 20 49 6e 20 0a  n a header. In .
10620 2a 2a 20 74 68 65 73 65 20 63 61 73 65 73 20 73  ** these cases s
10630 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20 77  qlite3OsRead() w
10640 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  ill return an er
10650 72 6f 72 2c 20 74 6f 20 77 68 69 63 68 20 74 68  ror, to which th
10660 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a 20 72 65  e correct .** re
10670 73 70 6f 6e 73 65 20 69 73 20 74 6f 20 7a 65 72  sponse is to zer
10680 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 74 20  o the memory at 
10690 70 44 65 73 74 20 61 6e 64 20 63 6f 6e 74 69 6e  pDest and contin
106a0 75 65 2e 20 20 41 20 72 65 61 6c 20 49 4f 20 65  ue.  A real IO e
106b0 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20 70 72  rror .** will pr
106c0 65 73 75 6d 61 62 6c 79 20 72 65 63 75 72 20 61  esumably recur a
106d0 6e 64 20 62 65 20 70 69 63 6b 65 64 20 75 70 20  nd be picked up 
106e0 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20 54 68 69  later (Todo: Thi
106f0 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 29 2e 0a  nk about this)..
10700 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
10710 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
10720 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
10730 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64   int N, unsigned
10740 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20   char *pDest){. 
10750 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
10760 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44  _OK;.  memset(pD
10770 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 69 66  est, 0, N);.  if
10780 28 20 4d 45 4d 44 42 3d 3d 30 20 29 7b 0a 20 20  ( MEMDB==0 ){.  
10790 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
107a0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
107b0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65  .    sqlite3OsSe
107c0 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  ek(pPager->fd, 0
107d0 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69  );.    enable_si
107e0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
107f0 73 28 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45  s();.    IOTRACE
10800 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64  (("DBHDR %p 0 %d
10810 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29  \n", pPager, N))
10820 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
10830 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
10840 66 64 2c 20 70 44 65 73 74 2c 20 4e 29 3b 0a 20  fd, pDest, N);. 
10850 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
10860 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
10870 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  AD ){.      rc =
10880 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
10890 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
108a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
108b0 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  rn the total num
108c0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
108d0 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73  the disk file as
108e0 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
108f0 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20   pPager. .**.** 
10900 49 66 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 42  If the PENDING_B
10910 59 54 45 20 6c 69 65 73 20 6f 6e 20 74 68 65 20  YTE lies on the 
10920 70 61 67 65 20 64 69 72 65 63 74 6c 79 20 61 66  page directly af
10930 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ter the end of t
10940 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e  he.** file, then
10950 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 70   consider this p
10960 61 67 65 20 70 61 72 74 20 6f 66 20 74 68 65 20  age part of the 
10970 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65 78  file too. For ex
10980 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45 4e  ample, if.** PEN
10990 44 49 4e 47 5f 42 59 54 45 20 69 73 20 62 79 74  DING_BYTE is byt
109a0 65 20 34 30 39 36 20 28 74 68 65 20 66 69 72 73  e 4096 (the firs
109b0 74 20 62 79 74 65 20 6f 66 20 70 61 67 65 20 35  t byte of page 5
109c0 29 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  ) and the size o
109d0 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73  f the.** file is
109e0 20 34 30 39 36 20 62 79 74 65 73 2c 20 35 20 69   4096 bytes, 5 i
109f0 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65  s returned inste
10a00 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20  ad of 4..*/.int 
10a10 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
10a20 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
10a30 67 65 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20  ger){.  i64 n;. 
10a40 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
10a50 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
10a60 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
10a70 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74  rCode ){.    ret
10a80 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
10a90 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
10aa0 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50  =0 ){.    n = pP
10ab0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
10ac0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 69 66 28  } else {.    if(
10ad0 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   (rc = sqlite3Os
10ae0 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
10af0 3e 66 64 2c 20 26 6e 29 29 21 3d 53 51 4c 49 54  >fd, &n))!=SQLIT
10b00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61  E_OK ){.      pa
10b10 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
10b20 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74  , rc);.      ret
10b30 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
10b40 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50   if( n>0 && n<pP
10b50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
10b60 7b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20  {.      n = 1;. 
10b70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10b80 6e 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  n /= pPager->pag
10b90 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20  eSize;.    }.   
10ba0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
10bb0 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
10bc0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
10bd0 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20  ->dbSize = n;.  
10be0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d    }.  }.  if( n=
10bf0 3d 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70  =(PENDING_BYTE/p
10c00 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
10c10 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d   ){.    n++;.  }
10c20 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
10c30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10c40 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a  OMIT_MEMORYDB./*
10c50 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69  .** Clear a PgHi
10c60 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73  story block.*/.s
10c70 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72  tatic void clear
10c80 48 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72  History(PgHistor
10c90 79 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c  y *pHist){.  sql
10ca0 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70  iteFree(pHist->p
10cb0 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 46  Orig);.  sqliteF
10cc0 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
10cd0 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69  );.  pHist->pOri
10ce0 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e  g = 0;.  pHist->
10cf0 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c  pStmt = 0;.}.#el
10d00 73 65 0a 23 64 65 66 69 6e 65 20 63 6c 65 61 72  se.#define clear
10d10 48 69 73 74 6f 72 79 28 78 29 0a 23 65 6e 64 69  History(x).#endi
10d20 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64  f../*.** Forward
10d30 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a   declaration.*/.
10d40 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
10d50 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a  ournal(Pager*);.
10d60 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50  ./*.** Unlink pP
10d70 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68  g from it's hash
10d80 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74   chain. Also set
10d90 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
10da0 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74   to 0 to indicat
10db0 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  e.** that the pa
10dc0 67 65 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  ge is not part o
10dd0 66 20 61 6e 79 20 68 61 73 68 20 63 68 61 69 6e  f any hash chain
10de0 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72  . This is requir
10df0 65 64 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a  ed because the.*
10e00 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  * sqlite3PagerMo
10e10 76 65 70 61 67 65 28 29 20 72 6f 75 74 69 6e 65  vepage() routine
10e20 20 63 61 6e 20 6c 65 61 76 65 20 61 20 70 61 67   can leave a pag
10e30 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65  e in the .** pNe
10e40 78 74 46 72 65 65 2f 70 50 72 65 76 46 72 65 65  xtFree/pPrevFree
10e50 20 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e 6f   list that is no
10e60 74 20 61 20 70 61 72 74 20 6f 66 20 61 6e 79 20  t a part of any 
10e70 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73  hash-chain..*/.s
10e80 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e  tatic void unlin
10e90 6b 48 61 73 68 43 68 61 69 6e 28 50 61 67 65 72  kHashChain(Pager
10ea0 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
10eb0 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
10ec0 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  ->pgno==0 ){.   
10ed0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e   assert( pPg->pN
10ee0 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20 70 50  extHash==0 && pP
10ef0 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20  g->pPrevHash==0 
10f00 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
10f10 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e   }.  if( pPg->pN
10f20 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 70  extHash ){.    p
10f30 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
10f40 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e  PrevHash = pPg->
10f50 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20  pPrevHash;.  }. 
10f60 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48   if( pPg->pPrevH
10f70 61 73 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ash ){.    asser
10f80 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  t( pPager->aHash
10f90 5b 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50  [pPg->pgno & (pP
10fa0 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 21  ager->nHash-1)]!
10fb0 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d  =pPg );.    pPg-
10fc0 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78  >pPrevHash->pNex
10fd0 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65  tHash = pPg->pNe
10fe0 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b  xtHash;.  }else{
10ff0 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70 50 67  .    int h = pPg
11000 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72  ->pgno & (pPager
11010 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20  ->nHash-1);.    
11020 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
11030 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73   = pPg->pNextHas
11040 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d  h;.  }.  if( MEM
11050 44 42 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 48  DB ){.    clearH
11060 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f  istory(PGHDR_TO_
11070 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
11080 29 29 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  ));.  }.  pPg->p
11090 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e  gno = 0;.  pPg->
110a0 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d  pNextHash = pPg-
110b0 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a  >pPrevHash = 0;.
110c0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  }../*.** Unlink 
110d0 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
110e0 66 72 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c  free list (the l
110f0 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
11100 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a   where nRef==0).
11110 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20  ** and from its 
11120 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63  hash collision c
11130 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hain..*/.static 
11140 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28  void unlinkPage(
11150 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
11160 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
11170 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f  Pg->pPager;..  /
11180 2a 20 4b 65 65 70 20 74 68 65 20 70 46 69 72 73  * Keep the pFirs
11190 74 53 79 6e 63 65 64 20 70 6f 69 6e 74 65 72 20  tSynced pointer 
111a0 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20  pointing at the 
111b0 66 69 72 73 74 20 73 79 6e 63 68 72 6f 6e 69 7a  first synchroniz
111c0 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28  ed page */.  if(
111d0 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46   pPg==pPager->pF
111e0 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20  irstSynced ){.  
111f0 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67    PgHdr *p = pPg
11200 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
11210 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
11220 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20  needSync ){ p = 
11230 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a  p->pNextFree; }.
11240 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
11250 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20  stSynced = p;.  
11260 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66  }..  /* Unlink f
11270 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74  rom the freelist
11280 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 70   */.  if( pPg->p
11290 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20  PrevFree ){.    
112a0 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e  pPg->pPrevFree->
112b0 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d  pNextFree = pPg-
112c0 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 65  >pNextFree;.  }e
112d0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
112e0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d   pPager->pFirst=
112f0 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67  =pPg );.    pPag
11300 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67  er->pFirst = pPg
11310 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d  ->pNextFree;.  }
11320 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78  .  if( pPg->pNex
11330 74 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67  tFree ){.    pPg
11340 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72  ->pNextFree->pPr
11350 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50  evFree = pPg->pP
11360 72 65 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65  revFree;.  }else
11370 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
11380 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67  ager->pLast==pPg
11390 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
113a0 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72  pLast = pPg->pPr
113b0 65 76 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70 50  evFree;.  }.  pP
113c0 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  g->pNextFree = p
113d0 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  Pg->pPrevFree = 
113e0 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20  0;..  /* Unlink 
113f0 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68 61  from the pgno ha
11400 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 6e  sh table */.  un
11410 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50  linkHashChain(pP
11420 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a 2f  ager, pPg);.}../
11430 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
11440 65 20 69 73 20 75 73 65 64 20 74 6f 20 74 72 75  e is used to tru
11450 6e 63 61 74 65 20 74 68 65 20 63 61 63 68 65 20  ncate the cache 
11460 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 0a  when a database.
11470 2a 2a 20 69 73 20 74 72 75 6e 63 61 74 65 64 2e  ** is truncated.
11480 20 20 44 72 6f 70 20 66 72 6f 6d 20 74 68 65 20    Drop from the 
11490 63 61 63 68 65 20 61 6c 6c 20 70 61 67 65 73 20  cache all pages 
114a0 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 0a 2a 2a  whose pgno is.**
114b0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61   larger than pPa
114c0 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20  ger->dbSize and 
114d0 69 73 20 75 6e 72 65 66 65 72 65 6e 63 65 64 2e  is unreferenced.
114e0 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65  .**.** Reference
114f0 64 20 70 61 67 65 73 20 6c 61 72 67 65 72 20 74  d pages larger t
11500 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69  han pPager->dbSi
11510 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a  ze are zeroed..*
11520 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 61  *.** Actually, a
11530 74 20 74 68 65 20 70 6f 69 6e 74 20 74 68 69 73  t the point this
11540 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
11550 65 64 2c 20 69 74 20 77 6f 75 6c 64 20 62 65 0a  ed, it would be.
11560 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 68  ** an error to h
11570 61 76 65 20 61 20 72 65 66 65 72 65 6e 63 65 64  ave a referenced
11580 20 70 61 67 65 2e 20 20 42 75 74 20 72 61 74 68   page.  But rath
11590 65 72 20 74 68 61 6e 20 64 65 6c 65 74 65 0a 2a  er than delete.*
115a0 2a 20 74 68 61 74 20 70 61 67 65 20 61 6e 64 20  * that page and 
115b0 67 75 61 72 61 6e 74 65 65 20 61 20 73 75 62 73  guarantee a subs
115c0 65 71 75 65 6e 74 20 73 65 67 66 61 75 6c 74 2c  equent segfault,
115d0 20 69 74 20 73 65 65 6d 73 20 62 65 74 74 65 72   it seems better
115e0 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20 69 74 20 61  .** to zero it a
115f0 6e 64 20 68 6f 70 65 20 74 68 61 74 20 77 65 20  nd hope that we 
11600 65 72 72 6f 72 20 6f 75 74 20 73 61 6e 65 6c 79  error out sanely
11610 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11620 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f   pager_truncate_
11630 63 61 63 68 65 28 50 61 67 65 72 20 2a 70 50 61  cache(Pager *pPa
11640 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
11650 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70 70  Pg;.  PgHdr **pp
11660 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a 65  Pg;.  int dbSize
11670 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
11680 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26 70 50  e;..  ppPg = &pP
11690 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68  ager->pAll;.  wh
116a0 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70 70 50  ile( (pPg = *ppP
116b0 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  g)!=0 ){.    if(
116c0 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69   pPg->pgno<=dbSi
116d0 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70 50 67  ze ){.      ppPg
116e0 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c   = &pPg->pNextAl
116f0 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  l;.    }else if(
11700 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a   pPg->nRef>0 ){.
11710 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
11720 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
11730 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
11740 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 70 50  Size);.      ppP
11750 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41  g = &pPg->pNextA
11760 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ll;.    }else{. 
11770 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70 50 67       *ppPg = pPg
11780 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
11790 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67    unlinkPage(pPg
117a0 29 3b 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65  );.      makeCle
117b0 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 20 20 73  an(pPg);.      s
117c0 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a  qliteFree(pPg);.
117d0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50        pPager->nP
117e0 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  age--;.    }.  }
117f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  .}../*.** Try to
11800 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   obtain a lock o
11810 6e 20 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b  n a file.  Invok
11820 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  e the busy callb
11830 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a  ack if the lock.
11840 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
11850 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 20  not available.  
11860 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65  Repeat until the
11870 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72   busy callback r
11880 65 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20  eturns.** false 
11890 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63  or until the loc
118a0 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a  k succeeds..**.*
118b0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
118c0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  OK on success an
118d0 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
118e0 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74  if we cannot obt
118f0 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e  ain.** the lock.
11900 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
11910 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
11920 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
11930 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
11940 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
11950 54 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75  The OS lock valu
11960 65 73 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  es must be the s
11970 61 6d 65 20 61 73 20 74 68 65 20 50 61 67 65 72  ame as the Pager
11980 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a   lock values */.
11990 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
119a0 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c  SHARED==SHARED_L
119b0 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
119c0 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d   PAGER_RESERVED=
119d0 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
119e0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
119f0 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43  R_EXCLUSIVE==EXC
11a00 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a  LUSIVE_LOCK );..
11a10 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
11a20 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e   is currently un
11a30 6c 6f 63 6b 65 64 20 74 68 65 6e 20 74 68 65 20  locked then the 
11a40 73 69 7a 65 20 6d 75 73 74 20 62 65 20 75 6e 6b  size must be unk
11a50 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74  nown */.  assert
11a60 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
11a70 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c  =PAGER_SHARED ||
11a80 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
11a90 30 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 0a 20  0 || MEMDB );.. 
11aa0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
11ab0 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  te>=locktype ){.
11ac0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11ad0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
11ae0 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d   do {.      rc =
11af0 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
11b00 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74  Pager->fd, lockt
11b10 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  ype);.    }while
11b20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
11b30 59 20 26 26 20 73 71 6c 69 74 65 33 49 6e 76 6f  Y && sqlite3Invo
11b40 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50  keBusyHandler(pP
11b50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
11b60 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72  er) );.    if( r
11b70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11b80 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
11b90 61 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ate = locktype;.
11ba0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
11bb0 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70  LOCK %p %d\n", p
11bc0 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29  Pager, locktype)
11bd0 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ).    }.  }.  re
11be0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11bf0 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 66  * Truncate the f
11c00 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ile to the numbe
11c10 72 20 6f 66 20 70 61 67 65 73 20 73 70 65 63 69  r of pages speci
11c20 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  fied..*/.int sql
11c30 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
11c40 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
11c50 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20   Pgno nPage){.  
11c60 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
11c70 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
11c80 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c  =PAGER_SHARED ||
11c90 20 4d 45 4d 44 42 20 29 3b 0a 20 20 73 71 6c 69   MEMDB );.  sqli
11ca0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
11cb0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  t(pPager);.  if(
11cc0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
11cd0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
11ce0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
11cf0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
11d00 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 3d 28 75  .  if( nPage>=(u
11d10 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e  nsigned)pPager->
11d20 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  dbSize ){.    re
11d30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11d40 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20    }.  if( MEMDB 
11d50 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
11d60 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  bSize = nPage;. 
11d70 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74     pager_truncat
11d80 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  e_cache(pPager);
11d90 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11da0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20  TE_OK;.  }.  rc 
11db0 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
11dc0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
11dd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11de0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
11df0 0a 0a 20 20 2f 2a 20 47 65 74 20 61 6e 20 65 78  ..  /* Get an ex
11e00 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20  clusive lock on 
11e10 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
11e20 6f 72 65 20 74 72 75 6e 63 61 74 69 6e 67 2e 20  ore truncating. 
11e30 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  */.  rc = pager_
11e40 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
11e50 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
11e60 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  OCK);.  if( rc!=
11e70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11e80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
11e90 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72  .  rc = pager_tr
11ea0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e  uncate(pPager, n
11eb0 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Page);.  return 
11ec0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75  rc;.}../*.** Shu
11ed0 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63  tdown the page c
11ee0 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20  ache.  Free all 
11ef0 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65  memory and close
11f00 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a   all files..**.*
11f10 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
11f20 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65  on was in progre
11f30 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ss when this rou
11f40 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
11f50 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  that.** transact
11f60 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
11f70 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e  ck.  All outstan
11f80 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
11f90 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e  nvalidated.** an
11fa0 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69  d their memory i
11fb0 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74  s freed.  Any at
11fc0 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70  tempt to use a p
11fd0 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  age associated.*
11fe0 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  * with this page
11ff0 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
12000 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
12010 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  ns will likely.*
12020 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  * result in a co
12030 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  redump..**.** Th
12040 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
12050 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20  ys succeeds. If 
12060 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
12070 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d   active an attem
12080 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f  pt.** is made to
12090 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49   roll it back. I
120a0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
120b0 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
120c0 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20  lback .** a hot 
120d0 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c  journal may be l
120e0 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73  eft in the files
120f0 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72  ystem but no err
12100 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  or is returned.*
12110 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  * to the caller.
12120 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
12130 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20  agerClose(Pager 
12140 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 64 65 66  *pPager){.#ifdef
12150 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
12160 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
12170 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29  .  /* A malloc()
12180 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69 6e 20   cannot fail in 
12190 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
121a0 61 28 29 20 61 73 20 6f 6e 65 20 6f 72 20 6d 6f  a() as one or mo
121b0 72 65 20 63 61 6c 6c 73 20 74 6f 20 0a 20 20 2a  re calls to .  *
121c0 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d 75 73 74 20  * malloc() must 
121d0 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
121e0 6e 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 74  n made by this t
121f0 68 72 65 61 64 20 62 65 66 6f 72 65 20 69 74 20  hread before it 
12200 67 65 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 69  gets.  ** to thi
12210 73 20 70 6f 69 6e 74 2e 20 54 68 69 73 20 6d 65  s point. This me
12220 61 6e 73 20 74 68 65 20 54 68 72 65 61 64 44 61  ans the ThreadDa
12230 74 61 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ta must have bee
12240 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 72 65  n allocated alre
12250 61 64 79 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  ady.  ** so that
12260 20 54 68 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c   ThreadData.nAll
12270 6f 63 20 63 61 6e 20 62 65 20 73 65 74 2e 0a 20  oc can be set.. 
12280 20 2a 2f 0a 20 20 54 68 72 65 61 64 44 61 74 61   */.  ThreadData
12290 20 2a 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33   *pTsd = sqlite3
122a0 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a 20 20  ThreadData();.  
122b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 20 29  assert( pPager )
122c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 73 64  ;.  assert( pTsd
122d0 20 26 26 20 70 54 73 64 2d 3e 6e 41 6c 6c 6f 63   && pTsd->nAlloc
122e0 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 69   );.#endif..  di
122f0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
12300 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 70  io_errors();.  p
12310 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
12320 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   0;.  pPager->ex
12330 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b  clusiveMode = 0;
12340 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70  .  pager_reset(p
12350 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65 72 55  Pager);.  pagerU
12360 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
12370 28 70 50 61 67 65 72 29 3b 0a 20 20 65 6e 61 62  (pPager);.  enab
12380 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
12390 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45  errors();.  PAGE
123a0 52 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20 25  RTRACE2("CLOSE %
123b0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
123c0 61 67 65 72 29 29 3b 0a 20 20 49 4f 54 52 41 43  ager));.  IOTRAC
123d0 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c  E(("CLOSE %p\n",
123e0 20 70 50 61 67 65 72 29 29 0a 20 20 61 73 73 65   pPager)).  asse
123f0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
12400 6f 64 65 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e  ode || (pPager->
12410 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 26  journalOpen==0 &
12420 26 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  & pPager->stmtOp
12430 65 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20  en==0) );.  if( 
12440 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
12450 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
12460 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  e3OsClose(&pPage
12470 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73  r->jfd);.  }.  s
12480 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
12490 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->aInJournal);. 
124a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
124b0 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  tOpen ){.    sql
124c0 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61  ite3OsClose(&pPa
124d0 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 7d 0a  ger->stfd);.  }.
124e0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
124f0 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  (&pPager->fd);. 
12500 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73 20 61   /* Temp files a
12510 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  re automatically
12520 20 64 65 6c 65 74 65 64 20 62 79 20 74 68 65 20   deleted by the 
12530 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70 50 61 67  OS.  ** if( pPag
12540 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
12550 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f 73    **   sqlite3Os
12560 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a  Delete(pPager->z
12570 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20  Filename);.  ** 
12580 7d 0a 20 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  }.  */..#ifdef S
12590 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
125a0 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
125b0 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70   /* Remove the p
125c0 61 67 65 72 20 66 72 6f 6d 20 74 68 65 20 6c 69  ager from the li
125d0 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 70 61 67  nked list of pag
125e0 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ers starting at 
125f0 0a 20 20 2a 2a 20 54 68 72 65 61 64 44 61 74 61  .  ** ThreadData
12600 2e 70 50 61 67 65 72 20 69 66 20 6d 65 6d 6f 72  .pPager if memor
12610 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73 20  y-management is 
12620 65 6e 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20  enabled..  */.  
12630 69 66 28 20 70 50 61 67 65 72 3d 3d 70 54 73 64  if( pPager==pTsd
12640 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20  ->pPager ){.    
12650 70 54 73 64 2d 3e 70 50 61 67 65 72 20 3d 20 70  pTsd->pPager = p
12660 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Pager->pNext;.  
12670 7d 65 6c 73 65 7b 0a 20 20 20 20 50 61 67 65 72  }else{.    Pager
12680 20 2a 70 54 6d 70 3b 0a 20 20 20 20 66 6f 72 28   *pTmp;.    for(
12690 70 54 6d 70 20 3d 20 70 54 73 64 2d 3e 70 50 61  pTmp = pTsd->pPa
126a0 67 65 72 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74  ger; pTmp->pNext
126b0 21 3d 70 50 61 67 65 72 3b 20 70 54 6d 70 3d 70  !=pPager; pTmp=p
126c0 54 6d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  Tmp->pNext){}.  
126d0 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 20 3d 20    pTmp->pNext = 
126e0 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pPager->pNext;. 
126f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
12700 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61  teFree(pPager->a
12710 48 61 73 68 29 3b 0a 20 20 73 71 6c 69 74 65 46  Hash);.  sqliteF
12720 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
12730 53 70 61 63 65 29 3b 0a 20 20 73 71 6c 69 74 65  Space);.  sqlite
12740 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Free(pPager);.  
12750 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12760 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
12770 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
12780 72 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  r for the given 
12790 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67  page data..*/.Pg
127a0 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  no sqlite3PagerP
127b0 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65  agenumber(DbPage
127c0 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
127d0 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pgno;.}../*.**
127e0 20 54 68 65 20 70 61 67 65 5f 72 65 66 28 29 20   The page_ref() 
127f0 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65  function increme
12800 6e 74 73 20 74 68 65 20 72 65 66 65 72 65 6e 63  nts the referenc
12810 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61  e count for a pa
12820 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  ge..** If the pa
12830 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ge is currently 
12840 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
12850 28 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63  (the reference c
12860 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74 68  ount is zero) th
12870 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20  en.** remove it 
12880 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
12890 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e  t..**.** For non
128a0 2d 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70  -test systems, p
128b0 61 67 65 5f 72 65 66 28 29 20 69 73 20 61 20 6d  age_ref() is a m
128c0 61 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73 20  acro that calls 
128d0 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 6f  _page_ref().** o
128e0 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65 66  nline of the ref
128f0 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
12900 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74 20  zero.  For test 
12910 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65  systems, page_re
12920 66 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61 6c  f().** is a real
12930 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68 61   function so tha
12940 74 20 77 65 20 63 61 6e 20 73 65 74 20 62 72 65  t we can set bre
12950 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72 61  akpoints and tra
12960 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ce it..*/.static
12970 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66 28   void _page_ref(
12980 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
12990 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
129a0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ){.    /* The pa
129b0 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ge is currently 
129c0 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
129d0 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a    Remove it. */.
129e0 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50 67      if( pPg==pPg
129f0 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ->pPager->pFirst
12a00 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 20 20  Synced ){.      
12a10 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e  PgHdr *p = pPg->
12a20 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20  pNextFree;.     
12a30 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
12a40 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20  needSync ){ p = 
12a50 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a  p->pNextFree; }.
12a60 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
12a70 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
12a80 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = p;.    }.    i
12a90 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65  f( pPg->pPrevFre
12aa0 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  e ){.      pPg->
12ab0 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74  pPrevFree->pNext
12ac0 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Free = pPg->pNex
12ad0 74 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65  tFree;.    }else
12ae0 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  {.      pPg->pPa
12af0 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50  ger->pFirst = pP
12b00 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
12b10 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
12b20 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20  >pNextFree ){.  
12b30 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72      pPg->pNextFr
12b40 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  ee->pPrevFree = 
12b50 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a  pPg->pPrevFree;.
12b60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12b70 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 4c   pPg->pPager->pL
12b80 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ast = pPg->pPrev
12b90 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Free;.    }.    
12ba0 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65  pPg->pPager->nRe
12bb0 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  f++;.  }.  pPg->
12bc0 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e 46  nRef++;.  REFINF
12bd0 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64 65 66  O(pPg);.}.#ifdef
12be0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
12bf0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
12c00 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29  _ref(PgHdr *pPg)
12c10 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e  {.    if( pPg->n
12c20 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
12c30 5f 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a  _page_ref(pPg);.
12c40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12c50 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pPg->nRef++;.  
12c60 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29      REFINFO(pPg)
12c70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
12c80 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 5f  e.# define page_
12c90 72 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e 6e  ref(P)   ((P)->n
12ca0 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66  Ref==0?_page_ref
12cb0 28 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e  (P):(void)(P)->n
12cc0 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f  Ref++).#endif../
12cd0 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74  *.** Increment t
12ce0 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
12cf0 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20  nt for a page.  
12d00 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65  The input pointe
12d10 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65  r is.** a refere
12d20 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 20  nce to the page 
12d30 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  data..*/.int sql
12d40 69 74 65 33 50 61 67 65 72 52 65 66 28 44 62 50  ite3PagerRef(DbP
12d50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 70 61 67  age *pPg){.  pag
12d60 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65  e_ref(pPg);.  re
12d70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12d80 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
12d90 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f  e journal.  In o
12da0 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65  ther words, make
12db0 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61   sure all the pa
12dc0 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a  ges that have.**
12dd0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
12de0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76   the journal hav
12df0 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68  e actually reach
12e00 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f  ed the surface o
12e10 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20  f the.** disk.  
12e20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74  It is not safe t
12e30 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69  o modify the ori
12e40 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
12e50 69 6c 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a  ile until after.
12e60 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
12e70 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20  as been synced. 
12e80 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   If the original
12e90 20 64 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64   database is mod
12ea0 69 66 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  ified before.** 
12eb0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
12ec0 79 6e 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65  ynced and a powe
12ed0 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
12ee0 2c 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a  , the unsynced j
12ef0 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77  ournal.** data w
12f00 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64  ould be lost and
12f10 20 77 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61   we would be una
12f20 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c  ble to completel
12f30 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a  y rollback the.*
12f40 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67  * database chang
12f50 65 73 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f  es.  Database co
12f60 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f  rruption would o
12f70 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69  ccur..** .** Thi
12f80 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75  s routine also u
12f90 70 64 61 74 65 73 20 74 68 65 20 6e 52 65 63 20  pdates the nRec 
12fa0 66 69 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61  field in the hea
12fb0 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  der of the journ
12fc0 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d  al..** (See comm
12fd0 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ents on the page
12fe0 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75  r_playback() rou
12ff0 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f  tine for additio
13000 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
13010 29 0a 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63  ).** If the sync
13020 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74   mode is FULL, t
13030 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63  wo syncs will oc
13040 63 75 72 2e 20 20 46 69 72 73 74 20 74 68 65 20  cur.  First the 
13050 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  whole journal.**
13060 20 69 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e   is synced, then
13070 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
13080 69 73 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e  is updated, then
13090 20 61 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f   a second sync o
130a0 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ccurs..**.** For
130b0 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
130c0 61 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20  ases, we do not 
130d0 63 61 72 65 20 69 66 20 77 65 20 61 72 65 20 61  care if we are a
130e0 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a  ble to rollback.
130f0 2a 2a 20 61 66 74 65 72 20 61 20 70 6f 77 65 72  ** after a power
13100 20 66 61 69 6c 75 72 65 2c 20 73 6f 20 73 79 6e   failure, so syn
13110 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  c occurs..**.** 
13120 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65  This routine cle
13130 61 72 73 20 74 68 65 20 6e 65 65 64 53 79 6e 63  ars the needSync
13140 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20   field of every 
13150 70 61 67 65 20 63 75 72 72 65 6e 74 20 68 65 6c  page current hel
13160 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a  d in.** memory..
13170 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
13180 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  ncJournal(Pager 
13190 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
131a0 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
131b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
131c0 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75   /* Sync the jou
131d0 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69  rnal before modi
131e0 66 79 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64  fying the main d
131f0 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73  atabase.  ** (as
13200 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20  suming there is 
13210 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74  a journal and it
13220 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
13230 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ced.).  */.  if(
13240 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
13250 63 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  c ){.    if( !pP
13260 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
13270 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
13280 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13290 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  pen );.      /* 
132a0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
132b0 3e 6e 6f 53 79 6e 63 20 29 3b 20 2f 2f 20 6e 6f  >noSync ); // no
132c0 53 79 6e 63 20 6d 69 67 68 74 20 62 65 20 73 65  Sync might be se
132d0 74 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73  t if synchronous
132e0 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20 74 75  .      ** was tu
132f0 72 6e 65 64 20 6f 66 66 20 61 66 74 65 72 20 74  rned off after t
13300 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
13310 61 73 20 73 74 61 72 74 65 64 2e 20 20 54 69 63  as started.  Tic
13320 6b 65 74 20 23 36 31 35 20 2a 2f 0a 23 69 66 6e  ket #615 */.#ifn
13330 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 20  def NDEBUG.     
13340 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61   {.        /* Ma
13350 6b 65 20 73 75 72 65 20 74 68 65 20 70 50 61 67  ke sure the pPag
13360 65 72 2d 3e 6e 52 65 63 20 63 6f 75 6e 74 65 72  er->nRec counter
13370 20 77 65 20 61 72 65 20 6b 65 65 70 69 6e 67 20   we are keeping 
13380 61 67 72 65 65 73 0a 20 20 20 20 20 20 20 20 2a  agrees.        *
13390 2a 20 77 69 74 68 20 74 68 65 20 6e 52 65 63 20  * with the nRec 
133a0 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68  computed from th
133b0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
133c0 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
133d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
133e0 36 34 20 6a 53 7a 3b 0a 20 20 20 20 20 20 20 20  64 jSz;.        
133f0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
13400 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
13410 66 64 2c 20 26 6a 53 7a 29 3b 0a 20 20 20 20 20  fd, &jSz);.     
13420 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72     if( rc!=0 ) r
13430 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
13440 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
13450 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 53  ->journalOff==jS
13460 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  z );.      }.#en
13470 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
13480 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
13490 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f   nRec value into
134a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
134b0 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a  e header. If in.
134c0 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d          ** full-
134d0 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65  synchronous mode
134e0 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
134f0 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65  al first. This e
13500 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20  nsures that.    
13510 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20      ** all data 
13520 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74  has really hit t
13530 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e  he disk before n
13540 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74  Rec is updated t
13550 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a  o mark.        *
13560 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64  * it as a candid
13570 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b  ate for rollback
13580 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  . .        */.  
13590 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
135a0 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
135b0 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
135c0 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE2("SYNC journa
135d0 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
135e0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
135f0 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
13600 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  ("JSYNC %p\n", p
13610 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20  Pager)).        
13620 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13630 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
13640 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
13650 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
13660 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
13670 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
13680 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
13690 65 72 2d 3e 6a 66 64 2c 0a 20 20 20 20 20 20 20  er->jfd,.       
136a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136b0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
136c0 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28  nalHdr + sizeof(
136d0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
136e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
136f0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
13700 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
13710 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e  HDR %p %lld %d\n
13720 22 2c 20 70 50 61 67 65 72 2c 0a 20 20 20 20 20  ", pPager,.     
13730 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
13740 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
13750 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  + sizeof(aJourna
13760 6c 4d 61 67 69 63 29 2c 20 34 29 29 0a 20 20 20  lMagic), 4)).   
13770 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
13780 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
13790 64 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29  d, pPager->nRec)
137a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
137b0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
137c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
137d0 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
137e0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
137f0 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20  ournalOff);.    
13800 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
13810 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
13820 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
13830 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  2("SYNC journal 
13840 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
13850 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
13860 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
13870 43 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %d\n", pPager)
13880 29 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ).      rc = sql
13890 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
138a0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
138b0 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 20  full_fsync);.   
138c0 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72     if( rc!=0 ) r
138d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
138e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
138f0 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20  tarted = 1;.    
13900 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  }.    pPager->ne
13910 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20  edSync = 0;..   
13920 20 2f 2a 20 45 72 61 73 65 20 74 68 65 20 6e 65   /* Erase the ne
13930 65 64 53 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d  edSync flag from
13940 20 65 76 65 72 79 20 70 61 67 65 2e 0a 20 20 20   every page..   
13950 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50 67 3d   */.    for(pPg=
13960 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
13970 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
13980 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67  tAll){.      pPg
13990 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
139a0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
139b0 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
139c0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b   pPager->pFirst;
139d0 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  .  }..#ifndef ND
139e0 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74 68 65  EBUG.  /* If the
139f0 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20   Pager.needSync 
13a00 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20 74 68  flag is clear th
13a10 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  en the PgHdr.nee
13a20 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20  dSync.  ** flag 
13a30 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63 6c 65  must also be cle
13a40 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73  ar for all pages
13a50 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74  .  Verify that t
13a60 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61  his.  ** invaria
13a70 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f  nt is true..  */
13a80 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72  .  else{.    for
13a90 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
13aa0 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
13ab0 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
13ac0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
13ad0 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  eedSync==0 );.  
13ae0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
13af0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
13b00 6e 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e 70 46  nced==pPager->pF
13b10 69 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  irst );.  }.#end
13b20 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
13b30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20  .}../*.** Merge 
13b40 74 77 6f 20 6c 69 73 74 73 20 6f 66 20 70 61 67  two lists of pag
13b50 65 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  es connected by 
13b60 70 44 69 72 74 79 20 61 6e 64 20 69 6e 20 70 67  pDirty and in pg
13b70 6e 6f 20 6f 72 64 65 72 2e 0a 2a 2a 20 44 6f 20  no order..** Do 
13b80 6e 6f 74 20 62 6f 74 68 20 66 69 78 69 6e 67 20  not both fixing 
13b90 74 68 65 20 70 50 72 65 76 44 69 72 74 79 20 70  the pPrevDirty p
13ba0 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74  ointers..*/.stat
13bb0 69 63 20 50 67 48 64 72 20 2a 6d 65 72 67 65 5f  ic PgHdr *merge_
13bc0 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a  pagelist(PgHdr *
13bd0 70 41 2c 20 50 67 48 64 72 20 2a 70 42 29 7b 0a  pA, PgHdr *pB){.
13be0 20 20 50 67 48 64 72 20 72 65 73 75 6c 74 2c 20    PgHdr result, 
13bf0 2a 70 54 61 69 6c 3b 0a 20 20 70 54 61 69 6c 20  *pTail;.  pTail 
13c00 3d 20 26 72 65 73 75 6c 74 3b 0a 20 20 77 68 69  = &result;.  whi
13c10 6c 65 28 20 70 41 20 26 26 20 70 42 20 29 7b 0a  le( pA && pB ){.
13c20 20 20 20 20 69 66 28 20 70 41 2d 3e 70 67 6e 6f      if( pA->pgno
13c30 3c 70 42 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  <pB->pgno ){.   
13c40 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79     pTail->pDirty
13c50 20 3d 20 70 41 3b 0a 20 20 20 20 20 20 70 54 61   = pA;.      pTa
13c60 69 6c 20 3d 20 70 41 3b 0a 20 20 20 20 20 20 70  il = pA;.      p
13c70 41 20 3d 20 70 41 2d 3e 70 44 69 72 74 79 3b 0a  A = pA->pDirty;.
13c80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13c90 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d   pTail->pDirty =
13ca0 20 70 42 3b 0a 20 20 20 20 20 20 70 54 61 69 6c   pB;.      pTail
13cb0 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70 42 20   = pB;.      pB 
13cc0 3d 20 70 42 2d 3e 70 44 69 72 74 79 3b 0a 20 20  = pB->pDirty;.  
13cd0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 41    }.  }.  if( pA
13ce0 20 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70   ){.    pTail->p
13cf0 44 69 72 74 79 20 3d 20 70 41 3b 0a 20 20 7d 65  Dirty = pA;.  }e
13d00 6c 73 65 20 69 66 28 20 70 42 20 29 7b 0a 20 20  lse if( pB ){.  
13d10 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20    pTail->pDirty 
13d20 3d 20 70 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = pB;.  }else{. 
13d30 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79     pTail->pDirty
13d40 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
13d50 72 6e 20 72 65 73 75 6c 74 2e 70 44 69 72 74 79  rn result.pDirty
13d60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20  ;.}../*.** Sort 
13d70 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65  the list of page
13d80 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f  s in accending o
13d90 72 64 65 72 20 62 79 20 70 67 6e 6f 2e 20 20 50  rder by pgno.  P
13da0 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6e 6e  ages are.** conn
13db0 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79 20  ected by pDirty 
13dc0 70 6f 69 6e 74 65 72 73 2e 20 20 54 68 65 20 70  pointers.  The p
13dd0 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65  PrevDirty pointe
13de0 72 73 20 61 72 65 0a 2a 2a 20 63 6f 72 72 75 70  rs are.** corrup
13df0 74 65 64 20 62 79 20 74 68 69 73 20 73 6f 72 74  ted by this sort
13e00 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 53  ..*/.#define N_S
13e10 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43  ORT_BUCKET_ALLOC
13e20 20 32 35 0a 23 64 65 66 69 6e 65 20 4e 5f 53 4f   25.#define N_SO
13e30 52 54 5f 42 55 43 4b 45 54 20 20 20 20 20 20 20  RT_BUCKET       
13e40 32 35 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  25.#ifdef SQLITE
13e50 5f 54 45 53 54 0a 20 20 69 6e 74 20 73 71 6c 69  _TEST.  int sqli
13e60 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74  te3_pager_n_sort
13e70 5f 62 75 63 6b 65 74 20 3d 20 30 3b 0a 20 20 23  _bucket = 0;.  #
13e80 75 6e 64 65 66 20 4e 5f 53 4f 52 54 5f 42 55 43  undef N_SORT_BUC
13e90 4b 45 54 0a 20 20 23 64 65 66 69 6e 65 20 4e 5f  KET.  #define N_
13ea0 53 4f 52 54 5f 42 55 43 4b 45 54 20 5c 0a 20 20  SORT_BUCKET \.  
13eb0 20 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f   (sqlite3_pager_
13ec0 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 3f 73 71  n_sort_bucket?sq
13ed0 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f  lite3_pager_n_so
13ee0 72 74 5f 62 75 63 6b 65 74 3a 4e 5f 53 4f 52 54  rt_bucket:N_SORT
13ef0 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 29 0a 23  _BUCKET_ALLOC).#
13f00 65 6e 64 69 66 0a 73 74 61 74 69 63 20 50 67 48  endif.static PgH
13f10 64 72 20 2a 73 6f 72 74 5f 70 61 67 65 6c 69 73  dr *sort_pagelis
13f20 74 28 50 67 48 64 72 20 2a 70 49 6e 29 7b 0a 20  t(PgHdr *pIn){. 
13f30 20 50 67 48 64 72 20 2a 61 5b 4e 5f 53 4f 52 54   PgHdr *a[N_SORT
13f40 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 5d 2c 20  _BUCKET_ALLOC], 
13f50 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6d  *p;.  int i;.  m
13f60 65 6d 73 65 74 28 61 2c 20 30 2c 20 73 69 7a 65  emset(a, 0, size
13f70 6f 66 28 61 29 29 3b 0a 20 20 77 68 69 6c 65 28  of(a));.  while(
13f80 20 70 49 6e 20 29 7b 0a 20 20 20 20 70 20 3d 20   pIn ){.    p = 
13f90 70 49 6e 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70  pIn;.    pIn = p
13fa0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 70 2d  ->pDirty;.    p-
13fb0 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  >pDirty = 0;.   
13fc0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f 53 4f   for(i=0; i<N_SO
13fd0 52 54 5f 42 55 43 4b 45 54 2d 31 3b 20 69 2b 2b  RT_BUCKET-1; i++
13fe0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 5b 69  ){.      if( a[i
13ff0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
14000 61 5b 69 5d 20 3d 20 70 3b 0a 20 20 20 20 20 20  a[i] = p;.      
14010 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
14020 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 20  else{.        p 
14030 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74  = merge_pagelist
14040 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20 20  (a[i], p);.     
14050 20 20 20 61 5b 69 5d 20 3d 20 30 3b 0a 20 20 20     a[i] = 0;.   
14060 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
14070 66 28 20 69 3d 3d 4e 5f 53 4f 52 54 5f 42 55 43  f( i==N_SORT_BUC
14080 4b 45 54 2d 31 20 29 7b 0a 20 20 20 20 20 20 2f  KET-1 ){.      /
14090 2a 20 43 6f 76 65 72 61 67 65 3a 20 54 6f 20 67  * Coverage: To g
140a0 65 74 20 68 65 72 65 2c 20 74 68 65 72 65 20 6e  et here, there n
140b0 65 65 64 20 74 6f 20 62 65 20 32 5e 28 4e 5f 53  eed to be 2^(N_S
140c0 4f 52 54 5f 42 55 43 4b 45 54 29 20 0a 20 20 20  ORT_BUCKET) .   
140d0 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 69     ** elements i
140e0 6e 20 74 68 65 20 69 6e 70 75 74 20 6c 69 73 74  n the input list
140f0 2e 20 54 68 69 73 20 69 73 20 70 6f 73 73 69 62  . This is possib
14100 6c 65 2c 20 62 75 74 20 69 6d 70 72 61 63 74 69  le, but impracti
14110 63 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 20 54 65  cal..      ** Te
14120 73 74 69 6e 67 20 74 68 69 73 20 6c 69 6e 65 20  sting this line 
14130 69 73 20 74 68 65 20 70 6f 69 6e 74 20 6f 66 20  is the point of 
14140 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 0a  global variable.
14150 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
14160 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75  _pager_n_sort_bu
14170 63 6b 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  cket..      */. 
14180 20 20 20 20 20 61 5b 69 5d 20 3d 20 6d 65 72 67       a[i] = merg
14190 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c  e_pagelist(a[i],
141a0 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   p);.    }.  }. 
141b0 20 70 20 3d 20 61 5b 30 5d 3b 0a 20 20 66 6f 72   p = a[0];.  for
141c0 28 69 3d 31 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42  (i=1; i<N_SORT_B
141d0 55 43 4b 45 54 3b 20 69 2b 2b 29 7b 0a 20 20 20  UCKET; i++){.   
141e0 20 70 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c   p = merge_pagel
141f0 69 73 74 28 70 2c 20 61 5b 69 5d 29 3b 0a 20 20  ist(p, a[i]);.  
14200 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
14210 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c  ./*.** Given a l
14220 69 73 74 20 6f 66 20 70 61 67 65 73 20 28 63 6f  ist of pages (co
14230 6e 6e 65 63 74 65 64 20 62 79 20 74 68 65 20 50  nnected by the P
14240 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e  gHdr.pDirty poin
14250 74 65 72 29 20 77 72 69 74 65 0a 2a 2a 20 65 76  ter) write.** ev
14260 65 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  ery one of those
14270 20 70 61 67 65 73 20 6f 75 74 20 74 6f 20 74 68   pages out to th
14280 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14290 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c  and mark them al
142a0 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a  l.** as clean..*
142b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
142c0 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
142d0 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b  t(PgHdr *pList){
142e0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
142f0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
14300 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
14310 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14320 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74    pPager = pList
14330 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20  ->pPager;..  /* 
14340 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
14350 65 72 65 20 6d 61 79 20 62 65 20 65 69 74 68 65  ere may be eithe
14360 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
14370 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
14380 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
14390 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
143a0 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e  re is already an
143b0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
143c0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
143d0 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   ** calls to sql
143e0 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65  ite3OsLock() are
143f0 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20   no-ops..  **.  
14400 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f  ** Moving the lo
14410 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44  ck from RESERVED
14420 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63   to EXCLUSIVE ac
14430 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20  tually involves 
14440 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75  going.  ** throu
14450 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61  gh an intermedia
14460 74 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47  te state PENDING
14470 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f  .   A PENDING lo
14480 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a  ck prevents new.
14490 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f    ** readers fro
144a0 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74  m attaching to t
144b0 68 65 20 64 61 74 61 62 61 73 65 20 62 75 74 20  he database but 
144c0 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20  is unsufficient 
144d0 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77  for us to.  ** w
144e0 72 69 74 65 2e 20 20 54 68 65 20 69 64 65 61 20  rite.  The idea 
144f0 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  of a PENDING loc
14500 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20  k is to prevent 
14510 6e 65 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d  new readers from
14520 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20  .  ** coming in 
14530 77 68 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f  while we wait fo
14540 72 20 65 78 69 73 74 69 6e 67 20 72 65 61 64 65  r existing reade
14550 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a  rs to clear..  *
14560 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65  *.  ** While the
14570 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
14580 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c   RESERVED state,
14590 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
145a0 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a  tabase file.  **
145b0 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e   is unchanged an
145c0 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63  d we can rollbac
145d0 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  k without having
145e0 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65   to playback the
145f0 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e  .  ** journal in
14600 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
14610 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
14620 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74 69  Once we transiti
14630 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55  on to.  ** EXCLU
14640 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74  SIVE, it means t
14650 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14660 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65   has been change
14670 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61  d and any rollba
14680 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71  ck.  ** will req
14690 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70  uire a journal p
146a0 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20  layback..  */.  
146b0 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
146c0 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
146d0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
146e0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
146f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
14700 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 4c  rn rc;.  }..  pL
14710 69 73 74 20 3d 20 73 6f 72 74 5f 70 61 67 65 6c  ist = sort_pagel
14720 69 73 74 28 70 4c 69 73 74 29 3b 0a 20 20 77 68  ist(pList);.  wh
14730 69 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a 20 20  ile( pList ){.  
14740 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
14750 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20 72 63  >dirty );.    rc
14760 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
14770 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 4c  (pPager->fd, (pL
14780 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28 69 36  ist->pgno-1)*(i6
14790 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
147a0 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ze);.    if( rc 
147b0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
147c0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
147d0 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20   dirty pages in 
147e0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77  the page cache w
147f0 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
14800 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20   greater.    ** 
14810 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
14820 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71  e, this means sq
14830 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
14840 74 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20  te() was called 
14850 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74  to.    ** make t
14860 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20  he file smaller 
14870 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61  (presumably by a
14880 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29  uto-vacuum code)
14890 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20  . Do not write. 
148a0 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70     ** any such p
148b0 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65  ages to the file
148c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
148d0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50   pList->pgno<=pP
148e0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
148f0 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
14900 61 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65  a = CODEC2(pPage
14910 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r, PGHDR_TO_DATA
14920 28 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e  (pList), pList->
14930 70 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20  pgno, 6);.      
14940 50 41 47 45 52 54 52 41 43 45 33 28 22 53 54 4f  PAGERTRACE3("STO
14950 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  RE %d page %d\n"
14960 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
14970 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b  ), pList->pgno);
14980 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
14990 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c  "PGOUT %p %d\n",
149a0 20 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e   pPager, pList->
149b0 70 67 6e 6f 29 29 0a 20 20 20 20 20 20 72 63 20  pgno)).      rc 
149c0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
149d0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61  (pPager->fd, pDa
149e0 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
149f0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 54 45 53  Size);.      TES
14a00 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  T_INCR(pPager->n
14a10 57 72 69 74 65 29 3b 0a 20 20 20 20 7d 0a 23 69  Write);.    }.#i
14a20 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
14a30 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47   else{.      PAG
14a40 45 52 54 52 41 43 45 33 28 22 4e 4f 53 54 4f 52  ERTRACE3("NOSTOR
14a50 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  E %d page %d\n",
14a60 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
14a70 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a  , pList->pgno);.
14a80 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
14a90 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
14aa0 20 72 63 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e   rc;.    pList->
14ab0 64 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 64 65  dirty = 0;.#ifde
14ac0 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
14ad0 41 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e  AGES.    pList->
14ae0 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
14af0 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
14b00 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69  ;.#endif.    pLi
14b10 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72  st = pList->pDir
14b20 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ty;.  }.  return
14b30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
14b40 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65  *.** Collect eve
14b50 72 79 20 64 69 72 74 79 20 70 61 67 65 20 69 6e  ry dirty page in
14b60 74 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74 20  to a dirty list 
14b70 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20  and.** return a 
14b80 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68  pointer to the h
14b90 65 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73 74  ead of that list
14ba0 2e 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72 65  .  All pages are
14bb0 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65 76  .** collected ev
14bc0 65 6e 20 69 66 20 74 68 65 79 20 61 72 65 20 73  en if they are s
14bd0 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a  till in use..*/.
14be0 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
14bf0 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74  ger_get_all_dirt
14c00 79 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a 70  y_pages(Pager *p
14c10 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
14c20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b   pPager->pDirty;
14c30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
14c40 20 54 52 55 45 20 69 66 20 74 68 65 72 65 20 69   TRUE if there i
14c50 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  s a hot journal 
14c60 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
14c70 65 72 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a 6f 75  er..** A hot jou
14c80 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74  rnal is one that
14c90 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
14ca0 79 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  yed back..**.** 
14cb0 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  If the current s
14cc0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
14cd0 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75  ase file is 0 bu
14ce0 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  t a journal file
14cf0 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74  .** exists, that
14d00 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20   is probably an 
14d10 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74  old journal left
14d20 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69   over from a pri
14d30 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77  or.** database w
14d40 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
14d50 65 2e 20 20 4a 75 73 74 20 64 65 6c 65 74 65 20  e.  Just delete 
14d60 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  the journal..*/.
14d70 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f  static int hasHo
14d80 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  tJournal(Pager *
14d90 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21  pPager){.  if( !
14da0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
14db0 61 6c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  al ) return 0;. 
14dc0 20 69 66 28 20 21 73 71 6c 69 74 65 33 4f 73 46   if( !sqlite3OsF
14dd0 69 6c 65 45 78 69 73 74 73 28 70 50 61 67 65 72  ileExists(pPager
14de0 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20 29 20 72 65  ->zJournal) ) re
14df0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71  turn 0;.  if( sq
14e00 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
14e10 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d  rvedLock(pPager-
14e20 3e 66 64 29 20 29 20 72 65 74 75 72 6e 20 30 3b  >fd) ) return 0;
14e30 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61  .  if( sqlite3Pa
14e40 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
14e50 67 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ger)==0 ){.    s
14e60 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
14e70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
14e80 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
14e90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
14ea0 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 1;.  }.}../*
14eb0 0a 2a 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20  .** Try to find 
14ec0 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61  a page in the ca
14ed0 63 68 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  che that can be 
14ee0 72 65 63 79 63 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a  recycled. .**.**
14ef0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
14f00 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
14f10 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 46 55  IOERR, SQLITE_FU
14f20 4c 4c 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 2e  LL or SQLITE_OK.
14f30 20 49 74 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74   It .** does not
14f40 20 73 65 74 20 74 68 65 20 70 50 61 67 65 72 2d   set the pPager-
14f50 3e 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c  >errCode variabl
14f60 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
14f70 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 50   pager_recycle(P
14f80 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
14f90 74 20 73 79 6e 63 4f 6b 2c 20 50 67 48 64 72 20  t syncOk, PgHdr 
14fa0 2a 2a 70 70 50 67 29 7b 0a 20 20 50 67 48 64 72  **ppPg){.  PgHdr
14fb0 20 2a 70 50 67 3b 0a 20 20 2a 70 70 50 67 20 3d   *pPg;.  *ppPg =
14fc0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 21 4d   0;..  assert(!M
14fd0 45 4d 44 42 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e  EMDB);..  /* Fin
14fe0 64 20 61 20 70 61 67 65 20 74 6f 20 72 65 63 79  d a page to recy
14ff0 63 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63  cle.  Try to loc
15000 61 74 65 20 61 20 70 61 67 65 20 74 68 61 74 20  ate a page that 
15010 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 72 65  does not.  ** re
15020 71 75 69 72 65 20 75 73 20 74 6f 20 64 6f 20 61  quire us to do a
15030 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20 74 68 65  n fsync() on the
15040 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20   journal..  */. 
15050 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70   pPg = pPager->p
15060 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20  FirstSynced;..  
15070 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c 64 20 6e  /* If we could n
15080 6f 74 20 66 69 6e 64 20 61 20 70 61 67 65 20 74  ot find a page t
15090 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  hat does not req
150a0 75 69 72 65 20 61 6e 20 66 73 79 6e 63 28 29 0a  uire an fsync().
150b0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72    ** on the jour
150c0 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 66 73  nal file then fs
150d0 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
150e0 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20 61  file.  This is a
150f0 0a 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20  .  ** very slow 
15100 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65  operation, so we
15110 20 77 6f 72 6b 20 68 61 72 64 20 74 6f 20 61 76   work hard to av
15120 6f 69 64 20 69 74 2e 20 20 42 75 74 20 73 6f 6d  oid it.  But som
15130 65 74 69 6d 65 73 0a 20 20 2a 2a 20 69 74 20 63  etimes.  ** it c
15140 61 6e 27 74 20 62 65 20 68 65 6c 70 65 64 2e 0a  an't be helped..
15150 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d    */.  if( pPg==
15160 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46 69  0 && pPager->pFi
15170 72 73 74 20 26 26 20 73 79 6e 63 4f 6b 20 26 26  rst && syncOk &&
15180 20 21 4d 45 4d 44 42 29 7b 0a 20 20 20 20 69 6e   !MEMDB){.    in
15190 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e  t rc = syncJourn
151a0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
151b0 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
151c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
151d0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
151e0 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
151f0 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e 20 66        /* If in f
15200 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 77  ull-sync mode, w
15210 72 69 74 65 20 61 20 6e 65 77 20 6a 6f 75 72 6e  rite a new journ
15220 61 6c 20 68 65 61 64 65 72 20 69 6e 74 6f 20 74  al header into t
15230 68 65 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  he.      ** jour
15240 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 69  nal file. This i
15250 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69 64 20  s done to avoid 
15260 65 76 65 72 20 6d 6f 64 69 66 79 69 6e 67 20 61  ever modifying a
15270 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
15280 2a 20 68 65 61 64 65 72 20 74 68 61 74 20 69 73  * header that is
15290 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65   involved in the
152a0 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 70 61 67   rollback of pag
152b0 65 73 20 74 68 61 74 20 68 61 76 65 0a 20 20 20  es that have.   
152c0 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 62 65     ** already be
152d0 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
152e0 65 20 64 61 74 61 62 61 73 65 20 28 69 6e 20 63  e database (in c
152f0 61 73 65 20 74 68 65 20 68 65 61 64 65 72 20 69  ase the header i
15300 73 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 73 68  s.      ** trash
15310 65 64 20 77 68 65 6e 20 74 68 65 20 6e 52 65 63  ed when the nRec
15320 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
15330 64 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  d)..      */.   
15340 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
15350 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
15360 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
15370 61 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20 20 20  alOff > 0 );.   
15380 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
15390 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20  r->doNotSync==0 
153a0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  );.      rc = wr
153b0 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
153c0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
153d0 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
153e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
153f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
15400 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  Pg = pPager->pFi
15410 72 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  rst;.  }.  if( p
15420 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  Pg==0 ){.    ret
15430 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
15440 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50   }..  assert( pP
15450 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20  g->nRef==0 );.. 
15460 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
15470 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
15480 73 65 20 66 69 6c 65 20 69 66 20 69 74 20 69 73  se file if it is
15490 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20 20 69   dirty..  */.  i
154a0 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b  f( pPg->dirty ){
154b0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
154c0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65   assert( pPg->ne
154d0 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  edSync==0 );.   
154e0 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b   makeClean(pPg);
154f0 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20  .    pPg->dirty 
15500 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44  = 1;.    pPg->pD
15510 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 72 63  irty = 0;.    rc
15520 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
15530 61 67 65 6c 69 73 74 28 20 70 50 67 20 29 3b 0a  agelist( pPg );.
15540 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15550 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
15560 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
15570 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
15580 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a  g->dirty==0 );..
15590 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
155a0 20 77 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e   we are recyclin
155b0 67 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61  g is marked as a
155c0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74  lwaysRollback, t
155d0 68 65 6e 0a 20 20 2a 2a 20 73 65 74 20 74 68 65  hen.  ** set the
155e0 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f   global alwaysRo
155f0 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74 68 75  llback flag, thu
15600 73 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 0a  s disabling the.
15610 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65    ** sqlite3Page
15620 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20  rDontRollback() 
15630 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72  optimization for
15640 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 69   the rest of thi
15650 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  s transaction.. 
15660 20 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73   ** It is necess
15670 61 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62  ary to do this b
15680 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
15690 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c  marked alwaysRol
156a0 6c 62 61 63 6b 0a 20 20 2a 2a 20 6d 69 67 68 74  lback.  ** might
156b0 20 62 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20   be reloaded at 
156c0 61 20 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74  a later time but
156d0 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77   at that point w
156e0 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72  e won't remember
156f0 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61  .  ** that is wa
15700 73 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52  s marked alwaysR
15710 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d  ollback.  This m
15720 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61  eans that all pa
15730 67 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65  ges must.  ** be
15740 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79   marked as alway
15750 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68  sRollback from h
15760 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f  ere on out..  */
15770 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61  .  if( pPg->alwa
15780 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  ysRollback ){.  
15790 20 20 49 4f 54 52 41 43 45 28 28 22 41 4c 57 41    IOTRACE(("ALWA
157a0 59 53 5f 52 4f 4c 4c 42 41 43 4b 20 25 70 5c 6e  YS_ROLLBACK %p\n
157b0 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
157c0 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
157d0 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a  llback = 1;.  }.
157e0 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65  .  /* Unlink the
157f0 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74   old page from t
15800 68 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64  he free list and
15810 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a   the hash table.
15820 20 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61 67    */.  unlinkPag
15830 65 28 70 50 67 29 3b 0a 20 20 61 73 73 65 72 74  e(pPg);.  assert
15840 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29  ( pPg->pgno==0 )
15850 3b 0a 0a 20 20 2a 70 70 50 67 20 3d 20 70 50 67  ;..  *ppPg = pPg
15860 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
15870 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
15880 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
15890 63 61 6c 6c 65 64 20 74 6f 20 66 72 65 65 20 73  called to free s
158a0 75 70 65 72 66 6c 75 6f 75 73 20 64 79 6e 61 6d  uperfluous dynam
158b0 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
158c0 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68 65 6c 64 20   memory.** held 
158d0 62 79 20 74 68 65 20 70 61 67 65 72 20 73 79 73  by the pager sys
158e0 74 65 6d 2e 20 4d 65 6d 6f 72 79 20 69 6e 20 75  tem. Memory in u
158f0 73 65 20 62 79 20 61 6e 79 20 53 51 4c 69 74 65  se by any SQLite
15900 20 70 61 67 65 72 20 61 6c 6c 6f 63 61 74 65 64   pager allocated
15910 0a 2a 2a 20 62 79 20 74 68 65 20 63 75 72 72 65  .** by the curre
15920 6e 74 20 74 68 72 65 61 64 20 6d 61 79 20 62 65  nt thread may be
15930 20 73 71 6c 69 74 65 46 72 65 65 28 29 65 64 2e   sqliteFree()ed.
15940 0a 2a 2a 0a 2a 2a 20 6e 52 65 71 20 69 73 20 74  .**.** nReq is t
15950 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
15960 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 71  es of memory req
15970 75 69 72 65 64 2e 20 4f 6e 63 65 20 74 68 69 73  uired. Once this
15980 20 6d 75 63 68 20 68 61 73 0a 2a 2a 20 62 65 65   much has.** bee
15990 6e 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65 20  n released, the 
159a0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
159b0 2e 20 41 20 6e 65 67 61 74 69 76 65 20 76 61 6c  . A negative val
159c0 75 65 20 66 6f 72 20 6e 52 65 71 20 6d 65 61 6e  ue for nReq mean
159d0 73 0a 2a 2a 20 66 72 65 65 20 61 73 20 6d 75 63  s.** free as muc
159e0 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73  h memory as poss
159f0 69 62 6c 65 2e 20 54 68 65 20 72 65 74 75 72 6e  ible. The return
15a00 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 74 6f   value is the to
15a10 74 61 6c 20 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f  tal number .** o
15a20 66 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72  f bytes of memor
15a30 79 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 23  y released..*/.#
15a40 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
15a50 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
15a60 45 4d 45 4e 54 0a 69 6e 74 20 73 71 6c 69 74 65  EMENT.int sqlite
15a70 33 50 61 67 65 72 52 65 6c 65 61 73 65 4d 65 6d  3PagerReleaseMem
15a80 6f 72 79 28 69 6e 74 20 6e 52 65 71 29 7b 0a 20  ory(int nReq){. 
15a90 20 63 6f 6e 73 74 20 54 68 72 65 61 64 44 61 74   const ThreadDat
15aa0 61 20 2a 70 54 73 64 72 6f 20 3d 20 73 71 6c 69  a *pTsdro = sqli
15ab0 74 65 33 54 68 72 65 61 64 44 61 74 61 52 65 61  te3ThreadDataRea
15ac0 64 4f 6e 6c 79 28 29 3b 0a 20 20 69 6e 74 20 6e  dOnly();.  int n
15ad0 52 65 6c 65 61 73 65 64 20 3d 20 30 3b 0a 20 20  Released = 0;.  
15ae0 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 49 66 20  int i;..  /* If 
15af0 74 68 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  the the global m
15b00 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20 74 68  utex is held, th
15b10 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 62 65  is subroutine be
15b20 63 6f 6d 65 73 20 61 0a 20 20 2a 2a 20 6f 2d 6f  comes a.  ** o-o
15b30 70 3b 20 7a 65 72 6f 20 62 79 74 65 73 20 6f 66  p; zero bytes of
15b40 20 6d 65 6d 6f 72 79 20 61 72 65 20 66 72 65 65   memory are free
15b50 64 2e 20 20 54 68 69 73 20 69 73 20 62 65 63 61  d.  This is beca
15b60 75 73 65 0a 20 20 2a 2a 20 73 6f 6d 65 20 6f 66  use.  ** some of
15b70 20 74 68 65 20 63 6f 64 65 20 69 6e 76 6f 6b 65   the code invoke
15b80 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
15b90 6f 6e 20 6d 61 79 20 61 6c 73 6f 0a 20 20 2a 2a  on may also.  **
15ba0 20 74 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 74   try to obtain t
15bb0 68 65 20 6d 75 74 65 78 2c 20 72 65 73 75 6c 74  he mutex, result
15bc0 69 6e 67 20 69 6e 20 61 20 64 65 61 64 6c 6f 63  ing in a deadloc
15bd0 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  k..  */.  if( sq
15be0 6c 69 74 65 33 4f 73 49 6e 4d 75 74 65 78 28 30  lite3OsInMutex(0
15bf0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
15c00 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 75 74  0;.  }..  /* Out
15c10 65 72 6d 6f 73 74 20 6c 6f 6f 70 20 72 75 6e 73  ermost loop runs
15c20 20 66 6f 72 20 61 74 20 6d 6f 73 74 20 74 77 6f   for at most two
15c30 20 69 74 65 72 61 74 69 6f 6e 73 2e 20 46 69 72   iterations. Fir
15c40 73 74 20 69 74 65 72 61 74 69 6f 6e 20 77 65 0a  st iteration we.
15c50 20 20 2a 2a 20 74 72 79 20 74 6f 20 66 69 6e 64    ** try to find
15c60 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 63 61 6e   memory that can
15c70 20 62 65 20 72 65 6c 65 61 73 65 64 20 77 69 74   be released wit
15c80 68 6f 75 74 20 63 61 6c 6c 69 6e 67 20 66 73 79  hout calling fsy
15c90 6e 63 28 29 2e 20 53 65 63 6f 6e 64 0a 20 20 2a  nc(). Second.  *
15ca0 2a 20 69 74 65 72 61 74 69 6f 6e 20 28 77 68 69  * iteration (whi
15cb0 63 68 20 6f 6e 6c 79 20 72 75 6e 73 20 69 66 20  ch only runs if 
15cc0 74 68 65 20 66 69 72 73 74 20 66 61 69 6c 65 64  the first failed
15cd0 20 74 6f 20 66 72 65 65 20 6e 52 65 71 20 62 79   to free nReq by
15ce0 74 65 73 20 6f 66 0a 20 20 2a 2a 20 6d 65 6d 6f  tes of.  ** memo
15cf0 72 79 29 20 69 73 20 70 65 72 6d 69 74 74 65 64  ry) is permitted
15d00 20 74 6f 20 63 61 6c 6c 20 66 73 79 6e 63 28 29   to call fsync()
15d10 2e 20 54 68 69 73 20 69 73 20 6f 66 20 63 6f 75  . This is of cou
15d20 72 73 65 20 6d 75 63 68 20 6d 6f 72 65 20 0a 20  rse much more . 
15d30 20 2a 2a 20 65 78 70 65 6e 73 69 76 65 2e 0a 20   ** expensive.. 
15d40 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
15d50 3c 3d 31 3b 20 69 2b 2b 29 7b 0a 0a 20 20 20 20  <=1; i++){..    
15d60 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
15d70 61 6c 6c 20 74 68 65 20 53 51 4c 69 74 65 20 70  all the SQLite p
15d80 61 67 65 72 73 20 6f 70 65 6e 65 64 20 62 79 20  agers opened by 
15d90 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
15da0 61 64 2e 20 2a 2f 0a 20 20 20 20 50 61 67 65 72  ad. */.    Pager
15db0 20 2a 70 50 61 67 65 72 20 3d 20 70 54 73 64 72   *pPager = pTsdr
15dc0 6f 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 66  o->pPager;.    f
15dd0 6f 72 28 20 3b 20 70 50 61 67 65 72 20 26 26 20  or( ; pPager && 
15de0 28 6e 52 65 71 3c 30 20 7c 7c 20 6e 52 65 6c 65  (nReq<0 || nRele
15df0 61 73 65 64 3c 6e 52 65 71 29 3b 20 70 50 61 67  ased<nReq); pPag
15e00 65 72 3d 70 50 61 67 65 72 2d 3e 70 4e 65 78 74  er=pPager->pNext
15e10 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  ){.      PgHdr *
15e20 70 50 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  pPg;.      int r
15e30 63 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 4d 45  c;..      if( ME
15e40 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 63  MDB ){.        c
15e50 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
15e60 0a 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 65  ..      /* For e
15e70 61 63 68 20 70 61 67 65 72 2c 20 74 72 79 20 74  ach pager, try t
15e80 6f 20 66 72 65 65 20 61 73 20 6d 61 6e 79 20 70  o free as many p
15e90 61 67 65 73 20 61 73 20 70 6f 73 73 69 62 6c 65  ages as possible
15ea0 20 28 77 69 74 68 6f 75 74 20 0a 20 20 20 20 20   (without .     
15eb0 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 73 79 6e   ** calling fsyn
15ec0 63 28 29 20 69 66 20 74 68 69 73 20 69 73 20 74  c() if this is t
15ed0 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69  he first iterati
15ee0 6f 6e 20 6f 66 20 74 68 65 20 6f 75 74 65 72 6d  on of the outerm
15ef0 6f 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  ost .      ** lo
15f00 6f 70 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  op)..      */.  
15f10 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54      while( SQLIT
15f20 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 70 61 67 65  E_OK==(rc = page
15f30 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65 72  r_recycle(pPager
15f40 2c 20 69 2c 20 26 70 50 67 29 29 20 26 26 20 70  , i, &pPg)) && p
15f50 50 67 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  Pg) {.        /*
15f60 20 57 65 27 76 65 20 66 6f 75 6e 64 20 61 20 70   We've found a p
15f70 61 67 65 20 74 6f 20 66 72 65 65 2e 20 41 74 20  age to free. At 
15f80 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70  this point the p
15f90 61 67 65 20 68 61 73 20 62 65 65 6e 20 0a 20 20  age has been .  
15fa0 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f 76 65 64        ** removed
15fb0 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 68   from the page h
15fc0 61 73 68 2d 74 61 62 6c 65 2c 20 66 72 65 65 2d  ash-table, free-
15fd0 6c 69 73 74 20 61 6e 64 20 73 79 6e 63 65 64 2d  list and synced-
15fe0 6c 69 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  list .        **
15ff0 20 28 70 46 69 72 73 74 53 79 6e 63 65 64 29 2e   (pFirstSynced).
16000 20 49 74 20 69 73 20 73 74 69 6c 6c 20 69 6e 20   It is still in 
16010 74 68 65 20 61 6c 6c 20 70 61 67 65 73 20 28 70  the all pages (p
16020 41 6c 6c 29 20 6c 69 73 74 2e 20 0a 20 20 20 20  All) list. .    
16030 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 69 74      ** Remove it
16040 20 66 72 6f 6d 20 74 68 69 73 20 6c 69 73 74 20   from this list 
16050 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 2e 0a  before freeing..
16060 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
16070 20 20 20 2a 2a 20 54 6f 64 6f 3a 20 43 68 65 63     ** Todo: Chec
16080 6b 20 74 68 65 20 50 61 67 65 72 2e 70 53 74 6d  k the Pager.pStm
16090 74 20 6c 69 73 74 20 74 6f 20 6d 61 6b 65 20 73  t list to make s
160a0 75 72 65 20 74 68 69 73 20 69 73 20 4f 6b 2e 20  ure this is Ok. 
160b0 49 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  It .        ** p
160c0 72 6f 62 61 62 6c 79 20 69 73 20 74 68 6f 75 67  robably is thoug
160d0 68 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  h..        */.  
160e0 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 54 6d        PgHdr *pTm
160f0 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  p;.        asser
16100 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 20 20  t( pPg );.      
16110 20 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72    page_remove_fr
16120 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  om_stmt_list(pPg
16130 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
16140 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  Pg==pPager->pAll
16150 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 70   ){.           p
16160 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50  Pager->pAll = pP
16170 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
16180 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16190 20 20 20 20 20 20 66 6f 72 28 20 70 54 6d 70 3d        for( pTmp=
161a0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 54  pPager->pAll; pT
161b0 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 21 3d 70 50  mp->pNextAll!=pP
161c0 67 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e  g; pTmp=pTmp->pN
161d0 65 78 74 41 6c 6c 20 29 7b 7d 0a 20 20 20 20 20  extAll ){}.     
161e0 20 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74       pTmp->pNext
161f0 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  All = pPg->pNext
16200 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  All;.        }. 
16210 20 20 20 20 20 20 20 6e 52 65 6c 65 61 73 65 64         nReleased
16220 20 2b 3d 20 73 71 6c 69 74 65 41 6c 6c 6f 63 53   += sqliteAllocS
16230 69 7a 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ize(pPg);.      
16240 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67    sqliteFree(pPg
16250 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
16260 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16270 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
16280 2a 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * An error occur
16290 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e  ed whilst writin
162a0 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
162b0 65 20 66 69 6c 65 20 6f 72 20 0a 20 20 20 20 20  e file or .     
162c0 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e     ** journal in
162d0 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 29   pager_recycle()
162e0 2e 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 6e  . The error is n
162f0 6f 74 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  ot returned to t
16300 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  he .        ** c
16310 61 6c 6c 65 72 20 6f 66 20 74 68 69 73 20 66 75  aller of this fu
16320 6e 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 2c  nction. Instead,
16330 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 65   set the Pager.e
16340 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e  rrCode variable.
16350 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  .        ** The 
16360 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65  error will be re
16370 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73  turned to the us
16380 65 72 20 28 6f 72 20 75 73 65 72 73 2c 20 69 6e  er (or users, in
16390 20 74 68 65 20 63 61 73 65 20 0a 20 20 20 20 20   the case .     
163a0 20 20 20 2a 2a 20 6f 66 20 61 20 73 68 61 72 65     ** of a share
163b0 64 20 70 61 67 65 72 20 63 61 63 68 65 29 20 6f  d pager cache) o
163c0 66 20 74 68 65 20 70 61 67 65 72 20 66 6f 72 20  f the pager for 
163d0 77 68 69 63 68 20 74 68 65 20 65 72 72 6f 72 20  which the error 
163e0 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 20 20 20  occured..       
163f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
16400 72 74 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53  rt( (rc&0xff)==S
16410 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 20 72  QLITE_IOERR || r
16420 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  c==SQLITE_FULL )
16430 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
16440 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
16450 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
16460 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  );.        pager
16470 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
16480 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
16490 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
164a0 6e 52 65 6c 65 61 73 65 64 3b 0a 7d 0a 23 65 6e  nReleased;.}.#en
164b0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
164c0 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
164d0 47 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  GEMENT */../*.**
164e0 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   Read the conten
164f0 74 20 6f 66 20 70 61 67 65 20 70 50 67 20 6f 75  t of page pPg ou
16500 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
16510 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
16520 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67 65  c int readDbPage
16530 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
16540 50 67 48 64 72 20 2a 70 50 67 2c 20 50 67 6e 6f  PgHdr *pPg, Pgno
16550 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63   pgno){.  int rc
16560 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 45 4d 44  ;.  assert( MEMD
16570 42 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73  B==0 );.  rc = s
16580 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
16590 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31  ger->fd, (pgno-1
165a0 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
165b0 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  ageSize);.  if( 
165c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
165d0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
165e0 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
165f0 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  fd, PGHDR_TO_DAT
16600 41 28 70 50 67 29 2c 0a 20 20 20 20 20 20 20 20  A(pPg),.        
16610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16620 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
16630 7a 65 29 3b 0a 20 20 7d 0a 20 20 49 4f 54 52 41  ze);.  }.  IOTRA
16640 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c  CE(("PGIN %p %d\
16650 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
16660 29 29 0a 20 20 50 41 47 45 52 54 52 41 43 45 33  )).  PAGERTRACE3
16670 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20  ("FETCH %d page 
16680 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
16690 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
166a0 6f 29 3b 0a 20 20 43 4f 44 45 43 31 28 70 50 61  o);.  CODEC1(pPa
166b0 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  ger, PGHDR_TO_DA
166c0 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70 67  TA(pPg), pPg->pg
166d0 6e 6f 2c 20 33 29 3b 0a 20 20 72 65 74 75 72 6e  no, 3);.  return
166e0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
166f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
16700 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e  called to obtain
16710 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
16720 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65   required before
16730 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62 65 20  .** data may be 
16740 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61  read from the pa
16750 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68  ger cache. If th
16760 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 68 61  e shared lock ha
16770 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65  s already.** bee
16780 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 69 73  n obtained, this
16790 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
167a0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65  o-op..**.** Imme
167b0 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62  diately after ob
167c0 74 61 69 6e 69 6e 67 20 74 68 65 20 73 68 61 72  taining the shar
167d0 65 64 20 6c 6f 63 6b 20 28 69 66 20 72 65 71 75  ed lock (if requ
167e0 69 72 65 64 29 2c 20 74 68 69 73 20 66 75 6e 63  ired), this func
167f0 74 69 6f 6e 0a 2a 2a 20 63 68 65 63 6b 73 20 66  tion.** checks f
16800 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
16810 20 66 69 6c 65 2e 20 49 66 20 6f 6e 65 20 69 73   file. If one is
16820 20 66 6f 75 6e 64 2c 20 61 6e 20 65 6d 65 72 67   found, an emerg
16830 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  ency rollback.**
16840 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 69 6d   is performed im
16850 6d 65 64 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74  mediately..*/.st
16860 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 68  atic int pagerSh
16870 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a  aredLock(Pager *
16880 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
16890 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
168a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
168b0 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
168c0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 21 4d 45  K ){.    if( !ME
168d0 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 61 73 73  MDB ){.      ass
168e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
168f0 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  f==0 );.      if
16900 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  ( !pPager->noRea
16910 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  dlock ){.       
16920 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
16930 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
16940 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
16950 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
16960 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16970 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67        return pag
16980 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
16990 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   rc);.        }.
169a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
169b0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53  pPager->state>=S
169c0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
169d0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f      }.  .      /
169e0 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  * If a journal f
169f0 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20  ile exists, and 
16a00 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45  there is no RESE
16a10 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
16a20 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
16a30 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  se file, then it
16a40 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f   either needs to
16a50 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
16a60 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  or deleted..    
16a70 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 68    */.      if( h
16a80 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  asHotJournal(pPa
16a90 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
16aa0 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
16ab0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
16ac0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
16ad0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
16ae0 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6d  is.        ** im
16af0 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52  portant that a R
16b00 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
16b10 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20  not obtained on 
16b20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20  the way to the. 
16b30 20 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53         ** EXCLUS
16b40 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20  IVE lock. If it 
16b50 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72  were, another pr
16b60 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e  ocess might open
16b70 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
16b80 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64  database file, d
16b90 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56  etect the RESERV
16ba0 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e  ED lock, and con
16bb0 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20  clude that the. 
16bc0 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61         ** databa
16bd0 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  se is safe to re
16be0 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72  ad while this pr
16bf0 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72  ocess is still r
16c00 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20 20 20  olling it .     
16c10 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20     ** back..    
16c20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20      ** .        
16c30 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69  ** Because the i
16c40 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45  ntermediate RESE
16c50 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
16c60 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a   requested, the.
16c70 20 20 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e          ** secon
16c80 64 20 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67  d process will g
16c90 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  et to this point
16ca0 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64   in the code and
16cb0 20 66 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 20   fail to.       
16cc0 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74 27 73 20   ** obtain it's 
16cd0 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  own EXCLUSIVE lo
16ce0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
16cf0 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  se file..       
16d00 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
16d10 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
16d20 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55  Pager->fd, EXCLU
16d30 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
16d40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
16d50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
16d60 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
16d70 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
16d80 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
16d90 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
16da0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
16db0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
16dc0 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
16dd0 53 49 56 45 3b 0a 20 0a 20 20 20 20 20 20 20 20  SIVE;. .        
16de0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
16df0 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e 67 20  nal for reading 
16e00 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 53 51  only.  Return SQ
16e10 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20 20 20  LITE_BUSY if.   
16e20 20 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20 75       ** we are u
16e30 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68  nable to open th
16e40 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
16e50 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
16e60 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e      ** The journ
16e70 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
16e80 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b   need to be lock
16e90 65 64 20 69 74 73 65 6c 66 2e 20 20 54 68 65 0a  ed itself.  The.
16ea0 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e          ** journ
16eb0 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72  al file is never
16ec0 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74 68 65   open unless the
16ed0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
16ee0 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20 20 20  ile holds.      
16ef0 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63    ** a write loc
16f00 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e  k, so there is n
16f10 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63 65 20  ever any chance 
16f20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20  of two or more. 
16f30 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
16f40 73 65 73 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  ses opening the 
16f50 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 65 20 73  journal at the s
16f60 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 20 20  ame time..      
16f70 20 20 2a 2a 0a 09 2a 2a 20 4f 70 65 6e 20 74 68    **..** Open th
16f80 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65  e journal for re
16f90 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e  ad/write access.
16fa0 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
16fb0 20 69 6e 20 0a 09 2a 2a 20 65 78 63 6c 75 73 69   in ..** exclusi
16fc0 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74  ve-access mode t
16fd0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
16fe0 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20  or will be kept 
16ff0 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20 20  open and.       
17000 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75 73 65   ** possibly use
17010 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  d for a transact
17020 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e  ion later on. On
17030 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 74   some systems, t
17040 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 73  he.        ** Os
17050 54 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20  Truncate() call 
17060 75 73 65 64 20 69 6e 20 65 78 63 6c 75 73 69 76  used in exclusiv
17070 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 61 6c  e-access mode al
17080 73 6f 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  so requires.    
17090 20 20 20 20 2a 2a 20 61 20 72 65 61 64 2f 77 72      ** a read/wr
170a0 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e  ite file handle.
170b0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
170c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
170d0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 69 66  BUSY;.        if
170e0 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45  ( sqlite3OsFileE
170f0 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a  xists(pPager->zJ
17100 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20  ournal) ){.     
17110 20 20 20 20 20 69 6e 74 20 72 6f 3b 0a 20 20 20       int ro;.   
17120 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
17130 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
17140 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
17150 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
17160 52 65 61 64 57 72 69 74 65 28 70 50 61 67 65 72  ReadWrite(pPager
17170 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61  ->zJournal, &pPa
17180 67 65 72 2d 3e 6a 66 64 2c 20 26 72 6f 29 3b 0a  ger->jfd, &ro);.
17190 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
171a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
171b0 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 29  || pPager->jfd )
171c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
171d0 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ro ){.          
171e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
171f0 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  SY;.            
17200 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
17210 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
17220 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17230 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
17240 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17250 0a 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72  .          pager
17260 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
17270 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
17280 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
17290 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
172a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
172b0 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Open = 1;.      
172c0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
172d0 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
172e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
172f0 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
17300 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65        pPager->se
17310 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  tMaster = 0;.   
17320 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
17330 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20  rnalHdr = 0;. . 
17340 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61         /* Playba
17350 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ck and delete th
17360 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70  e journal.  Drop
17370 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72   the database wr
17380 69 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c  ite.        ** l
17390 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
173a0 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
173b0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
173c0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
173d0 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
173e0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
173f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17400 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
17410 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
17420 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
17430 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
17440 65 72 74 28 70 50 61 67 65 72 2d 3e 73 74 61 74  ert(pPager->stat
17450 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e==PAGER_SHARED 
17460 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
17470 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  (pPager->exclusi
17480 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
17490 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48  ->state>PAGER_SH
174a0 41 52 45 44 29 0a 20 20 20 20 20 20 20 20 29 3b  ARED).        );
174b0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
174c0 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c  if( pPager->pAll
174d0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
174e0 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68  he shared-lock h
174f0 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71  as just been acq
17500 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74  uired on the dat
17510 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20  abase file.     
17520 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20     ** and there 
17530 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67 65  are already page
17540 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 28  s in the cache (
17550 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a  from a previous.
17560 20 20 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20          ** read 
17570 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
17580 74 69 6f 6e 29 2e 20 49 66 20 74 68 65 20 76 61  tion). If the va
17590 6c 75 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67  lue of the chang
175a0 65 2d 63 6f 75 6e 74 65 72 0a 20 20 20 20 20 20  e-counter.      
175b0 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 50    ** stored in P
175c0 61 67 65 72 2e 69 43 68 61 6e 67 65 43 6f 75 6e  ager.iChangeCoun
175d0 74 20 6d 61 74 63 68 65 73 20 74 68 61 74 20 66  t matches that f
175e0 6f 75 6e 64 20 6f 6e 20 70 61 67 65 20 31 20 6f  ound on page 1 o
175f0 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
17600 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
17610 74 68 65 6e 20 6e 6f 20 64 61 74 61 62 61 73 65  then no database
17620 20 63 68 61 6e 67 65 73 20 68 61 76 65 20 6f 63   changes have oc
17630 63 75 72 65 64 20 73 69 6e 63 65 0a 20 20 20 20  cured since.    
17640 20 20 20 20 2a 2a 20 74 68 65 20 63 61 63 68 65      ** the cache
17650 20 77 61 73 20 6c 61 73 74 20 76 61 6c 69 64 20   was last valid 
17660 61 6e 64 20 69 74 20 69 73 20 73 61 66 65 20 74  and it is safe t
17670 6f 20 72 65 74 61 69 6e 20 74 68 65 20 63 61 63  o retain the cac
17680 68 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  hed.        ** p
17690 61 67 65 73 2e 20 4f 74 68 65 72 77 69 73 65 2c  ages. Otherwise,
176a0 20 69 66 20 50 61 67 65 72 2e 69 43 68 61 6e 67   if Pager.iChang
176b0 65 43 6f 75 6e 74 20 64 6f 65 73 20 6e 6f 74 20  eCount does not 
176c0 6d 61 74 63 68 20 74 68 65 0a 20 20 20 20 20 20  match the.      
176d0 20 20 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e    ** change-coun
176e0 74 65 72 20 6f 6e 20 70 61 67 65 20 31 20 6f 66  ter on page 1 of
176f0 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20 63   the file, the c
17700 75 72 72 65 6e 74 20 63 61 63 68 65 20 63 6f 6e  urrent cache con
17710 74 65 6e 74 73 0a 20 20 20 20 20 20 20 20 2a 2a  tents.        **
17720 20 6d 75 73 74 20 62 65 20 64 69 73 63 61 72 64   must be discard
17730 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
17740 20 20 20 20 20 20 20 75 38 20 7a 43 5b 34 5d 3b         u8 zC[4];
17750 0a 20 20 20 20 20 20 20 20 75 33 32 20 69 43 68  .        u32 iCh
17760 61 6e 67 65 43 6f 75 6e 74 65 72 20 3d 20 30 3b  angeCounter = 0;
17770 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17780 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
17790 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 20  Pager);..       
177a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
177b0 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Code ){.        
177c0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
177d0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20  >errCode;.      
177e0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28    }..        if(
177f0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
17800 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
17810 2a 20 52 65 61 64 20 74 68 65 20 34 2d 62 79 74  * Read the 4-byt
17820 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
17830 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74   directly from t
17840 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  he file. */.    
17850 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
17860 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
17870 3e 66 64 2c 20 32 34 29 3b 0a 20 20 20 20 20 20  >fd, 24);.      
17880 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17890 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
178a0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
178b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
178c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
178d0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
178e0 3e 66 64 2c 20 7a 43 2c 20 34 29 3b 0a 20 20 20  >fd, zC, 4);.   
178f0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
17900 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17910 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
17920 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  c;.          }. 
17930 20 20 20 20 20 20 20 20 20 69 43 68 61 6e 67 65           iChange
17940 43 6f 75 6e 74 65 72 20 3d 20 28 7a 43 5b 30 5d  Counter = (zC[0]
17950 3c 3c 32 34 29 20 2b 20 28 7a 43 5b 31 5d 3c 3c  <<24) + (zC[1]<<
17960 31 36 29 20 2b 20 28 7a 43 5b 32 5d 3c 3c 38 29  16) + (zC[2]<<8)
17970 20 2b 20 7a 43 5b 33 5d 3b 0a 20 20 20 20 20 20   + zC[3];.      
17980 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28    }..        if(
17990 20 69 43 68 61 6e 67 65 43 6f 75 6e 74 65 72 21   iChangeCounter!
179a0 3d 70 50 61 67 65 72 2d 3e 69 43 68 61 6e 67 65  =pPager->iChange
179b0 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  Count ){.       
179c0 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
179d0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
179e0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
179f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
17a00 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
17a10 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61  e || pPager->sta
17a20 74 65 3c 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te<=PAGER_SHARED
17a30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
17a40 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
17a50 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  _UNLOCK ){.     
17a60 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
17a70 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
17a80 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
17a90 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
17aa0 41 6c 6c 6f 63 61 74 65 20 61 20 50 67 48 64 72  Allocate a PgHdr
17ab0 20 6f 62 6a 65 63 74 2e 20 20 20 45 69 74 68 65   object.   Eithe
17ac0 72 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f  r create a new o
17ad0 6e 65 20 6f 72 20 72 65 75 73 65 0a 2a 2a 20 61  ne or reuse.** a
17ae0 6e 20 65 78 69 73 74 69 6e 67 20 6f 6e 65 20 74  n existing one t
17af0 68 61 74 20 69 73 20 6e 6f 74 20 6f 74 68 65 72  hat is not other
17b00 77 69 73 65 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a  wise in use..**.
17b10 2a 2a 20 41 20 6e 65 77 20 50 67 48 64 72 20 73  ** A new PgHdr s
17b20 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61  tructure is crea
17b30 74 65 64 20 69 66 20 61 6e 79 20 6f 66 20 74 68  ted if any of th
17b40 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 0a  e following are.
17b50 2a 2a 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  ** true:.**.**  
17b60 20 20 20 28 31 29 20 20 57 65 20 68 61 76 65 20     (1)  We have 
17b70 6e 6f 74 20 65 78 63 65 65 64 65 64 20 6f 75 72  not exceeded our
17b80 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 63 61 74   maximum allocat
17b90 65 64 20 63 61 63 68 65 20 73 69 7a 65 0a 2a 2a  ed cache size.**
17ba0 20 20 20 20 20 20 20 20 20 20 61 73 20 73 65 74            as set
17bb0 20 62 79 20 74 68 65 20 22 50 52 41 47 4d 41 20   by the "PRAGMA 
17bc0 63 61 63 68 65 5f 73 69 7a 65 22 20 63 6f 6d 6d  cache_size" comm
17bd0 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  and..**.**     (
17be0 32 29 20 20 54 68 65 72 65 20 61 72 65 20 6e 6f  2)  There are no
17bf0 20 75 6e 75 73 65 64 20 50 67 48 64 72 20 6f 62   unused PgHdr ob
17c00 6a 65 63 74 73 20 61 76 61 69 6c 61 62 6c 65 20  jects available 
17c10 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 2a 2a  at this time..**
17c20 0a 2a 2a 20 20 20 20 20 28 33 29 20 20 54 68 69  .**     (3)  Thi
17c30 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  s is an in-memor
17c40 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  y database..**.*
17c50 2a 20 20 20 20 20 28 34 29 20 20 54 68 65 72 65  *     (4)  There
17c60 20 61 72 65 20 6e 6f 20 50 67 48 64 72 20 6f 62   are no PgHdr ob
17c70 6a 65 63 74 73 20 74 68 61 74 20 64 6f 20 6e 6f  jects that do no
17c80 74 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72  t require a jour
17c90 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  nal.**          
17ca0 66 69 6c 65 20 73 79 6e 63 20 61 6e 64 20 61 20  file sync and a 
17cb0 73 79 6e 63 20 6f 66 20 74 68 65 20 6a 6f 75 72  sync of the jour
17cc0 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 75 72 72  nal file is curr
17cd0 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20  ently.**        
17ce0 20 20 70 72 6f 68 69 62 69 74 65 64 2e 0a 2a 2a    prohibited..**
17cf0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72  .** Otherwise, r
17d00 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  euse an existing
17d10 20 50 67 48 64 72 2e 20 20 49 6e 20 6f 74 68 65   PgHdr.  In othe
17d20 72 20 77 6f 72 64 73 2c 20 72 65 75 73 65 20 61  r words, reuse a
17d30 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 50 67  n.** existing Pg
17d40 48 64 72 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  Hdr if all of th
17d50 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
17d60 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  true:.**.**     
17d70 28 31 29 20 20 57 65 20 68 61 76 65 20 72 65 61  (1)  We have rea
17d80 63 68 65 64 20 6f 72 20 65 78 63 65 65 64 65 64  ched or exceeded
17d90 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 63 61 63   the maximum cac
17da0 68 65 20 73 69 7a 65 0a 2a 2a 20 20 20 20 20 20  he size.**      
17db0 20 20 20 20 61 6c 6c 6f 77 65 64 20 62 79 20 22      allowed by "
17dc0 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
17dd0 65 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 32  e"..**.**     (2
17de0 29 20 20 54 68 65 72 65 20 69 73 20 61 20 50 67  )  There is a Pg
17df0 48 64 72 20 61 76 61 69 6c 61 62 6c 65 20 77 69  Hdr available wi
17e00 74 68 20 50 67 48 64 72 2d 3e 6e 52 65 66 3d 3d  th PgHdr->nRef==
17e10 30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 33 29 20  0.**.**     (3) 
17e20 20 57 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 61   We are not in a
17e30 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
17e40 62 61 73 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  base.**.**     (
17e50 34 29 20 20 45 69 74 68 65 72 20 74 68 65 72 65  4)  Either there
17e60 20 69 73 20 61 6e 20 61 76 61 69 6c 61 62 6c 65   is an available
17e70 20 50 67 48 64 72 20 74 68 61 74 20 64 6f 65 73   PgHdr that does
17e80 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a 20 20 20 20   not need.**    
17e90 20 20 20 20 20 20 74 6f 20 62 65 20 73 79 6e 63        to be sync
17ea0 65 64 20 74 6f 20 64 69 73 6b 20 6f 72 20 65 6c  ed to disk or el
17eb0 73 65 20 64 69 73 6b 20 73 79 6e 63 69 6e 67 20  se disk syncing 
17ec0 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  is currently.** 
17ed0 20 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 65 64           allowed
17ee0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17ef0 70 61 67 65 72 41 6c 6c 6f 63 61 74 65 50 61 67  pagerAllocatePag
17f00 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
17f10 20 50 67 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a   PgHdr **ppPg){.
17f20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
17f30 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70  E_OK;.  PgHdr *p
17f40 50 67 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65  Pg;..  /* Create
17f50 20 61 20 6e 65 77 20 50 67 48 64 72 20 69 66 20   a new PgHdr if 
17f60 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 75 72 20  any of the four 
17f70 63 6f 6e 64 69 74 69 6f 6e 73 20 64 65 66 69 6e  conditions defin
17f80 65 64 20 0a 20 20 2a 2a 20 61 62 6f 76 65 20 69  ed .  ** above i
17f90 73 20 6d 65 74 3a 20 2a 2f 0a 20 20 69 66 28 20  s met: */.  if( 
17fa0 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50  pPager->nPage<pP
17fb0 61 67 65 72 2d 3e 6d 78 50 61 67 65 0a 20 20 20  ager->mxPage.   
17fc0 7c 7c 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  || pPager->pFirs
17fd0 74 3d 3d 30 20 0a 20 20 20 7c 7c 20 4d 45 4d 44  t==0 .   || MEMD
17fe0 42 0a 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d  B.   || (pPager-
17ff0 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30  >pFirstSynced==0
18000 20 26 26 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f   && pPager->doNo
18010 74 53 79 6e 63 29 0a 20 20 29 7b 0a 20 20 20 20  tSync).  ){.    
18020 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  if( pPager->nPag
18030 65 3e 3d 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  e>=pPager->nHash
18040 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
18050 72 65 73 69 7a 65 5f 68 61 73 68 5f 74 61 62 6c  resize_hash_tabl
18060 65 28 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20  e(pPager,.      
18070 20 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68     pPager->nHash
18080 3c 32 35 36 20 3f 20 32 35 36 20 3a 20 70 50 61  <256 ? 256 : pPa
18090 67 65 72 2d 3e 6e 48 61 73 68 2a 32 29 3b 0a 20  ger->nHash*2);. 
180a0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
180b0 3e 6e 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20  >nHash==0 ){.   
180c0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
180d0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
180e0 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63  goto pager_alloc
180f0 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ate_out;.      }
18100 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d  .    }.    pPg =
18110 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
18120 28 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b  ( sizeof(*pPg) +
18130 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
18140 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
18150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
18160 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70 50  sizeof(u32) + pP
18170 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20  ager->nExtra.   
18180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18190 20 20 20 20 20 20 20 20 20 2b 20 4d 45 4d 44 42           + MEMDB
181a0 2a 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72  *sizeof(PgHistor
181b0 79 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  y) );.    if( pP
181c0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  g==0 ){.      rc
181d0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
181e0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
181f0 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a  r_allocate_out;.
18200 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
18210 28 70 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (pPg, 0, sizeof(
18220 2a 70 50 67 29 29 3b 0a 20 20 20 20 69 66 28 20  *pPg));.    if( 
18230 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 6d  MEMDB ){.      m
18240 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 48  emset(PGHDR_TO_H
18250 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
18260 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 67 48 69  , 0, sizeof(PgHi
18270 73 74 6f 72 79 29 29 3b 0a 20 20 20 20 7d 0a 20  story));.    }. 
18280 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d     pPg->pPager =
18290 20 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67   pPager;.    pPg
182a0 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61  ->pNextAll = pPa
182b0 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 70  ger->pAll;.    p
182c0 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50  Pager->pAll = pP
182d0 67 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  g;.    pPager->n
182e0 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Page++;.    if( 
182f0 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e 70 50  pPager->nPage>pP
18300 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 20 29  ager->nMaxPage )
18310 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
18320 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65  pPager->nMaxPage
18330 3d 3d 28 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  ==(pPager->nPage
18340 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 70 50 61  -1) );.      pPa
18350 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 2b 2b 3b  ger->nMaxPage++;
18360 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
18370 20 20 20 20 2f 2a 20 52 65 63 79 63 6c 65 20 61      /* Recycle a
18380 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20  n existing page 
18390 77 69 74 68 20 61 20 7a 65 72 6f 20 72 65 66 2d  with a zero ref-
183a0 63 6f 75 6e 74 2e 20 2a 2f 0a 20 20 20 20 72 63  count. */.    rc
183b0 20 3d 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65   = pager_recycle
183c0 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67  (pPager, 1, &pPg
183d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
183e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
183f0 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c    goto pager_all
18400 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  ocate_out;.    }
18410 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
18420 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52  ger->state>=SHAR
18430 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  ED_LOCK );.    a
18440 73 73 65 72 74 28 70 50 67 29 3b 0a 20 20 7d 0a  ssert(pPg);.  }.
18450 20 20 2a 70 70 50 67 20 3d 20 70 50 67 3b 0a 0a    *ppPg = pPg;..
18460 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f  pager_allocate_o
18470 75 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ut:.  return rc;
18480 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
18490 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  e a page..**.** 
184a0 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  A read lock on t
184b0 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20  he disk file is 
184c0 6f 62 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68  obtained when th
184d0 65 20 66 69 72 73 74 20 70 61 67 65 20 69 73 20  e first page is 
184e0 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68  acquired. .** Th
184f0 69 73 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20  is read lock is 
18500 64 72 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65  dropped when the
18510 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65   last page is re
18520 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20  leased..**.** A 
18530 5f 67 65 74 20 77 6f 72 6b 73 20 66 6f 72 20 61  _get works for a
18540 6e 79 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67  ny page number g
18550 72 65 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20  reater than 0.  
18560 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  If the database.
18570 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c  ** file is small
18580 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75  er than the requ
18590 65 73 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e  ested page, then
185a0 20 6e 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a   no actual disk.
185b0 2a 2a 20 72 65 61 64 20 6f 63 63 75 72 73 20 61  ** read occurs a
185c0 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d  nd the memory im
185d0 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65 20  age of the page 
185e0 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
185f0 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20  o.** all zeros. 
18600 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20   The extra data 
18610 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61  appended to a pa
18620 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69  ge is always ini
18630 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a  tialized.** to z
18640 65 72 6f 73 20 74 68 65 20 66 69 72 73 74 20 74  eros the first t
18650 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f  ime a page is lo
18660 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  aded into memory
18670 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75  ..**.** The acqu
18680 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61  isition might fa
18690 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72  il for several r
186a0 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20  easons.  In all 
186b0 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70  cases,.** an app
186c0 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
186d0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
186e0 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73  and *ppPage is s
186f0 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
18700 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
18710 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e  e3PagerLookup().
18720 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74    Both this rout
18730 69 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b 75 70 28  ine and _lookup(
18740 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20  ) attempt.** to 
18750 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  find a page in t
18760 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
18770 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68  he first.  If th
18780 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
18790 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  ready.** in memo
187a0 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ry, this routine
187b0 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f   goes to disk to
187c0 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72   read it in wher
187d0 65 61 73 20 5f 6c 6f 6f 6b 75 70 28 29 0a 2a 2a  eas _lookup().**
187e0 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e   just returns 0.
187f0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
18800 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c  cquires a read-l
18810 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69  ock the first ti
18820 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20  me it.** has to 
18830 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20  go to disk, and 
18840 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62  could also playb
18850 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  ack an old journ
18860 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
18870 0a 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f 6f 6b 75  .** Since _looku
18880 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74  p() never goes t
18890 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72  o disk, it never
188a0 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74   has to deal wit
188b0 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f  h locks.** or jo
188c0 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  urnal files..**.
188d0 2a 2a 20 49 66 20 63 6c 72 46 6c 61 67 20 69 73  ** If clrFlag is
188e0 20 66 61 6c 73 65 2c 20 74 68 65 20 70 61 67 65   false, the page
188f0 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 61 63   contents are ac
18900 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  tually read from
18910 20 64 69 73 6b 2e 0a 2a 2a 20 49 66 20 63 6c 66   disk..** If clf
18920 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 69 74  Flag is true, it
18930 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
18940 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 65  is about to be e
18950 72 61 73 65 64 20 61 6e 64 0a 2a 2a 20 72 65 77  rased and.** rew
18960 72 69 74 74 65 6e 20 77 69 74 68 6f 75 74 20 66  ritten without f
18970 69 72 73 74 20 62 65 69 6e 67 20 72 65 61 64 20  irst being read 
18980 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70  so there is no p
18990 6f 69 6e 74 20 69 74 20 64 6f 69 6e 67 0a 2a 2a  oint it doing.**
189a0 20 74 68 65 20 64 69 73 6b 20 49 2f 4f 2e 0a 2a   the disk I/O..*
189b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
189c0 65 72 41 63 71 75 69 72 65 28 50 61 67 65 72 20  erAcquire(Pager 
189d0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
189e0 6e 6f 2c 20 44 62 50 61 67 65 20 2a 2a 70 70 50  no, DbPage **ppP
189f0 61 67 65 2c 20 69 6e 74 20 63 6c 72 46 6c 61 67  age, int clrFlag
18a00 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
18a10 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
18a20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
18a30 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
18a40 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 52 65  K || pPager->nRe
18a50 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20 29  f>0 || pgno==1 )
18a60 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78 69  ;..  /* The maxi
18a70 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20  mum page number 
18a80 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20  is 2^31. Return 
18a90 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
18aa0 66 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75  f a page.  ** nu
18ab0 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
18ac0 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c  n this, or zero,
18ad0 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20   is requested.. 
18ae0 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50   */.  if( pgno>P
18af0 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c  AGER_MAX_PGNO ||
18b00 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f   pgno==0 || pgno
18b10 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
18b20 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
18b30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
18b40 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
18b50 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77    /* Make sure w
18b60 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61  e have not hit a
18b70 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f  ny critical erro
18b80 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65  rs..  */ .  asse
18b90 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
18ba0 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a  .  *ppPage = 0;.
18bb0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
18bc0 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  rCode && pPager-
18bd0 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
18be0 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74  _FULL ){.    ret
18bf0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
18c00 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ode;.  }..  /* I
18c10 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
18c20 72 73 74 20 70 61 67 65 20 61 63 63 65 73 73 65  rst page accesse
18c30 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53 48  d, then get a SH
18c40 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f  ARED lock.  ** o
18c50 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
18c60 69 6c 65 2e 20 70 61 67 65 72 53 68 61 72 65 64  ile. pagerShared
18c70 4c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f  Lock() is a no-o
18c80 70 20 69 66 20 0a 20 20 2a 2a 20 61 20 64 61 74  p if .  ** a dat
18c90 61 62 61 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c  abase lock is al
18ca0 72 65 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f  ready held..  */
18cb0 0a 20 20 72 63 20 3d 20 70 61 67 65 72 53 68 61  .  rc = pagerSha
18cc0 72 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b  redLock(pPager);
18cd0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
18ce0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
18cf0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
18d00 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
18d10 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
18d20 20 29 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67   );..  pPg = pag
18d30 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
18d40 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
18d50 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  Pg==0 ){.    /* 
18d60 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  The requested pa
18d70 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  ge is not in the
18d80 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a   page cache. */.
18d90 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20      int nMax;.  
18da0 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 54 45 53    int h;.    TES
18db0 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  T_INCR(pPager->n
18dc0 4d 69 73 73 29 3b 0a 20 20 20 20 72 63 20 3d 20  Miss);.    rc = 
18dd0 70 61 67 65 72 41 6c 6c 6f 63 61 74 65 50 61 67  pagerAllocatePag
18de0 65 28 70 50 61 67 65 72 2c 20 26 70 50 67 29 3b  e(pPager, &pPg);
18df0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
18e00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18e10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
18e20 0a 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20  ..    pPg->pgno 
18e30 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20  = pgno;.    if( 
18e40 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
18e50 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c  al && (int)pgno<
18e60 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  =pPager->origDbS
18e70 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ize ){.      sql
18e80 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f 72 79 28  ite3CheckMemory(
18e90 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
18ea0 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20 20 20  al, pgno/8);.   
18eb0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
18ec0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
18ed0 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  ;.      pPg->inJ
18ee0 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67 65 72  ournal = (pPager
18ef0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e  ->aInJournal[pgn
18f00 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f  o/8] & (1<<(pgno
18f10 26 37 29 29 29 21 3d 30 3b 0a 20 20 20 20 20 20  &7)))!=0;.      
18f20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
18f30 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
18f40 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
18f50 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  al = 0;.      pP
18f60 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
18f70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
18f80 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 26  Pager->aInStmt &
18f90 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61  & (int)pgno<=pPa
18fa0 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 0a 20 20  ger->stmtSize.  
18fb0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
18fc0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70  Pager->aInStmt[p
18fd0 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67  gno/8] & (1<<(pg
18fe0 6e 6f 26 37 29 29 29 21 3d 30 20 29 7b 0a 20 20  no&7)))!=0 ){.  
18ff0 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f      page_add_to_
19000 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
19010 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19020 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f   page_remove_fro
19030 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  m_stmt_list(pPg)
19040 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 61 6b 65  ;.    }.    make
19050 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20  Clean(pPg);.    
19060 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  pPg->nRef = 1;. 
19070 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b     REFINFO(pPg);
19080 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ..    pPager->nR
19090 65 66 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 50  ef++;.    if( pP
190a0 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29  ager->nExtra>0 )
190b0 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50  {.      memset(P
190c0 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50  GHDR_TO_EXTRA(pP
190d0 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70  g, pPager), 0, p
190e0 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a  Pager->nExtra);.
190f0 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78 20 3d      }.    nMax =
19100 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
19110 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
19120 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
19130 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20  errCode ){.     
19140 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
19150 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 72  ef(pPg);.      r
19160 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
19170 6f 64 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ode;.      retur
19180 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
19190 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65   /* Populate the
191a0 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61 2c   page with data,
191b0 20 65 69 74 68 65 72 20 62 79 20 72 65 61 64 69   either by readi
191c0 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ng from the data
191d0 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
191e0 2c 20 6f 72 20 62 79 20 73 65 74 74 69 6e 67 20  , or by setting 
191f0 74 68 65 20 65 6e 74 69 72 65 20 70 61 67 65 20  the entire page 
19200 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a  to zero..    */.
19210 20 20 20 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e      if( nMax<(in
19220 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20  t)pgno || MEMDB 
19230 7c 7c 20 28 63 6c 72 46 6c 61 67 20 26 26 20 21  || (clrFlag && !
19240 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
19250 6c 6c 62 61 63 6b 29 20 29 7b 0a 20 20 20 20 20  llback) ){.     
19260 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
19270 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70  _DATA(pPg), 0, p
19280 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
19290 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
192a0 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61     rc = readDbPa
192b0 67 65 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20  ge(pPager, pPg, 
192c0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
192d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
192e0 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  & rc!=SQLITE_IOE
192f0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
19300 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67  .        pPg->pg
19310 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  no = 0;.        
19320 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
19330 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  f(pPg);.        
19340 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
19350 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19360 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72  TEST_INCR(pPager
19370 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20  ->nRead);.      
19380 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
19390 4c 69 6e 6b 20 74 68 65 20 70 61 67 65 20 69 6e  Link the page in
193a0 74 6f 20 74 68 65 20 70 61 67 65 20 68 61 73 68  to the page hash
193b0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 68 20   table */.    h 
193c0 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72  = pgno & (pPager
193d0 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20  ->nHash-1);.    
193e0 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
193f0 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  );.    pPg->pNex
19400 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e  tHash = pPager->
19410 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50  aHash[h];.    pP
19420 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d  ager->aHash[h] =
19430 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50   pPg;.    if( pP
19440 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a  g->pNextHash ){.
19450 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
19460 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50  g->pNextHash->pP
19470 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20  revHash==0 );.  
19480 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
19490 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  sh->pPrevHash = 
194a0 70 50 67 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  pPg;.    }..#ifd
194b0 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
194c0 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70  PAGES.    pPg->p
194d0 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
194e0 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
194f0 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
19500 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
19510 74 65 64 20 70 61 67 65 20 69 73 20 69 6e 20 74  ted page is in t
19520 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a  he page cache. *
19530 2f 0a 20 20 20 20 61 73 73 65 72 74 28 70 50 61  /.    assert(pPa
19540 67 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70  ger->nRef>0 || p
19550 67 6e 6f 3d 3d 31 29 3b 0a 20 20 20 20 54 45 53  gno==1);.    TES
19560 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  T_INCR(pPager->n
19570 48 69 74 29 3b 0a 20 20 20 20 70 61 67 65 5f 72  Hit);.    page_r
19580 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a  ef(pPg);.  }.  *
19590 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a 20 20  ppPage = pPg;.  
195a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
195b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
195c0 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20  re a page if it 
195d0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
195e0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
195f0 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65  e.  Do.** not re
19600 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ad the page from
19610 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61   disk.  Return a
19620 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
19630 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66  page,.** or 0 if
19640 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
19650 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a   in cache..**.**
19660 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
19670 33 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68  3PagerGet().  Th
19680 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
19690 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
196a0 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33  e.** and sqlite3
196b0 50 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68  PagerGet() is th
196c0 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67  at _get() will g
196d0 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e  o to the disk an
196e0 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65  d read.** in the
196f0 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67   page if the pag
19700 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
19710 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73   in cache.  This
19720 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
19730 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  rns NULL if the 
19740 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
19750 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73  ache or if a dis
19760 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  k I/O error .** 
19770 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65  has ever happene
19780 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71  d..*/.DbPage *sq
19790 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
197a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
197b0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
197c0 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73  Hdr *pPg;..  ass
197d0 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
197e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
197f0 21 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 50  !=0 );..  if( pP
19800 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
19810 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  ER_UNLOCK ){.   
19820 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
19830 2d 3e 70 41 6c 6c 20 7c 7c 20 70 50 61 67 65 72  ->pAll || pPager
19840 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
19850 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
19860 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
19870 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50  r->errCode && pP
19880 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
19890 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20  QLITE_FULL ){.  
198a0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
198b0 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
198c0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
198d0 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d 30  o);.  if( pPg==0
198e0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
198f0 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
19900 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f  return pPg;.}../
19910 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70  *.** Release a p
19920 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  age..**.** If th
19930 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
19940 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
19950 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c  ge drop to zero,
19960 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67   then the.** pag
19970 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
19980 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65  e LRU list.  Whe
19990 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  n all references
199a0 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a   to all pages.**
199b0 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61   are released, a
199c0 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
199d0 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
199e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
199f0 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a  .** removed..*/.
19a00 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
19a10 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70 50  Unref(DbPage *pP
19a20 67 29 7b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d  g){..  /* Decrem
19a30 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
19a40 65 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73  e count for this
19a50 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 61 73 73   page.  */.  ass
19a60 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30  ert( pPg->nRef>0
19a70 20 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d   );.  pPg->nRef-
19a80 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67  -;.  REFINFO(pPg
19a90 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45  );..  CHECK_PAGE
19aa0 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65  (pPg);..  /* Whe
19ab0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
19ac0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 20  references to a 
19ad0 70 61 67 65 20 72 65 61 63 68 20 30 2c 20 63 61  page reach 0, ca
19ae0 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 74  ll the.  ** dest
19af0 72 75 63 74 6f 72 20 61 6e 64 20 61 64 64 20 74  ructor and add t
19b00 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 66  he page to the f
19b10 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  reelist..  */.  
19b20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
19b30 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70   ){.    Pager *p
19b40 50 61 67 65 72 3b 0a 20 20 20 20 70 50 61 67 65  Pager;.    pPage
19b50 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
19b60 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46  .    pPg->pNextF
19b70 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 67  ree = 0;.    pPg
19b80 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50  ->pPrevFree = pP
19b90 61 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20  ager->pLast;.   
19ba0 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
19bb0 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50   pPg;.    if( pP
19bc0 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a  g->pPrevFree ){.
19bd0 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
19be0 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20  Free->pNextFree 
19bf0 3d 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65  = pPg;.    }else
19c00 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
19c10 70 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20 20  pFirst = pPg;.  
19c20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
19c30 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 26 26 20  >needSync==0 && 
19c40 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
19c50 6e 63 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nced==0 ){.     
19c60 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
19c70 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20 20 20  ynced = pPg;.   
19c80 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
19c90 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29  r->xDestructor )
19ca0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
19cb0 78 44 65 73 74 72 75 63 74 6f 72 28 70 50 67 2c  xDestructor(pPg,
19cc0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
19cd0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  e);.    }.  .   
19ce0 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67   /* When all pag
19cf0 65 73 20 72 65 61 63 68 20 74 68 65 20 66 72 65  es reach the fre
19d00 65 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20  elist, drop the 
19d10 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20  read lock from. 
19d20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
19d30 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
19d40 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66      pPager->nRef
19d50 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
19d60 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20  pPager->nRef>=0 
19d70 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
19d80 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 28 21  r->nRef==0 && (!
19d90 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
19da0 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  eMode || pPager-
19db0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 29  >journalOff>0) )
19dc0 7b 0a 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c  {.      pagerUnl
19dd0 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
19de0 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
19df0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
19e00 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
19e10 72 65 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20  reate a journal 
19e20 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e  file for pPager.
19e30 20 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61    There should a
19e40 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45  lready be a RESE
19e50 52 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55  RVED.** or EXCLU
19e60 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
19e70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
19e80 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
19e90 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
19ea0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
19eb0 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
19ec0 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  .  Return an err
19ed0 6f 72 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65  or code and rele
19ee0 61 73 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65  ase the.** write
19ef0 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e   lock if anythin
19f00 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f  g goes wrong..*/
19f10 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
19f20 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50  r_open_journal(P
19f30 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
19f40 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
19f50 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61  t( !MEMDB );.  a
19f60 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
19f70 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
19f80 52 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  RVED );.  assert
19f90 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
19fa0 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 61 73  lOpen==0 );.  as
19fb0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
19fc0 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
19fd0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
19fe0 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
19ff0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
1a000 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
1a010 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
1a020 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c  rnal = sqliteMal
1a030 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53  loc( pPager->dbS
1a040 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69  ize/8 + 1 );.  i
1a050 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  f( pPager->aInJo
1a060 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  urnal==0 ){.    
1a070 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1a080 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  M;.    goto fail
1a090 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  ed_to_open_journ
1a0a0 61 6c 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  al;.  }.  rc = s
1a0b0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c  qlite3OsOpenExcl
1a0c0 75 73 69 76 65 28 70 50 61 67 65 72 2d 3e 7a 4a  usive(pPager->zJ
1a0d0 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d  ournal, &pPager-
1a0e0 3e 6a 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20  >jfd,.          
1a0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a100 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 74         pPager->t
1a110 65 6d 70 46 69 6c 65 29 3b 0a 20 20 61 73 73 65  empFile);.  asse
1a120 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
1a130 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64  K || pPager->jfd
1a140 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   );.  pPager->jo
1a150 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
1a160 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
1a170 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  r = 0;.  pPager-
1a180 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
1a190 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1a1a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
1a1b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
1a1c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1a1d0 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
1a1e0 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  ->zJournal);.   
1a1f0 20 7d 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c   }.    goto fail
1a200 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  ed_to_open_journ
1a210 61 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  al;.  }.  sqlite
1a220 33 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63 28 70  3OsSetFullSync(p
1a230 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
1a240 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b  er->full_fsync);
1a250 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 74 46  .  sqlite3OsSetF
1a260 75 6c 6c 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  ullSync(pPager->
1a270 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  fd, pPager->full
1a280 5f 66 73 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74  _fsync);.  sqlit
1a290 65 33 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72  e3OsOpenDirector
1a2a0 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  y(pPager->jfd, p
1a2b0 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
1a2c0 79 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  y);.  pPager->jo
1a2d0 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20  urnalOpen = 1;. 
1a2e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1a2f0 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 70  Started = 0;.  p
1a300 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
1a310 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  = 0;.  pPager->a
1a320 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
1a330 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  0;.  pPager->nRe
1a340 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  c = 0;.  if( pPa
1a350 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
1a360 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
1a370 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 67 6f  >errCode;.    go
1a380 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65  to failed_to_ope
1a390 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20  n_journal;.  }. 
1a3a0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
1a3b0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
1a3c0 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20 77 72  Size;..  rc = wr
1a3d0 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
1a3e0 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 50  ager);..  if( pP
1a3f0 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70  ager->stmtAutoop
1a400 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  en && rc==SQLITE
1a410 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1a420 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
1a430 42 65 67 69 6e 28 70 50 61 67 65 72 29 3b 0a 20  Begin(pPager);. 
1a440 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
1a450 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
1a460 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
1a470 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
1a480 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
1a490 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
1a4a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a4b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1a4c0 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d  _FULL;.    }.  }
1a4d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 66  .  return rc;..f
1a4e0 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
1a4f0 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74 65 46  urnal:.  sqliteF
1a500 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ree(pPager->aInJ
1a510 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65  ournal);.  pPage
1a520 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->aInJournal = 
1a530 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
1a540 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
1a550 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
1a560 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1a570 54 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f  The lock is remo
1a580 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ved when.** the 
1a590 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
1a5a0 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a  wing happen:.**.
1a5b0 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50  **   *  sqlite3P
1a5c0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
1a5d0 77 6f 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  wo() is called..
1a5e0 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50  **   *  sqlite3P
1a5f0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 69  agerRollback() i
1a600 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a  s called..**   *
1a610 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
1a620 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ose() is called.
1a630 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33  .**   *  sqlite3
1a640 50 61 67 65 72 55 6e 72 65 66 28 29 20 69 73 20  PagerUnref() is 
1a650 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65  called to on eve
1a660 72 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ry outstanding p
1a670 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  age..**.** The f
1a680 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20 74  irst parameter t
1a690 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
1a6a0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
1a6b0 6e 79 20 6f 70 65 6e 20 70 61 67 65 20 6f 66 20  ny open page of 
1a6c0 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
1a6d0 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e 67 20 63  file.  Nothing c
1a6e0 68 61 6e 67 65 73 20 61 62 6f 75 74 20 74 68 65  hanges about the
1a6f0 20 70 61 67 65 20 2d 20 69 74 20 69 73 20 75 73   page - it is us
1a700 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a 20  ed merely to.** 
1a710 61 63 71 75 69 72 65 20 61 20 70 6f 69 6e 74 65  acquire a pointe
1a720 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 20 73  r to the Pager s
1a730 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 73 20  tructure and as 
1a740 70 72 6f 6f 66 20 74 68 61 74 20 74 68 65 72 65  proof that there
1a750 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 61   is.** already a
1a760 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68   read-lock on th
1a770 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
1a780 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 70 61 72  * The second par
1a790 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65 73  ameter indicates
1a7a0 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20   how much space 
1a7b0 69 6e 20 62 79 74 65 73 20 74 6f 20 72 65 73 65  in bytes to rese
1a7c0 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20 6d 61 73  rve for a.** mas
1a7d0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1a7e0 2d 6e 61 6d 65 20 61 74 20 74 68 65 20 73 74 61  -name at the sta
1a7f0 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
1a800 6c 20 77 68 65 6e 20 69 74 20 69 73 20 63 72 65  l when it is cre
1a810 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f  ated..**.** A jo
1a820 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
1a830 65 6e 65 64 20 69 66 20 74 68 69 73 20 69 73 20  ened if this is 
1a840 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20  not a temporary 
1a850 66 69 6c 65 2e 20 20 46 6f 72 20 74 65 6d 70 6f  file.  For tempo
1a860 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73 2c 20 74  rary.** files, t
1a870 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68  he opening of th
1a880 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1a890 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c  s deferred until
1a8a0 20 74 68 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20   there is an.** 
1a8b0 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 77  actual need to w
1a8c0 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
1a8d0 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  nal..**.** If th
1a8e0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  e database is al
1a8f0 72 65 61 64 79 20 72 65 73 65 72 76 65 64 20 66  ready reserved f
1a900 6f 72 20 77 72 69 74 69 6e 67 2c 20 74 68 69 73  or writing, this
1a910 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
1a920 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78  -op..**.** If ex
1a930 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 67 6f  Flag is true, go
1a940 20 61 68 65 61 64 20 61 6e 64 20 67 65 74 20 61   ahead and get a
1a950 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
1a960 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20   on the file.** 
1a970 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 6e 73 74  immediately inst
1a980 65 61 64 20 6f 66 20 77 61 69 74 69 6e 67 20 75  ead of waiting u
1a990 6e 74 69 6c 20 77 65 20 74 72 79 20 74 6f 20 66  ntil we try to f
1a9a0 6c 75 73 68 20 74 68 65 20 63 61 63 68 65 2e 20  lush the cache. 
1a9b0 20 54 68 65 0a 2a 2a 20 65 78 46 6c 61 67 20 69   The.** exFlag i
1a9c0 73 20 69 67 6e 6f 72 65 64 20 69 66 20 61 20 74  s ignored if a t
1a9d0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c  ransaction is al
1a9e0 72 65 61 64 79 20 61 63 74 69 76 65 2e 0a 2a 2f  ready active..*/
1a9f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
1aa00 72 42 65 67 69 6e 28 44 62 50 61 67 65 20 2a 70  rBegin(DbPage *p
1aa10 50 67 2c 20 69 6e 74 20 65 78 46 6c 61 67 29 7b  Pg, int exFlag){
1aa20 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1aa30 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
1aa40 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1aa50 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
1aa60 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pPg->nRef>0 );. 
1aa70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1aa80 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
1aa90 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  LOCK );.  if( pP
1aaa0 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
1aab0 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20  ER_SHARED ){.   
1aac0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1aad0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
1aae0 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20  ;.    if( MEMDB 
1aaf0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
1ab00 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
1ab10 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20  XCLUSIVE;.      
1ab20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1ab30 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
1ab40 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ize;.    }else{.
1ab50 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1ab60 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
1ab70 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  >fd, RESERVED_LO
1ab80 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
1ab90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1aba0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1abb0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  state = PAGER_RE
1abc0 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20 20 20  SERVED;.        
1abd0 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20  if( exFlag ){.  
1abe0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
1abf0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
1ac00 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
1ac10 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  E_LOCK);.       
1ac20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1ac30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ac40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
1ac50 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1ac60 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
1ac70 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20  irtyCache = 0;. 
1ac80 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32       PAGERTRACE2
1ac90 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64  ("TRANSACTION %d
1aca0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1acb0 67 65 72 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ger));.      if(
1acc0 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
1acd0 6e 61 6c 20 26 26 20 21 70 50 61 67 65 72 2d 3e  nal && !pPager->
1ace0 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
1acf0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f      rc = pager_o
1ad00 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67  pen_journal(pPag
1ad10 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
1ad20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
1ad30 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1ad40 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  en && pPager->jo
1ad50 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20  urnalOff==0 ){. 
1ad60 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
1ad70 6e 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  ns when the page
1ad80 72 20 77 61 73 20 69 6e 20 65 78 63 6c 75 73 69  r was in exclusi
1ad90 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 6c  ve-access mode l
1ada0 61 73 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20  ast.    ** time 
1adb0 61 20 28 72 65 61 64 20 6f 72 20 77 72 69 74 65  a (read or write
1adc0 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  ) transaction wa
1add0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  s successfully c
1ade0 6f 6e 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20  oncluded.    ** 
1adf0 62 79 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  by this connecti
1ae00 6f 6e 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64  on. Instead of d
1ae10 65 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f 75 72  eleting the jour
1ae20 6e 61 6c 20 66 69 6c 65 20 69 74 20 77 61 73 20  nal file it was 
1ae30 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65  .    ** kept ope
1ae40 6e 20 61 6e 64 20 74 72 75 6e 63 61 74 65 64 20  n and truncated 
1ae50 74 6f 20 30 20 62 79 74 65 73 2e 0a 20 20 20 20  to 0 bytes..    
1ae60 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
1ae70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20 29  Pager->nRec==0 )
1ae80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1ae90 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1aea0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
1aeb0 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
1aec0 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
1aed0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1aee0 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
1aef0 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f     pPager->aInJo
1af00 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61  urnal = sqliteMa
1af10 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62  lloc( pPager->db
1af20 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20  Size/8 + 1 );.  
1af30 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 61    if( !pPager->a
1af40 49 6e 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  InJournal ){.   
1af50 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1af60 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
1af70 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f  .      pPager->o
1af80 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67  rigDbSize = pPag
1af90 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
1afa0 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
1afb0 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
1afc0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
1afd0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  rt( !pPager->jou
1afe0 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70 50 61 67  rnalOpen || pPag
1aff0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30  er->journalOff>0
1b000 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f   || rc!=SQLITE_O
1b010 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  K );.  return rc
1b020 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
1b030 61 20 70 61 67 65 20 64 69 72 74 79 2e 20 20 53  a page dirty.  S
1b040 65 74 20 69 74 73 20 64 69 72 74 79 20 66 6c 61  et its dirty fla
1b050 67 20 61 6e 64 20 61 64 64 20 69 74 20 74 6f 20  g and add it to 
1b060 74 68 65 20 64 69 72 74 79 0a 2a 2a 20 70 61 67  the dirty.** pag
1b070 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
1b080 63 20 76 6f 69 64 20 6d 61 6b 65 44 69 72 74 79  c void makeDirty
1b090 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
1b0a0 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d  if( pPg->dirty==
1b0b0 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a  0 ){.    Pager *
1b0c0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1b0d0 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 64  ager;.    pPg->d
1b0e0 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70 50  irty = 1;.    pP
1b0f0 67 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 61 67  g->pDirty = pPag
1b100 65 72 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  er->pDirty;.    
1b110 69 66 28 20 70 50 61 67 65 72 2d 3e 70 44 69 72  if( pPager->pDir
1b120 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  ty ){.      pPag
1b130 65 72 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65  er->pDirty->pPre
1b140 76 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20 20  vDirty = pPg;.  
1b150 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 72    }.    pPg->pPr
1b160 65 76 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  evDirty = 0;.   
1b170 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
1b180 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = pPg;.  }.}../*
1b190 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20  .** Make a page 
1b1a0 63 6c 65 61 6e 2e 20 20 43 6c 65 61 72 20 69 74  clean.  Clear it
1b1b0 73 20 64 69 72 74 79 20 62 69 74 20 61 6e 64 20  s dirty bit and 
1b1c0 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74  remove it from t
1b1d0 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65  he.** dirty page
1b1e0 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
1b1f0 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28   void makeClean(
1b200 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
1b210 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b  f( pPg->dirty ){
1b220 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20  .    pPg->dirty 
1b230 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 67  = 0;.    if( pPg
1b240 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20 20  ->pDirty ){.    
1b250 20 20 70 50 67 2d 3e 70 44 69 72 74 79 2d 3e 70    pPg->pDirty->p
1b260 50 72 65 76 44 69 72 74 79 20 3d 20 70 50 67 2d  PrevDirty = pPg-
1b270 3e 70 50 72 65 76 44 69 72 74 79 3b 0a 20 20 20  >pPrevDirty;.   
1b280 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
1b290 70 50 72 65 76 44 69 72 74 79 20 29 7b 0a 20 20  pPrevDirty ){.  
1b2a0 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 44 69      pPg->pPrevDi
1b2b0 72 74 79 2d 3e 70 44 69 72 74 79 20 3d 20 70 50  rty->pDirty = pP
1b2c0 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d  g->pDirty;.    }
1b2d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
1b2e0 3e 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20  >pPager->pDirty 
1b2f0 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20  = pPg->pDirty;. 
1b300 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a     }.  }.}.../*.
1b310 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70  ** Mark a data p
1b320 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65  age as writeable
1b330 2e 20 20 54 68 65 20 70 61 67 65 20 69 73 20 77  .  The page is w
1b340 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1b350 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69  journal .** if i
1b360 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61  t is not there a
1b370 6c 72 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f  lready.  This ro
1b380 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61  utine must be ca
1b390 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69  lled before maki
1b3a0 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  ng.** changes to
1b3b0 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54   a page..**.** T
1b3c0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
1b3d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1b3e0 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  lled, the pager 
1b3f0 63 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a  creates a new.**
1b400 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71   journal and acq
1b410 75 69 72 65 73 20 61 20 52 45 53 45 52 56 45 44  uires a RESERVED
1b420 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1b430 61 62 61 73 65 2e 20 20 49 66 20 74 68 65 20 52  abase.  If the R
1b440 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20  ESERVED.** lock 
1b450 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71  could not be acq
1b460 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74  uired, this rout
1b470 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
1b480 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a  TE_BUSY.  The.**
1b490 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
1b4a0 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20   must check for 
1b4b0 74 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75  that return valu
1b4c0 65 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c  e and be careful
1b4d0 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67   not to.** chang
1b4e0 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20  e any page data 
1b4f0 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69  until this routi
1b500 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
1b510 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  E_OK..**.** If t
1b520 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1b530 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69  could not be wri
1b540 74 74 65 6e 20 62 65 63 61 75 73 65 20 74 68 65  tten because the
1b550 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a   disk is full,.*
1b560 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * then this rout
1b570 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
1b580 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73  TE_FULL and does
1b590 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f   an immediate ro
1b5a0 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73  llback..** All s
1b5b0 75 62 73 65 71 75 65 6e 74 20 77 72 69 74 65 20  ubsequent write 
1b5c0 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65  attempts also re
1b5d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
1b5e0 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20   until there.** 
1b5f0 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  is a call to sql
1b600 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 28  ite3PagerCommit(
1b610 29 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67 65  ) or sqlite3Page
1b620 72 52 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a  rRollback() to.*
1b630 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  * reset..*/.stat
1b640 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
1b650 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  te(PgHdr *pPg){.
1b660 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20    void *pData = 
1b670 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
1b680 67 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g);.  Pager *pPa
1b690 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
1b6a0 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
1b6b0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43  LITE_OK;..  /* C
1b6c0 68 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a  heck for errors.
1b6d0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
1b6e0 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 20 0a 20  r->errCode ){ . 
1b6f0 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
1b700 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20  ->errCode;.  }. 
1b710 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61   if( pPager->rea
1b720 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65 74  dOnly ){.    ret
1b730 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
1b740 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1b750 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74  !pPager->setMast
1b760 65 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50  er );..  CHECK_P
1b770 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  AGE(pPg);..  /* 
1b780 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
1b790 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20   dirty.  If the 
1b7a0 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79  page has already
1b7b0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20   been written.  
1b7c0 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ** to the journa
1b7d0 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65  l then we can re
1b7e0 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e  turn right away.
1b7f0 0a 20 20 2a 2f 0a 20 20 6d 61 6b 65 44 69 72 74  .  */.  makeDirt
1b800 79 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70 50  y(pPg);.  if( pP
1b810 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  g->inJournal && 
1b820 28 70 50 67 2d 3e 69 6e 53 74 6d 74 20 7c 7c 20  (pPg->inStmt || 
1b830 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1b840 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 50 61  e==0) ){.    pPa
1b850 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1b860 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20  = 1;.  }else{.. 
1b870 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20     /* If we get 
1b880 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61  this far, it mea
1b890 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
1b8a0 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
1b8b0 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74   ** written to t
1b8c0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
1b8d0 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b  ournal or the ck
1b8e0 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  eckpoint journal
1b8f0 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e  .    ** or both.
1b900 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
1b910 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65  irst check to se
1b920 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  e that the trans
1b930 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65  action journal e
1b940 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a  xists and.    **
1b950 20 63 72 65 61 74 65 20 69 74 20 69 66 20 69 74   create it if it
1b960 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a   does not..    *
1b970 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
1b980 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
1b990 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20  ER_UNLOCK );.   
1b9a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1b9b0 65 72 42 65 67 69 6e 28 70 50 67 2c 20 30 29 3b  erBegin(pPg, 0);
1b9c0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1b9d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b9e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1b9f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1ba00 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1ba10 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
1ba20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a    if( !pPager->j
1ba30 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50  ournalOpen && pP
1ba40 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
1ba50 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1ba60 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
1ba70 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
1ba80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ba90 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
1baa0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1bab0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1bac0 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72  lOpen || !pPager
1bad0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
1bae0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
1baf0 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20  yCache = 1;.  . 
1bb00 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61     /* The transa
1bb10 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f  ction journal no
1bb20 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20  w exists and we 
1bb30 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20  have a RESERVED 
1bb40 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43  or an.    ** EXC
1bb50 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
1bb60 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
1bb70 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68   file.  Write th
1bb80 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
1bb90 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61  o.    ** the tra
1bba0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
1bbb0 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
1bbc0 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
1bbd0 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67   */.    if( !pPg
1bbe0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  ->inJournal && (
1bbf0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
1bc00 61 6c 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a  al || MEMDB) ){.
1bc10 20 20 20 20 20 20 69 66 28 20 28 69 6e 74 29 70        if( (int)p
1bc20 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67  Pg->pgno <= pPag
1bc30 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
1bc40 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a  {.        int sz
1bc50 50 67 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  Pg;.        if( 
1bc60 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
1bc70 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
1bc80 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
1bc90 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
1bca0 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  ;.          PAGE
1bcb0 52 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c  RTRACE3("JOURNAL
1bcc0 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
1bcd0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1bce0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1bcf0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1bd00 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29  Hist->pOrig==0 )
1bd10 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48 69 73  ;.          pHis
1bd20 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69 74  t->pOrig = sqlit
1bd30 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67  eMallocRaw( pPag
1bd40 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  er->pageSize );.
1bd50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 48            if( pH
1bd60 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20  ist->pOrig ){.  
1bd70 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1bd80 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50  (pHist->pOrig, P
1bd90 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
1bda0 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
1bdb0 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ize);.          
1bdc0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
1bdd0 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20 63  .          u32 c
1bde0 6b 73 75 6d 2c 20 73 61 76 65 64 3b 0a 20 20 20  ksum, saved;.   
1bdf0 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61         char *pDa
1be00 74 61 32 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20  ta2, *pEnd;.    
1be10 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75        /* We shou
1be20 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74  ld never write t
1be30 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
1be40 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74  le the page that
1be50 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
1be60 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62  ntains the datab
1be70 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20  ase locks.  The 
1be80 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
1be90 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20 20   verifies.      
1bea0 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64      ** that we d
1beb0 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20  o not. */.      
1bec0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
1bed0 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f  >pgno!=PAGER_MJ_
1bee0 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a  PGNO(pPager) );.
1bef0 20 20 20 20 20 20 20 20 20 20 70 44 61 74 61 32            pData2
1bf00 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72   = CODEC2(pPager
1bf10 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
1bf20 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20  no, 7);.        
1bf30 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f    cksum = pager_
1bf40 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75  cksum(pPager, (u
1bf50 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20 20  8*)pData2);.    
1bf60 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 44 61        pEnd = pDa
1bf70 74 61 32 20 2b 20 70 50 61 67 65 72 2d 3e 70 61  ta2 + pPager->pa
1bf80 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  geSize;.        
1bf90 20 20 70 44 61 74 61 32 20 2d 3d 20 34 3b 0a 20    pData2 -= 4;. 
1bfa0 20 20 20 20 20 20 20 20 20 73 61 76 65 64 20 3d           saved =
1bfb0 20 2a 28 75 33 32 2a 29 70 45 6e 64 3b 0a 20 20   *(u32*)pEnd;.  
1bfc0 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74          put32bit
1bfd0 73 28 70 45 6e 64 2c 20 63 6b 73 75 6d 29 3b 0a  s(pEnd, cksum);.
1bfe0 20 20 20 20 20 20 20 20 20 20 73 7a 50 67 20 3d            szPg =
1bff0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1c000 65 2b 38 3b 0a 20 20 20 20 20 20 20 20 20 20 70  e+8;.          p
1c010 75 74 33 32 62 69 74 73 28 70 44 61 74 61 32 2c  ut32bits(pData2,
1c020 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1c030 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1c040 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
1c050 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20  r->jfd, pData2, 
1c060 73 7a 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  szPg);.         
1c070 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20   IOTRACE(("JOUT 
1c080 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22  %p %d %lld %d\n"
1c090 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
1c0a0 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  gno,.           
1c0b0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1c0c0 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 73 7a 50 67  journalOff, szPg
1c0d0 29 29 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  )).          pPa
1c0e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1c0f0 2b 3d 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 20  += szPg;.       
1c100 20 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22     PAGERTRACE4("
1c110 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
1c120 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e  %d needSync=%d\n
1c130 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1c140 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
1c150 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
1c160 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b   pPg->needSync);
1c170 0a 20 20 20 20 20 20 20 20 20 20 2a 28 75 33 32  .          *(u32
1c180 2a 29 70 45 6e 64 20 3d 20 73 61 76 65 64 3b 0a  *)pEnd = saved;.
1c190 0a 09 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20  ..  /* An error 
1c1a0 68 61 73 20 6f 63 63 75 72 65 64 20 77 72 69 74  has occured writ
1c1b0 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ing to the journ
1c1c0 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20  al file. The .  
1c1d0 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73          ** trans
1c1e0 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72  action will be r
1c1f0 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68  olled back by th
1c200 65 20 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20  e layer above.. 
1c210 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1c220 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1c230 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c240 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1c250 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
1c260 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1c270 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRec++;.       
1c280 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1c290 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->aInJournal!=0
1c2a0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50   );.          pP
1c2b0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1c2c0 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
1c2d0 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
1c2e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67  );.          pPg
1c2f0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50  ->needSync = !pP
1c300 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20  ager->noSync;.  
1c310 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
1c320 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
1c330 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
1c340 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67  ger->aInStmt[pPg
1c350 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
1c360 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
1c370 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 5f             page_
1c380 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
1c390 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  (pPg);.         
1c3a0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1c3b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c3c0 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
1c3d0 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  = !pPager->journ
1c3e0 61 6c 53 74 61 72 74 65 64 20 26 26 20 21 70 50  alStarted && !pP
1c3f0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20  ager->noSync;.  
1c400 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1c410 34 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67  4("APPEND %d pag
1c420 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64  e %d needSync=%d
1c430 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1c440 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
1c450 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
1c460 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b   pPg->needSync);
1c470 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1c480 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  f( pPg->needSync
1c490 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
1c4a0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
1c4b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c4c0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
1c4d0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20   1;.    }.  .   
1c4e0 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
1c4f0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ment journal is 
1c500 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67  open and the pag
1c510 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a  e is not in it,.
1c520 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74      ** then writ
1c530 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
1c540 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d  ge to the statem
1c550 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f  ent journal.  No
1c560 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  te that.    ** t
1c570 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
1c580 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66  rnal format diff
1c590 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ers from the sta
1c5a0 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f  ndard journal fo
1c5b0 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74  rmat.    ** in t
1c5c0 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65  hat it omits the
1c5d0 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74   checksums and t
1c5e0 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a  he header..    *
1c5f0 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
1c600 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20 21  ->stmtInUse && !
1c610 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28  pPg->inStmt && (
1c620 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70  int)pPg->pgno<=p
1c630 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
1c640 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1c650 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
1c660 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  || (int)pPg->pgn
1c670 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  o>pPager->origDb
1c680 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66  Size );.      if
1c690 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
1c6a0 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
1c6b0 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
1c6c0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
1c6d0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1c6e0 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d  ( pHist->pStmt==
1c6f0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69  0 );.        pHi
1c700 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69  st->pStmt = sqli
1c710 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61  teMallocRaw( pPa
1c720 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  ger->pageSize );
1c730 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69  .        if( pHi
1c740 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20  st->pStmt ){.   
1c750 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48         memcpy(pH
1c760 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44  ist->pStmt, PGHD
1c770 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
1c780 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1c790 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1c7a0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
1c7b0 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25  ("STMT-JOURNAL %
1c7c0 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
1c7d0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1c7e0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
1c7f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c800 63 68 61 72 20 2a 70 44 61 74 61 32 20 3d 20 43  char *pData2 = C
1c810 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44  ODEC2(pPager, pD
1c820 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
1c830 37 29 2d 34 3b 0a 20 20 20 20 20 20 20 20 70 75  7)-4;.        pu
1c840 74 33 32 62 69 74 73 28 70 44 61 74 61 32 2c 20  t32bits(pData2, 
1c850 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1c860 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c870 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
1c880 73 74 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  stfd, pData2, pP
1c890 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34  ager->pageSize+4
1c8a0 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  );.        PAGER
1c8b0 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55  TRACE3("STMT-JOU
1c8c0 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
1c8d0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1c8e0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  er), pPg->pgno);
1c8f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1c900 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c910 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1c920 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
1c930 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d       pPager->stm
1c940 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20  tNRec++;.       
1c950 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1c960 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20  >aInStmt!=0 );. 
1c970 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61         pPager->a
1c980 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
1c990 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
1c9a0 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 7d  pgno&7);.      }
1c9b0 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f  .      page_add_
1c9c0 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
1c9d0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1c9e0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61  /* Update the da
1c9f0 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20  tabase size and 
1ca00 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61  return..  */.  a
1ca10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1ca20 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
1ca30 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ED );.  if( pPag
1ca40 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29  er->dbSize<(int)
1ca50 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  pPg->pgno ){.   
1ca60 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1ca70 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20  = pPg->pgno;.   
1ca80 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70   if( !MEMDB && p
1ca90 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50  Pager->dbSize==P
1caa0 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67  ENDING_BYTE/pPag
1cab0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  er->pageSize ){.
1cac0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
1cad0 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Size++;.    }.  
1cae0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1caf0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1cb00 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
1cb10 20 6d 61 72 6b 20 61 20 64 61 74 61 2d 70 61 67   mark a data-pag
1cb20 65 20 61 73 20 77 72 69 74 61 62 6c 65 2e 20 49  e as writable. I
1cb30 74 20 75 73 65 73 20 0a 2a 2a 20 70 61 67 65 72  t uses .** pager
1cb40 5f 77 72 69 74 65 28 29 20 74 6f 20 6f 70 65 6e  _write() to open
1cb50 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
1cb60 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
1cb70 72 65 61 64 79 20 6f 70 65 6e 29 0a 2a 2a 20 61  ready open).** a
1cb80 6e 64 20 77 72 69 74 65 20 74 68 65 20 70 61 67  nd write the pag
1cb90 65 20 2a 70 44 61 74 61 20 74 6f 20 74 68 65 20  e *pData to the 
1cba0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
1cbb0 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
1cbc0 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74  tween this funct
1cbd0 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72  ion and pager_wr
1cbe0 69 74 65 28 29 20 69 73 20 74 68 61 74 20 74 68  ite() is that th
1cbf0 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
1cc00 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74  lso deals with t
1cc10 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  he special case 
1cc20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20  where 2 or more 
1cc30 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20  pages.** fit on 
1cc40 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
1cc50 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61  ctor. In this ca
1cc60 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65  se all co-reside
1cc70 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74  nt pages.** must
1cc80 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
1cc90 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
1cca0 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65  l file before re
1ccb0 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  turning..*/.int 
1ccc0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1ccd0 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67  e(DbPage *pDbPag
1cce0 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
1ccf0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48  QLITE_OK;..  PgH
1cd00 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67  dr *pPg = pDbPag
1cd10 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e;.  Pager *pPag
1cd20 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
1cd30 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65  ;.  Pgno nPagePe
1cd40 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65  rSector = (pPage
1cd50 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50  r->sectorSize/pP
1cd60 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1cd70 0a 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26  ..  if( !MEMDB &
1cd80 26 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  & nPagePerSector
1cd90 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  >1 ){.    Pgno n
1cda0 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20  PageCount;      
1cdb0 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
1cdc0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1cdd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1cde0 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20  .    Pgno pg1;  
1cdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ce00 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20  * First page of 
1ce10 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69  the sector pPg i
1ce20 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f  s located on. */
1ce30 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  .    int nPage; 
1ce40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ce50 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1ce60 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67  s starting at pg
1ce70 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  1 to journal */.
1ce80 20 20 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 20      int ii;..   
1ce90 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f   /* Set the doNo
1cea0 74 53 79 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e  tSync flag to 1.
1ceb0 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
1cec0 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77   we cannot allow
1ced0 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a   a journal.    *
1cee0 2a 20 68 65 61 64 65 72 20 74 6f 20 62 65 20 77  * header to be w
1cef0 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74  ritten between t
1cf00 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c  he pages journal
1cf10 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
1cf20 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
1cf30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1cf40 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a  doNotSync==0 );.
1cf50 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
1cf60 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20  tSync = 1;..    
1cf70 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61 73  /* This trick as
1cf80 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20  sumes that both 
1cf90 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e  the page-size an
1cfa0 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72  d sector-size ar
1cfb0 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65  e.    ** an inte
1cfc0 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20  ger power of 2. 
1cfd0 49 74 20 73 65 74 73 20 76 61 72 69 61 62 6c 65  It sets variable
1cfe0 20 70 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e   pg1 to the iden
1cff0 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66  tifier.    ** of
1d000 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
1d010 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
1d020 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
1d030 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20  .    */.    pg1 
1d040 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29  = ((pPg->pgno-1)
1d050 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63   & ~(nPagePerSec
1d060 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20  tor-1)) + 1;..  
1d070 20 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20 73    nPageCount = s
1d080 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1d090 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
1d0a0 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e    if( pPg->pgno>
1d0b0 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20  nPageCount ){.  
1d0c0 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67      nPage = (pPg
1d0d0 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b  ->pgno - pg1)+1;
1d0e0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
1d0f0 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74  pg1+nPagePerSect
1d100 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74  or-1)>nPageCount
1d110 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20   ){.      nPage 
1d120 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70  = nPageCount+1-p
1d130 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g1;.    }else{. 
1d140 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61       nPage = nPa
1d150 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20  gePerSector;.   
1d160 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50   }.    assert(nP
1d170 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65  age>0);.    asse
1d180 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e  rt(pg1<=pPg->pgn
1d190 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28  o);.    assert((
1d1a0 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e  pg1+nPage)>pPg->
1d1b0 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28  pgno);..    for(
1d1c0 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26  ii=0; ii<nPage &
1d1d0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
1d1e0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67   ii++){.      Pg
1d1f0 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a  no pg = pg1+ii;.
1d200 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
1d210 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 7c 7c  r->aInJournal ||
1d220 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c   pg==pPg->pgno |
1d230 7c 20 0a 20 20 20 20 20 20 20 20 20 20 70 67 3e  | .          pg>
1d240 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1d250 7a 65 20 7c 7c 20 21 28 70 50 61 67 65 72 2d 3e  ze || !(pPager->
1d260 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 2f 38 5d  aInJournal[pg/8]
1d270 26 28 31 3c 3c 28 70 67 26 37 29 29 29 0a 20 20  &(1<<(pg&7))).  
1d280 20 20 20 20 29 20 7b 0a 20 20 20 20 20 20 20 20      ) {.        
1d290 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a  if( pg!=PAGER_MJ
1d2a0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
1d2b0 0a 20 20 20 20 20 20 20 20 20 20 50 67 48 64 72  .          PgHdr
1d2c0 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 20   *pPage;.       
1d2d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1d2e0 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
1d2f0 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20  pg, &pPage);.   
1d300 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1d310 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d320 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
1d330 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b  er_write(pPage);
1d340 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1d350 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
1d360 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1d370 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1d380 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1d390 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1d3a0 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a  doNotSync==1 );.
1d3b0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
1d3c0 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c  tSync = 0;.  }el
1d3d0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  se{.    rc = pag
1d3e0 65 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65  er_write(pDbPage
1d3f0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1d400 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
1d410 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
1d420 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68  page given in th
1d430 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70  e argument was p
1d440 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64  reviously passed
1d450 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61  .** to sqlite3Pa
1d460 67 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20  gerWrite().  In 
1d470 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74  other words, ret
1d480 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
1d490 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67  s ok.** to chang
1d4a0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
1d4b0 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69   the page..*/.#i
1d4c0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74  fndef NDEBUG.int
1d4d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
1d4e0 72 69 74 65 61 62 6c 65 28 44 62 50 61 67 65 20  riteable(DbPage 
1d4f0 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
1d500 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23 65  pPg->dirty;.}.#e
1d510 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
1d520 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
1d530 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74  ./*.** Replace t
1d540 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
1d550 73 69 6e 67 6c 65 20 70 61 67 65 20 77 69 74 68  single page with
1d560 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
1d570 20 69 6e 20 74 68 65 20 74 68 69 72 64 0a 2a 2a   in the third.**
1d580 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e   argument..*/.in
1d590 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 76  t sqlite3PagerOv
1d5a0 65 72 77 72 69 74 65 28 50 61 67 65 72 20 2a 70  erwrite(Pager *p
1d5b0 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
1d5c0 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  , void *pData){.
1d5d0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
1d5e0 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
1d5f0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
1d600 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70  pPager, pgno, &p
1d610 50 67 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  Pg);.  if( rc==S
1d620 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d630 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1d640 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20  rWrite(pPg);.   
1d650 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d660 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  OK ){.      memc
1d670 70 79 28 73 71 6c 69 74 65 33 50 61 67 65 72 47  py(sqlite3PagerG
1d680 65 74 44 61 74 61 28 70 50 67 29 2c 20 70 44 61  etData(pPg), pDa
1d690 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
1d6a0 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Size);.    }.   
1d6b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1d6c0 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72  ef(pPg);.  }.  r
1d6d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
1d6e0 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c  if../*.** A call
1d6f0 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
1d700 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72   tells the pager
1d710 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
1d720 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20  necessary to.** 
1d730 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d  write the inform
1d740 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70  ation on page "p
1d750 67 6e 6f 22 20 62 61 63 6b 20 74 6f 20 74 68 65  gno" back to the
1d760 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75   disk, even thou
1d770 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20  gh.** that page 
1d780 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20  might be marked 
1d790 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20  as dirty..**.** 
1d7a0 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f  The overlying so
1d7b0 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c  ftware layer cal
1d7c0 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
1d7d0 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20  when all of the 
1d7e0 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67  data.** on the g
1d7f0 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75  iven page is unu
1d800 73 65 64 2e 20 20 54 68 65 20 70 61 67 65 72 20  sed.  The pager 
1d810 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61  marks the page a
1d820 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68  s clean so.** th
1d830 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67  at it does not g
1d840 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  et written to di
1d850 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20  sk..**.** Tests 
1d860 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f  show that this o
1d870 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67  ptimization, tog
1d880 65 74 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a  ether with the.*
1d890 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  * sqlite3PagerDo
1d8a0 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c  ntRollback() bel
1d8b0 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f  ow, more than do
1d8c0 75 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a  uble the speed.*
1d8d0 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52  * of large INSER
1d8e0 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64  T operations and
1d8f0 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73   quadruple the s
1d900 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45  peed of large DE
1d910 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  LETEs..**.** Whe
1d920 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
1d930 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68  s called, set th
1d940 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  e alwaysRollback
1d950 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a   flag to true..*
1d960 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * Subsequent cal
1d970 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ls to sqlite3Pag
1d980 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
1d990 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61   for the same pa
1d9a0 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65  ge.** will there
1d9b0 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64  after be ignored
1d9c0 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
1d9d0 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20  sary to avoid a 
1d9e0 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65  problem.** where
1d9f0 20 61 20 70 61 67 65 20 77 69 74 68 20 64 61 74   a page with dat
1da00 61 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  a is added to th
1da10 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e  e freelist durin
1da20 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a  g one part of.**
1da30 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74   a transaction t
1da40 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d  hen removed from
1da50 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75   the freelist du
1da60 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72  ring a later par
1da70 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65  t.** of the same
1da80 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
1da90 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65   reused for some
1daa0 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20   other purpose. 
1dab0 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66   When it.** is f
1dac0 69 72 73 74 20 61 64 64 65 64 20 74 6f 20 74 68  irst added to th
1dad0 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73  e freelist, this
1dae0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1daf0 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64  ed.  When reused
1db00 2c 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33  ,.** the sqlite3
1db10 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63  PagerDontRollbac
1db20 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 63  k() routine is c
1db30 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63 61  alled.  But beca
1db40 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  use the.** page 
1db50 63 6f 6e 74 61 69 6e 73 20 63 72 69 74 69 63 61  contains critica
1db60 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c 6c  l data, we still
1db70 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72 65   need to be sure
1db80 20 69 74 20 67 65 74 73 0a 2a 2a 20 72 6f 6c 6c   it gets.** roll
1db90 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65  ed back in spite
1dba0 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 50   of the sqlite3P
1dbb0 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
1dbc0 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64  () call..*/.void
1dbd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
1dbe0 74 57 72 69 74 65 28 50 61 67 65 72 20 2a 70 50  tWrite(Pager *pP
1dbf0 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
1dc00 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
1dc10 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 20 72  .  if( MEMDB ) r
1dc20 65 74 75 72 6e 3b 0a 0a 20 20 70 50 67 20 3d 20  eturn;..  pPg = 
1dc30 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
1dc40 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73  ger, pgno);.  as
1dc50 73 65 72 74 28 20 70 50 67 21 3d 30 20 29 3b 20  sert( pPg!=0 ); 
1dc60 20 2f 2a 20 57 65 20 6e 65 76 65 72 20 63 61 6c   /* We never cal
1dc70 6c 20 5f 64 6f 6e 74 5f 77 72 69 74 65 20 75 6e  l _dont_write un
1dc80 6c 65 73 73 20 74 68 65 20 70 61 67 65 20 69 73  less the page is
1dc90 20 69 6e 20 6d 65 6d 20 2a 2f 0a 20 20 70 50 67   in mem */.  pPg
1dca0 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1dcb0 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d   = 1;.  if( pPg-
1dcc0 3e 64 69 72 74 79 20 26 26 20 21 70 50 61 67 65  >dirty && !pPage
1dcd0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
1dce0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1dcf0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1dd00 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69  _SHARED );.    i
1dd10 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
1dd20 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  e==(int)pPg->pgn
1dd30 6f 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69  o && pPager->ori
1dd40 67 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e  gDbSize<pPager->
1dd50 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  dbSize ){.      
1dd60 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 73  /* If this pages
1dd70 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67   is the last pag
1dd80 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e  e in the file an
1dd90 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 67  d the file has g
1dda0 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75  rown.      ** du
1ddb0 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ring the current
1ddc0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
1ddd0 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74  en do NOT mark t
1dde0 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
1ddf0 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20  ..      ** When 
1de00 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1de10 65 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74  e grows, we must
1de20 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1de30 74 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20  the last page.  
1de40 20 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74      ** gets writ
1de50 74 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63  ten at least onc
1de60 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 64 69  e so that the di
1de70 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  sk file will be 
1de80 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20  the correct.    
1de90 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f    ** size. If yo
1dea0 75 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74  u do not write t
1deb0 68 69 73 20 70 61 67 65 20 61 6e 64 20 74 68 65  his page and the
1dec0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
1ded0 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68  e.      ** on th
1dee0 65 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62  e disk ends up b
1def0 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20  eing too small, 
1df00 74 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f  that can lead to
1df10 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
1df20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75  ** corruption du
1df30 72 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72  ring the next tr
1df40 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
1df50 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
1df60 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
1df70 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67  ("DONT_WRITE pag
1df80 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  e %d of %d\n", p
1df90 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
1dfa0 67 65 72 29 29 3b 0a 20 20 20 20 20 20 49 4f 54  ger));.      IOT
1dfb0 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20  RACE(("CLEAN %p 
1dfc0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
1dfd0 67 6e 6f 29 29 0a 20 20 20 20 20 20 6d 61 6b 65  gno)).      make
1dfe0 43 6c 65 61 6e 28 70 50 67 29 3b 0a 23 69 66 64  Clean(pPg);.#ifd
1dff0 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
1e000 50 41 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d  PAGES.      pPg-
1e010 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
1e020 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
1e030 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
1e040 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c  }.}../*.** A cal
1e050 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  l to this routin
1e060 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65  e tells the page
1e070 72 20 74 68 61 74 20 69 66 20 61 20 72 6f 6c 6c  r that if a roll
1e080 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  back occurs,.** 
1e090 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  it is not necess
1e0a0 61 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74  ary to restore t
1e0b0 68 65 20 64 61 74 61 20 6f 6e 20 74 68 65 20 67  he data on the g
1e0c0 69 76 65 6e 20 70 61 67 65 2e 20 20 54 68 69 73  iven page.  This
1e0d0 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74  .** means that t
1e0e0 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f  he pager does no
1e0f0 74 20 68 61 76 65 20 74 6f 20 72 65 63 6f 72 64  t have to record
1e100 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
1e110 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61  in the.** rollba
1e120 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 76  ck journal..*/.v
1e130 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
1e140 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 44 62 50  DontRollback(DbP
1e150 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  age *pPg){.  Pag
1e160 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1e170 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 61 73 73  ->pPager;..  ass
1e180 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1e190 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
1e1a0 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ED );.  if( pPag
1e1b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
1e1c0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
1e1d0 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  f( pPg->alwaysRo
1e1e0 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65 72  llback || pPager
1e1f0 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1e200 20 7c 7c 20 4d 45 4d 44 42 20 29 20 72 65 74 75   || MEMDB ) retu
1e210 72 6e 3b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e  rn;.  if( !pPg->
1e220 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e  inJournal && (in
1e230 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70  t)pPg->pgno <= p
1e240 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1e250 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
1e260 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1e270 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  nal!=0 );.    pP
1e280 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1e290 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
1e2a0 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
1e2b0 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  );.    pPg->inJo
1e2c0 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 69  urnal = 1;.    i
1e2d0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
1e2e0 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 70 50  nUse ){.      pP
1e2f0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
1e300 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
1e310 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
1e320 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74        page_add_t
1e330 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
1e340 3b 0a 20 20 20 20 7d 0a 20 20 20 20 50 41 47 45  ;.    }.    PAGE
1e350 52 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f  RTRACE3("DONT_RO
1e360 4c 4c 42 41 43 4b 20 70 61 67 65 20 25 64 20 6f  LLBACK page %d o
1e370 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67  f %d\n", pPg->pg
1e380 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
1e390 65 72 29 29 3b 0a 20 20 20 20 49 4f 54 52 41 43  er));.    IOTRAC
1e3a0 45 28 28 22 47 41 52 42 41 47 45 20 25 70 20 25  E(("GARBAGE %p %
1e3b0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
1e3c0 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 7d 0a 20 20  g->pgno)).  }.  
1e3d0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
1e3e0 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69  InUse && !pPg->i
1e3f0 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50  nStmt && (int)pP
1e400 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  g->pgno<=pPager-
1e410 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20  >stmtSize ){.   
1e420 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
1e430 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29  Journal || (int)
1e440 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
1e450 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a  ->origDbSize );.
1e460 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1e470 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29  er->aInStmt!=0 )
1e480 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
1e490 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
1e4a0 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
1e4b0 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 61 67 65  gno&7);.    page
1e4c0 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
1e4d0 74 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  t(pPg);.  }.}...
1e4e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1e4f0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
1e500 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61  increment the da
1e510 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
1e520 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73  ge-counter,.** s
1e530 74 6f 72 65 64 20 61 74 20 62 79 74 65 20 32 34  tored at byte 24
1e540 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69   of the pager fi
1e550 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1e560 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  t pager_incr_cha
1e570 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72  ngecounter(Pager
1e580 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
1e590 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 75 33  dr *pPgHdr;.  u3
1e5a0 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  2 change_counter
1e5b0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
1e5c0 66 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e  f( !pPager->chan
1e5d0 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 7b 0a 20  geCountDone ){. 
1e5e0 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
1e5f0 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f  1 of the file fo
1e600 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20  r writing. */.  
1e610 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1e620 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 31  gerGet(pPager, 1
1e630 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20  , &pPgHdr);.    
1e640 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e650 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1e660 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1e670 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64 72  agerWrite(pPgHdr
1e680 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1e690 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1e6a0 6e 20 72 63 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  n rc;.  .    /* 
1e6b0 52 65 61 64 20 74 68 65 20 63 75 72 72 65 6e 74  Read the current
1e6c0 20 76 61 6c 75 65 20 61 74 20 62 79 74 65 20 32   value at byte 2
1e6d0 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e 67 65  4. */.    change
1e6e0 5f 63 6f 75 6e 74 65 72 20 3d 20 72 65 74 72 69  _counter = retri
1e6f0 65 76 65 33 32 62 69 74 73 28 70 50 67 48 64 72  eve32bits(pPgHdr
1e700 2c 20 32 34 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  , 24);.  .    /*
1e710 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76   Increment the v
1e720 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61  alue just read a
1e730 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b  nd write it back
1e740 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a   to byte 24. */.
1e750 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74      change_count
1e760 65 72 2b 2b 3b 0a 20 20 20 20 70 75 74 33 32 62  er++;.    put32b
1e770 69 74 73 28 28 28 63 68 61 72 2a 29 50 47 48 44  its(((char*)PGHD
1e780 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 48 64 72  R_TO_DATA(pPgHdr
1e790 29 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f  ))+24, change_co
1e7a0 75 6e 74 65 72 29 3b 0a 20 20 20 20 70 50 61 67  unter);.    pPag
1e7b0 65 72 2d 3e 69 43 68 61 6e 67 65 43 6f 75 6e 74  er->iChangeCount
1e7c0 20 3d 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65   = change_counte
1e7d0 72 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c  r;.  .    /* Rel
1e7e0 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72 65  ease the page re
1e7f0 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20  ference. */.    
1e800 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1e810 66 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 70  f(pPgHdr);.    p
1e820 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
1e830 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d 0a  ntDone = 1;.  }.
1e840 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e850 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  OK;.}../*.** Syn
1e860 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
1e870 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  ile for the page
1e880 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65  r pPager. zMaste
1e890 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  r points to the 
1e8a0 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73  name.** of a mas
1e8b0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1e8c0 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
1e8d0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1e8e0 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a   individual.** j
1e8f0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61  ournal file. zMa
1e900 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c  ster may be NULL
1e910 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72  , which is inter
1e920 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73  preted as no mas
1e930 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  ter.** journal (
1e940 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
1e950 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
1e960 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1e970 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ne ensures that 
1e980 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
1e990 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79  ynced, all dirty
1e9a0 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a   pages written.*
1e9b0 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
1e9c0 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64  e file and the d
1e9d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e  atabase file syn
1e9e0 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68  ced. The only th
1e9f0 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61  ing that.** rema
1ea00 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ins to commit th
1ea10 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
1ea20 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
1ea30 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a  ournal file (or.
1ea40 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
1ea50 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66  l file if specif
1ea60 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ied)..**.** Note
1ea70 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72   that if zMaster
1ea80 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65  ==NULL, this doe
1ea90 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20  s not overwrite 
1eaa0 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65  a previous value
1eab0 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e  .** passed to an
1eac0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1ead0 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61  mitPhaseOne() ca
1eae0 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ll..**.** If par
1eaf0 61 6d 65 74 65 72 20 6e 54 72 75 6e 63 20 69 73  ameter nTrunc is
1eb00 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
1eb10 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 69  the pager file i
1eb20 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 0a 2a  s truncated to.*
1eb30 2a 20 6e 54 72 75 6e 63 20 70 61 67 65 73 20 28  * nTrunc pages (
1eb40 74 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  this is used by 
1eb50 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
1eb60 62 61 73 65 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73  bases)..*/.int s
1eb70 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1eb80 74 50 68 61 73 65 4f 6e 65 28 50 61 67 65 72 20  tPhaseOne(Pager 
1eb90 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
1eba0 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 50 67  har *zMaster, Pg
1ebb0 6e 6f 20 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e  no nTrunc){.  in
1ebc0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1ebd0 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 34  ;..  PAGERTRACE4
1ebe0 28 22 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a  ("DATABASE SYNC:
1ebf0 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72   File=%s zMaster
1ec00 3d 25 73 20 6e 54 72 75 6e 63 3d 25 64 5c 6e 22  =%s nTrunc=%d\n"
1ec10 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  , .      pPager-
1ec20 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73  >zFilename, zMas
1ec30 74 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 0a 20  ter, nTrunc);.. 
1ec40 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
1ec50 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20  n in-memory db, 
1ec60 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65  or no pages have
1ec70 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
1ec80 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 66  , or this.  ** f
1ec90 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  unction has alre
1eca0 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  ady been called,
1ecb0 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
1ecc0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
1ecd0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
1ece0 53 59 4e 43 45 44 20 26 26 20 21 4d 45 4d 44 42  SYNCED && !MEMDB
1ecf0 20 26 26 20 70 50 61 67 65 72 2d 3e 64 69 72 74   && pPager->dirt
1ed00 79 43 61 63 68 65 20 29 7b 0a 20 20 20 20 50 67  yCache ){.    Pg
1ed10 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 61 73  Hdr *pPg;.    as
1ed20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
1ed30 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20  urnalOpen );..  
1ed40 20 20 2f 2a 20 49 66 20 61 20 6d 61 73 74 65 72    /* If a master
1ed50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
1ed60 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  me has already b
1ed70 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
1ed80 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  he.    ** journa
1ed90 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20  l file, then no 
1eda0 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65 64  sync is required
1edb0 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77  . This happens w
1edc0 68 65 6e 20 69 74 20 69 73 0a 20 20 20 20 2a 2a  hen it is.    **
1edd0 20 77 72 69 74 74 65 6e 2c 20 74 68 65 6e 20 74   written, then t
1ede0 68 65 20 70 72 6f 63 65 73 73 20 66 61 69 6c 73  he process fails
1edf0 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d   to upgrade from
1ee00 20 61 20 52 45 53 45 52 56 45 44 20 74 6f 20 61   a RESERVED to a
1ee10 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49  n.    ** EXCLUSI
1ee20 56 45 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78  VE lock. The nex
1ee30 74 20 74 69 6d 65 20 74 68 65 20 70 72 6f 63 65  t time the proce
1ee40 73 73 20 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d  ss tries to comm
1ee50 69 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  it the.    ** tr
1ee60 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d  ansaction the m-
1ee70 6a 20 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76 65  j name will have
1ee80 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
1ee90 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  itten..    */.  
1eea0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73    if( !pPager->s
1eeb0 65 74 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  etMaster ){.    
1eec0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63    rc = pager_inc
1eed0 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
1eee0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
1eef0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ef00 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
1ef10 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  t;.#ifndef SQLIT
1ef20 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1ef30 4d 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72 75  M.      if( nTru
1ef40 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  nc!=0 ){.       
1ef50 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e   /* If this tran
1ef60 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65  saction has made
1ef70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6d   the database sm
1ef80 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20  aller, then all 
1ef90 70 61 67 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  pages.        **
1efa0 20 62 65 69 6e 67 20 64 69 73 63 61 72 64 65 64   being discarded
1efb0 20 62 79 20 74 68 65 20 74 72 75 6e 63 61 74 69   by the truncati
1efc0 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69 74 74  on must be writt
1efd0 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
1efe0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c  l.        ** fil
1eff0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
1f000 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20        Pgno i;.  
1f010 20 20 20 20 20 20 69 6e 74 20 69 53 6b 69 70 20        int iSkip 
1f020 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  = PAGER_MJ_PGNO(
1f030 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1f040 20 66 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31   for( i=nTrunc+1
1f050 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69  ; i<=pPager->ori
1f060 67 44 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a  gDbSize; i++ ){.
1f070 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28            if( !(
1f080 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1f090 61 6c 5b 69 2f 38 5d 20 26 20 28 31 3c 3c 28 69  al[i/8] & (1<<(i
1f0a0 26 37 29 29 29 20 26 26 20 69 21 3d 69 53 6b 69  &7))) && i!=iSki
1f0b0 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  p ){.           
1f0c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1f0d0 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c  erGet(pPager, i,
1f0e0 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20   &pPg);.        
1f0f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f100 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
1f110 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  c_exit;.        
1f120 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f130 50 61 67 65 72 57 72 69 74 65 28 70 50 67 29 3b  PagerWrite(pPg);
1f140 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1f150 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
1f160 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pg);.           
1f170 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f180 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
1f190 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  xit;.          }
1f1a0 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20  .        } .    
1f1b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
1f1c0 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65   rc = writeMaste
1f1d0 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  rJournal(pPager,
1f1e0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
1f1f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f200 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
1f210 78 69 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  xit;.      rc = 
1f220 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
1f230 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
1f240 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1f250 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
1f260 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
1f270 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1f280 43 55 55 4d 0a 20 20 20 20 69 66 28 20 6e 54 72  CUUM.    if( nTr
1f290 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  unc!=0 ){.      
1f2a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1f2b0 72 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  rTruncate(pPager
1f2c0 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20 20  , nTrunc);.     
1f2d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f2e0 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
1f2f0 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  xit;.    }.#endi
1f300 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  f..    /* Write 
1f310 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
1f320 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1f330 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67 20  file */.    pPg 
1f340 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f  = pager_get_all_
1f350 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67  dirty_pages(pPag
1f360 65 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  er);.    rc = pa
1f370 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
1f380 73 74 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28  st(pPg);.    if(
1f390 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1f3a0 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1f3b0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69  .    pPager->pDi
1f3c0 72 74 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  rty = 0;..    /*
1f3d0 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   Sync the databa
1f3e0 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
1f3f0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
1f400 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
1f410 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
1f420 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a  pPager->fd, 0);.
1f430 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43      }.    IOTRAC
1f440 45 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e 22  E(("DBSYNC %p\n"
1f450 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20  , pPager))..    
1f460 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
1f470 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20  PAGER_SYNCED;.  
1f480 7d 65 6c 73 65 20 69 66 28 20 4d 45 4d 44 42 20  }else if( MEMDB 
1f490 26 26 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a  && nTrunc!=0 ){.
1f4a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f4b0 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 70 50  PagerTruncate(pP
1f4c0 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20  ager, nTrunc);. 
1f4d0 20 7d 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20   }..sync_exit:. 
1f4e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
1f4f0 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c  /*.** Commit all
1f500 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
1f510 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c  database and rel
1f520 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
1f530 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
1f540 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66  e commit fails f
1f550 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61  or any reason, a
1f560 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70   rollback attemp
1f570 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64  t is made.** and
1f580 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
1f590 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20  s returned.  If 
1f5a0 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65  the commit worke
1f5b0 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  d, SQLITE_OK.** 
1f5c0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1f5d0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1f5e0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 50  CommitPhaseTwo(P
1f5f0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1f600 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
1f610 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 70 50   *pPg;..  if( pP
1f620 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
1f630 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
1f640 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
1f650 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1f660 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52  tate<PAGER_RESER
1f670 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  VED ){.    retur
1f680 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
1f690 20 20 7d 0a 20 20 50 41 47 45 52 54 52 41 43 45    }.  PAGERTRACE
1f6a0 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c  2("COMMIT %d\n",
1f6b0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1f6c0 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
1f6d0 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  {.    pPg = page
1f6e0 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
1f6f0 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20  pages(pPager);. 
1f700 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b     while( pPg ){
1f710 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74  .      clearHist
1f720 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53  ory(PGHDR_TO_HIS
1f730 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b  T(pPg, pPager));
1f740 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74  .      pPg->dirt
1f750 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  y = 0;.      pPg
1f760 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
1f770 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74  .      pPg->inSt
1f780 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  mt = 0;.      pP
1f790 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
1f7a0 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65  .      pPg->pPre
1f7b0 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65  vStmt = pPg->pNe
1f7c0 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  xtStmt = 0;.    
1f7d0 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69    pPg = pPg->pDi
1f7e0 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  rty;.    }.    p
1f7f0 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
1f800 30 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  0;.#ifndef NDEBU
1f810 47 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  G.    for(pPg=pP
1f820 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
1f830 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
1f840 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73  ll){.      PgHis
1f850 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
1f860 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
1f870 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
1f880 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c  assert( !pPg->al
1f890 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a  waysRollback );.
1f8a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
1f8b0 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20  Hist->pOrig );. 
1f8c0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48       assert( !pH
1f8d0 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20  ist->pStmt );.  
1f8e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70    }.#endif.    p
1f8f0 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30  Pager->pStmt = 0
1f900 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
1f910 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
1f920 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ED;.    return S
1f930 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1f940 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1f950 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21  journalOpen || !
1f960 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
1f970 68 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  he );.  assert( 
1f980 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
1f990 41 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20 21  AGER_SYNCED || !
1f9a0 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
1f9b0 68 65 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67  he );.  rc = pag
1f9c0 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
1f9d0 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  on(pPager);.  re
1f9e0 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
1f9f0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a  (pPager, rc);.}.
1fa00 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
1fa10 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20 54 68  all changes.  Th
1fa20 65 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73  e database falls
1fa30 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53   back to PAGER_S
1fa40 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41  HARED mode..** A
1fa50 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  ll in-memory cac
1fa60 68 65 20 70 61 67 65 73 20 72 65 76 65 72 74 20  he pages revert 
1fa70 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61  to their origina
1fa80 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e  l data contents.
1fa90 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
1faa0 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a  is deleted..**.*
1fab0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
1fac0 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73  annot fail unles
1fad0 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  s some other pro
1fae0 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c  cess is not foll
1faf0 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72  owing.** the cor
1fb00 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f  rect locking pro
1fb10 74 6f 63 6f 6c 20 6f 72 20 75 6e 6c 65 73 73 20  tocol or unless 
1fb20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72  some other.** pr
1fb30 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e 67  ocess is writing
1fb40 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68 65 20   trash into the 
1fb50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 53 51  journal file (SQ
1fb60 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20 6f 72  LITE_CORRUPT) or
1fb70 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70 72 69  .** unless a pri
1fb80 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  or malloc() fail
1fb90 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ed (SQLITE_NOMEM
1fba0 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65 20  ).  Appropriate 
1fbb0 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61  error.** codes a
1fbc0 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20  re returned for 
1fbd0 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61 73 69  all these occasi
1fbe0 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  ons.  Otherwise,
1fbf0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
1fc00 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
1fc10 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  t sqlite3PagerRo
1fc20 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
1fc30 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1fc40 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22  .  PAGERTRACE2("
1fc50 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20  ROLLBACK %d\n", 
1fc60 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
1fc70 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
1fc80 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  .    PgHdr *p;. 
1fc90 20 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d     for(p=pPager-
1fca0 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70  >pAll; p; p=p->p
1fcb0 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
1fcc0 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
1fcd0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1fce0 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  !p->alwaysRollba
1fcf0 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ck );.      if( 
1fd00 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20  !p->dirty ){.   
1fd10 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28 28       assert( !((
1fd20 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44  PgHistory *)PGHD
1fd30 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61  R_TO_HIST(p, pPa
1fd40 67 65 72 29 29 2d 3e 70 4f 72 69 67 20 29 3b 0a  ger))->pOrig );.
1fd50 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1fd60 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50  !((PgHistory *)P
1fd70 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20  GHDR_TO_HIST(p, 
1fd80 70 50 61 67 65 72 29 29 2d 3e 70 53 74 6d 74 20  pPager))->pStmt 
1fd90 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  );.        conti
1fda0 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  nue;.      }..  
1fdb0 20 20 20 20 70 48 69 73 74 20 3d 20 50 47 48 44      pHist = PGHD
1fdc0 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61  R_TO_HIST(p, pPa
1fdd0 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
1fde0 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a  pHist->pOrig ){.
1fdf0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50          memcpy(P
1fe00 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c  GHDR_TO_DATA(p),
1fe10 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70   pHist->pOrig, p
1fe20 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1fe30 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  ;.        PAGERT
1fe40 52 41 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d  RACE3("ROLLBACK-
1fe50 50 41 47 45 20 25 64 20 6f 66 20 25 64 5c 6e 22  PAGE %d of %d\n"
1fe60 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  , p->pgno, PAGER
1fe70 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
1fe80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1fe90 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 50    PAGERTRACE3("P
1fea0 41 47 45 20 25 64 20 69 73 20 63 6c 65 61 6e 20  AGE %d is clean 
1feb0 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e  on %d\n", p->pgn
1fec0 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  o, PAGERID(pPage
1fed0 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r));.      }.   
1fee0 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28     clearHistory(
1fef0 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70 2d  pHist);.      p-
1ff00 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
1ff10 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d    p->inJournal =
1ff20 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 53   0;.      p->inS
1ff30 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tmt = 0;.      p
1ff40 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 2d  ->pPrevStmt = p-
1ff50 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a  >pNextStmt = 0;.
1ff60 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1ff70 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20  ->xReiniter ){. 
1ff80 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78         pPager->x
1ff90 52 65 69 6e 69 74 65 72 28 70 2c 20 70 50 61 67  Reiniter(p, pPag
1ffa0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1ffb0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1ffc0 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
1ffd0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
1ffe0 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  >pStmt = 0;.    
1fff0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
20000 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
20010 69 7a 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74  ize;.    pager_t
20020 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50  runcate_cache(pP
20030 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
20040 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
20050 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
20060 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
20070 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ED;.    return S
20080 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
20090 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64 69   if( !pPager->di
200a0 72 74 79 43 61 63 68 65 20 7c 7c 20 21 70 50 61  rtyCache || !pPa
200b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
200c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
200d0 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
200e0 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  on(pPager);.    
200f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
20100 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
20110 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  rCode && pPager-
20120 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
20130 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28  _FULL ){.    if(
20140 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
20150 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
20160 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70  ){.      pager_p
20170 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
20180 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  0);.    }.    re
20190 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
201a0 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Code;.  }.  if( 
201b0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 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 69 6e 74 20 72 63 32 3b 0a 20 20  .    int rc2;.  
201e0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
201f0 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29  yback(pPager, 0)
20200 3b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65  ;.    rc2 = page
20210 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
20220 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  n(pPager);.    i
20230 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20240 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
20250 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  c2;.    }.  }els
20260 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  e{.    rc = page
20270 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
20280 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  r, 0);.  }.  /* 
20290 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
202a0 65 72 29 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  er); */.  pPager
202b0 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a  ->dbSize = -1;..
202c0 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
202d0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61   occurs during a
202e0 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61   ROLLBACK, we ca
202f0 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73  n no longer trus
20300 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a  t the pager.  **
20310 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20   cache. So call 
20320 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e  pager_error() on
20330 20 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20   the way out to 
20340 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a  make any error .
20350 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e    ** persistent.
20360 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70  .  */.  return p
20370 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
20380 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  r, rc);.}../*.**
20390 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
203a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
203b0 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64  e is opened read
203c0 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46  -only.  Return F
203d0 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64  ALSE.** if the d
203e0 61 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74  atabase is (in t
203f0 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e  heory) writable.
20400 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
20410 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 50  agerIsreadonly(P
20420 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
20430 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
20440 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a  readOnly;.}../*.
20450 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
20460 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
20470 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2e  es to the pager.
20480 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
20490 61 67 65 72 52 65 66 63 6f 75 6e 74 28 50 61 67  agerRefcount(Pag
204a0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
204b0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 52  eturn pPager->nR
204c0 65 66 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  ef;.}..#ifdef SQ
204d0 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20  LITE_TEST./*.** 
204e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
204f0 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
20500 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
20510 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69  ly..*/.int *sqli
20520 74 65 33 50 61 67 65 72 53 74 61 74 73 28 50 61  te3PagerStats(Pa
20530 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
20540 73 74 61 74 69 63 20 69 6e 74 20 61 5b 31 31 5d  static int a[11]
20550 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61 67 65  ;.  a[0] = pPage
20560 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20  r->nRef;.  a[1] 
20570 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b  = pPager->nPage;
20580 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61 67 65 72  .  a[2] = pPager
20590 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d  ->mxPage;.  a[3]
205a0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
205b0 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67  e;.  a[4] = pPag
205c0 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35  er->state;.  a[5
205d0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  ] = pPager->errC
205e0 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50  ode;.  a[6] = pP
205f0 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b  ager->nHit;.  a[
20600 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69  7] = pPager->nMi
20610 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 30 3b 20  ss;.  a[8] = 0; 
20620 20 2f 2a 20 55 73 65 64 20 74 6f 20 62 65 20 70   /* Used to be p
20630 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a  Pager->nOvfl */.
20640 20 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d    a[9] = pPager-
20650 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20  >nRead;.  a[10] 
20660 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  = pPager->nWrite
20670 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a  ;.  return a;.}.
20680 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65  #endif../*.** Se
20690 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
206a0 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a  rollback point..
206b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
206c0 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  ne should be cal
206d0 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 72 61  led with the tra
206e0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
206f0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e   already.** open
20700 2e 20 20 41 20 6e 65 77 20 73 74 61 74 65 6d 65  .  A new stateme
20710 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72  nt journal is cr
20720 65 61 74 65 64 20 74 68 61 74 20 63 61 6e 20 62  eated that can b
20730 65 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61  e used to rollba
20740 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66  ck.** changes of
20750 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f   a single SQL co
20760 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20 6c  mmand within a l
20770 61 72 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f  arger transactio
20780 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
20790 33 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28  3PagerStmtBegin(
207a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
207b0 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
207c0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d  rt( !pPager->stm
207d0 74 49 6e 55 73 65 20 29 3b 0a 20 20 61 73 73 65  tInUse );.  asse
207e0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
207f0 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
20800 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
20810 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29  ger->dbSize>=0 )
20820 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28  ;.  PAGERTRACE2(
20830 22 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e  "STMT-BEGIN %d\n
20840 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
20850 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  r));.  if( MEMDB
20860 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
20870 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20  stmtInUse = 1;. 
20880 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53     pPager->stmtS
20890 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
208a0 53 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  Size;.    return
208b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
208c0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a    if( !pPager->j
208d0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
208e0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
208f0 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20  toopen = 1;.    
20900 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
20910 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
20920 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20930 70 65 6e 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  pen );.  pPager-
20940 3e 61 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74  >aInStmt = sqlit
20950 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d  eMalloc( pPager-
20960 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b  >dbSize/8 + 1 );
20970 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
20980 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20  InStmt==0 ){.   
20990 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63   /* sqlite3OsLoc
209a0 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48  k(pPager->fd, SH
209b0 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a 20  ARED_LOCK); */. 
209c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
209d0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e  _NOMEM;.  }.#ifn
209e0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 72 63 20  def NDEBUG.  rc 
209f0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
20a00 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
20a10 20 26 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53   &pPager->stmtJS
20a20 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ize);.  if( rc )
20a30 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e   goto stmt_begin
20a40 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73 73 65 72  _failed;.  asser
20a50 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  t( pPager->stmtJ
20a60 53 69 7a 65 20 3d 3d 20 70 50 61 67 65 72 2d 3e  Size == pPager->
20a70 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 23 65  journalOff );.#e
20a80 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e 73  ndif.  pPager->s
20a90 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65  tmtJSize = pPage
20aa0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
20ab0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
20ac0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
20ad0 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  ze;.  pPager->st
20ae0 6d 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20  mtHdrOff = 0;.  
20af0 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75  pPager->stmtCksu
20b00 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
20b10 6d 49 6e 69 74 3b 0a 20 20 69 66 28 20 21 70 50  mInit;.  if( !pP
20b20 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29  ager->stmtOpen )
20b30 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
20b40 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  e3PagerOpentemp(
20b50 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a  &pPager->stfd);.
20b60 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
20b70 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69  o stmt_begin_fai
20b80 6c 65 64 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  led;.    pPager-
20b90 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a 20  >stmtOpen = 1;. 
20ba0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e     pPager->stmtN
20bb0 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  Rec = 0;.  }.  p
20bc0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
20bd0 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 1;.  return S
20be0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74  QLITE_OK;. .stmt
20bf0 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20  _begin_failed:. 
20c00 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
20c10 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Stmt ){.    sqli
20c20 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61  teFree(pPager->a
20c30 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 70 50 61  InStmt);.    pPa
20c40 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30  ger->aInStmt = 0
20c50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
20c60 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  c;.}../*.** Comm
20c70 69 74 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a  it a statement..
20c80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
20c90 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 50 61  gerStmtCommit(Pa
20ca0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
20cb0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
20cc0 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 67 48  InUse ){.    PgH
20cd0 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b  dr *pPg, *pNext;
20ce0 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32  .    PAGERTRACE2
20cf0 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64  ("STMT-COMMIT %d
20d00 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
20d10 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ger));.    if( !
20d20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 73  MEMDB ){.      s
20d30 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
20d40 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20  ger->stfd, 0);. 
20d50 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f       /* sqlite3O
20d60 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
20d70 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a 20  ->stfd, 0); */. 
20d80 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
20d90 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
20da0 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   );.      pPager
20db0 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  ->aInStmt = 0;. 
20dc0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 50 67     }.    for(pPg
20dd0 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20  =pPager->pStmt; 
20de0 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b  pPg; pPg=pNext){
20df0 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70  .      pNext = p
20e00 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20  Pg->pNextStmt;. 
20e10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
20e20 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20  ->inStmt );.    
20e30 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20    pPg->inStmt = 
20e40 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  0;.      pPg->pP
20e50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70  revStmt = pPg->p
20e60 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20  NextStmt = 0;.  
20e70 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
20e80 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f  .        PgHisto
20e90 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
20ea0 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
20eb0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
20ec0 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74  sqliteFree(pHist
20ed0 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  ->pStmt);.      
20ee0 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
20ef0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
20f00 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  }.    pPager->st
20f10 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  mtNRec = 0;.    
20f20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
20f30 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
20f40 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  r->pStmt = 0;.  
20f50 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  }.  pPager->stmt
20f60 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20  Autoopen = 0;.  
20f70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
20f80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
20f90 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 2e  ack a statement.
20fa0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
20fb0 61 67 65 72 53 74 6d 74 52 6f 6c 6c 62 61 63 6b  agerStmtRollback
20fc0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
20fd0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
20fe0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
20ff0 73 65 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54  se ){.    PAGERT
21000 52 41 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c  RACE2("STMT-ROLL
21010 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45  BACK %d\n", PAGE
21020 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
21030 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
21040 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b       PgHdr *pPg;
21050 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70  .      for(pPg=p
21060 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50  Pager->pStmt; pP
21070 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
21080 74 53 74 6d 74 29 7b 0a 20 20 20 20 20 20 20 20  tStmt){.        
21090 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
210a0 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
210b0 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
210c0 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74         if( pHist
210d0 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
210e0 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44       memcpy(PGHD
210f0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
21100 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50  pHist->pStmt, pP
21110 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
21120 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
21130 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74  eFree(pHist->pSt
21140 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  mt);.          p
21150 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Hist->pStmt = 0;
21160 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21170 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
21180 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
21190 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20  ->stmtSize;.    
211a0 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
211b0 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a  _cache(pPager);.
211c0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
211d0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
211e0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
211f0 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28  r_stmt_playback(
21200 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
21210 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
21220 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65 72  tmtCommit(pPager
21230 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
21240 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
21250 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
21260 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a  mtAutoopen = 0;.
21270 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
21280 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
21290 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   full pathname o
212a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
212b0 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
212c0 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ar *sqlite3Pager
212d0 46 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a  Filename(Pager *
212e0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
212f0 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  n pPager->zFilen
21300 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ame;.}../*.** Re
21310 74 75 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f  turn the directo
21320 72 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ry of the databa
21330 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  se file..*/.cons
21340 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50  t char *sqlite3P
21350 61 67 65 72 44 69 72 6e 61 6d 65 28 50 61 67 65  agerDirname(Page
21360 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
21370 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69  turn pPager->zDi
21380 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  rectory;.}../*.*
21390 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
213a0 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
213b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
213c0 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
213d0 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e  qlite3PagerJourn
213e0 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  alname(Pager *pP
213f0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
21400 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
21410 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
21420 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28  n true if fsync(
21430 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61  ) calls are disa
21440 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61  bled for this pa
21450 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  ger.  Return FAL
21460 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29  SE.** if fsync()
21470 73 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e  s are executed n
21480 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  ormally..*/.int 
21490 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
214a0 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
214b0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
214c0 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23  er->noSync;.}..#
214d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
214e0 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74  _CODEC./*.** Set
214f0 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74   the codec for t
21500 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69  his pager.*/.voi
21510 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
21520 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20  tCodec(.  Pager 
21530 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20  *pPager,.  void 
21540 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a  *(*xCodec)(void*
21550 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
21560 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63  ,.  void *pCodec
21570 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d  Arg.){.  pPager-
21580 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63  >xCodec = xCodec
21590 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64  ;.  pPager->pCod
215a0 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72  ecArg = pCodecAr
215b0 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  g;.}.#endif..#if
215c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
215d0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
215e0 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20  * Move the page 
215f0 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 44  identified by pD
21600 61 74 61 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  ata to location 
21610 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65  pgno in the file
21620 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d  . .**.** There m
21630 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65  ust be no refere
21640 6e 63 65 73 20 74 6f 20 74 68 65 20 63 75 72 72  nces to the curr
21650 65 6e 74 20 70 61 67 65 20 70 67 6e 6f 2e 20 49  ent page pgno. I
21660 66 20 63 75 72 72 65 6e 74 20 70 61 67 65 0a 2a  f current page.*
21670 2a 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c  * pgno is not al
21680 72 65 61 64 79 20 69 6e 20 74 68 65 20 72 6f 6c  ready in the rol
21690 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69  lback journal, i
216a0 74 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e  t is not written
216b0 20 74 68 65 72 65 20 62 79 0a 2a 2a 20 62 79 20   there by.** by 
216c0 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 54 68  this routine. Th
216d0 65 20 73 61 6d 65 20 61 70 70 6c 69 65 73 20 74  e same applies t
216e0 6f 20 74 68 65 20 70 61 67 65 20 70 44 61 74 61  o the page pData
216f0 20 72 65 66 65 72 73 20 74 6f 20 6f 6e 20 65 6e   refers to on en
21700 74 72 79 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72  try to.** this r
21710 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  outine..**.** Re
21720 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
21730 70 61 67 65 20 72 65 66 65 72 65 64 20 74 6f 20  page refered to 
21740 62 79 20 70 44 61 74 61 20 72 65 6d 61 69 6e 20  by pData remain 
21750 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20  valid. Updating 
21760 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61  any.** meta-data
21770 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
21780 20 70 61 67 65 20 70 44 61 74 61 20 28 69 2e 65   page pData (i.e
21790 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e  . data stored in
217a0 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74 65   the nExtra byte
217b0 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  s.** allocated a
217c0 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70 61  long with the pa
217d0 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70 6f  ge) is the respo
217e0 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
217f0 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41   caller..**.** A
21800 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
21810 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65 6e  t be active when
21820 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
21830 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64   called. It used
21840 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72   to be.** requir
21850 65 64 20 74 68 61 74 20 61 20 73 74 61 74 65 6d  ed that a statem
21860 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
21870 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20  was not active, 
21880 62 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63  but this restric
21890 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e  tion.** has been
218a0 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45   removed (CREATE
218b0 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20   INDEX needs to 
218c0 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68 65 6e  move a page when
218d0 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20   a statement.** 
218e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
218f0 63 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73  ctive)..*/.int s
21900 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
21910 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
21920 72 2c 20 44 62 50 61 67 65 20 2a 70 50 67 2c 20  r, DbPage *pPg, 
21930 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
21940 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 0a 20 20  Hdr *pPgOld; .  
21950 69 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65  int h;.  Pgno ne
21960 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a  edSyncPgno = 0;.
21970 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
21980 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 50 41 47  nRef>0 );..  PAG
21990 45 52 54 52 41 43 45 35 28 22 4d 4f 56 45 20 25  ERTRACE5("MOVE %
219a0 64 20 70 61 67 65 20 25 64 20 28 6e 65 65 64 53  d page %d (needS
219b0 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f  ync=%d) moves to
219c0 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50   %d\n", .      P
219d0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
219e0 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e  pPg->pgno, pPg->
219f0 6e 65 65 64 53 79 6e 63 2c 20 70 67 6e 6f 29 3b  needSync, pgno);
21a00 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4d 4f 56  .  IOTRACE(("MOV
21a10 45 20 25 70 20 25 64 20 25 64 5c 6e 22 2c 20 70  E %p %d %d\n", p
21a20 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
21a30 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 69 66 28 20  , pgno))..  if( 
21a40 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  pPg->needSync ){
21a50 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e  .    needSyncPgn
21a60 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  o = pPg->pgno;. 
21a70 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
21a80 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  inJournal );.   
21a90 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69   assert( pPg->di
21aa0 72 74 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72  rty );.    asser
21ab0 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
21ac0 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ync );.  }..  /*
21ad0 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d   Unlink pPg from
21ae0 20 69 74 27 73 20 68 61 73 68 2d 63 68 61 69 6e   it's hash-chain
21af0 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68   */.  unlinkHash
21b00 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50  Chain(pPager, pP
21b10 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  g);..  /* If the
21b20 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20   cache contains 
21b30 61 20 70 61 67 65 20 77 69 74 68 20 70 61 67 65  a page with page
21b40 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65  -number pgno, re
21b50 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f  move it.  ** fro
21b60 6d 20 69 74 27 73 20 68 61 73 68 20 63 68 61 69  m it's hash chai
21b70 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20  n. Also, if the 
21b80 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77  PgHdr.needSync w
21b90 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a  as set for .  **
21ba0 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72   page pgno befor
21bb0 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65  e the 'move' ope
21bc0 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73  ration, it needs
21bd0 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20   to be retained 
21be0 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61  .  ** for the pa
21bf0 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a  ge moved there..
21c00 20 20 2a 2f 0a 20 20 70 50 67 4f 6c 64 20 3d 20    */.  pPgOld = 
21c10 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
21c20 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
21c30 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20  ( pPgOld ){.    
21c40 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e  assert( pPgOld->
21c50 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 75  nRef==0 );.    u
21c60 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70  nlinkHashChain(p
21c70 50 61 67 65 72 2c 20 70 50 67 4f 6c 64 29 3b 0a  Pager, pPgOld);.
21c80 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50      makeClean(pP
21c90 67 4f 6c 64 29 3b 0a 20 20 20 20 69 66 28 20 70  gOld);.    if( p
21ca0 50 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e 63 20  PgOld->needSync 
21cb0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
21cc0 20 70 50 67 4f 6c 64 2d 3e 69 6e 4a 6f 75 72 6e   pPgOld->inJourn
21cd0 61 6c 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  al );.      pPg-
21ce0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a  >inJournal = 1;.
21cf0 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
21d00 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 61  ync = 1;.      a
21d10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
21d20 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 7d  eedSync );.    }
21d30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e 67  .  }..  /* Chang
21d40 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  e the page numbe
21d50 72 20 66 6f 72 20 70 50 67 20 61 6e 64 20 69 6e  r for pPg and in
21d60 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65  sert it into the
21d70 20 6e 65 77 20 68 61 73 68 2d 63 68 61 69 6e 2e   new hash-chain.
21d80 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 67   */.  assert( pg
21d90 6e 6f 21 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e  no!=0 );.  pPg->
21da0 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68  pgno = pgno;.  h
21db0 20 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67 65   = pgno & (pPage
21dc0 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 69  r->nHash-1);.  i
21dd0 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  f( pPager->aHash
21de0 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73 73 65 72  [h] ){.    asser
21df0 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  t( pPager->aHash
21e00 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d  [h]->pPrevHash==
21e10 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
21e20 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76  >aHash[h]->pPrev
21e30 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 7d 0a  Hash = pPg;.  }.
21e40 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
21e50 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68   = pPager->aHash
21e60 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  [h];.  pPager->a
21e70 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20  Hash[h] = pPg;. 
21e80 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20   pPg->pPrevHash 
21e90 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65 44 69 72 74  = 0;..  makeDirt
21ea0 79 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72  y(pPg);.  pPager
21eb0 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31  ->dirtyCache = 1
21ec0 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e  ;..  if( needSyn
21ed0 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20  cPgno ){.    /* 
21ee0 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20  If needSyncPgno 
21ef0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
21f00 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
21f10 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a  le needs to be .
21f20 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20      ** sync()ed 
21f30 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20  before any data 
21f40 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61  is written to da
21f50 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 67 65  tabase file page
21f60 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20   needSyncPgno.. 
21f70 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c     ** Currently,
21f80 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65 78   no such page ex
21f90 69 73 74 73 20 69 6e 20 74 68 65 20 70 61 67 65  ists in the page
21fa0 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a  -cache and the .
21fb0 20 20 20 20 2a 2a 20 50 61 67 65 72 2e 61 49 6e      ** Pager.aIn
21fc0 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68 61 73 20  Journal bit has 
21fd0 62 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e  been set. This n
21fe0 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64  eeds to be remed
21ff0 69 65 64 20 62 79 20 6c 6f 61 64 69 6e 67 0a 20  ied by loading. 
22000 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69     ** the page i
22010 6e 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61  nto the pager-ca
22020 63 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20  che and setting 
22030 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
22040 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a  nc flag..    **.
22050 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74      ** The sqlit
22060 65 33 50 61 67 65 72 47 65 74 28 29 20 63 61 6c  e3PagerGet() cal
22070 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20  l may cause the 
22080 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e  journal to sync.
22090 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20   So make.    ** 
220a0 73 75 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e  sure the Pager.n
220b0 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
220c0 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a  set too..    */.
220d0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
220e0 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20  PgHdr *pPgHdr;. 
220f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
22100 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20  r->needSync );. 
22110 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
22120 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
22130 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70  needSyncPgno, &p
22140 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20  PgHdr);.    if( 
22150 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
22160 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
22170 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
22180 3d 20 31 3b 0a 20 20 20 20 70 50 67 48 64 72 2d  = 1;.    pPgHdr-
22190 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
221a0 20 20 20 70 50 67 48 64 72 2d 3e 69 6e 4a 6f 75     pPgHdr->inJou
221b0 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 6d 61  rnal = 1;.    ma
221c0 6b 65 44 69 72 74 79 28 70 50 67 48 64 72 29 3b  keDirty(pPgHdr);
221d0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
221e0 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a  rUnref(pPgHdr);.
221f0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
22200 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
22210 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
22220 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
22230 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 73 70   data for the sp
22240 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f  ecified page..*/
22250 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
22260 67 65 72 47 65 74 44 61 74 61 28 44 62 50 61 67  gerGetData(DbPag
22270 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72  e *pPg){.  retur
22280 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  n PGHDR_TO_DATA(
22290 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pPg);.}../*.** R
222a0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
222b0 74 6f 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78  to the Pager.nEx
222c0 74 72 61 20 62 79 74 65 73 20 6f 66 20 22 65 78  tra bytes of "ex
222d0 74 72 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61  tra" space .** a
222e0 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77  llocated along w
222f0 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65  ith the specifie
22300 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20  d page..*/.void 
22310 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  *sqlite3PagerGet
22320 45 78 74 72 61 28 44 62 50 61 67 65 20 2a 70 50  Extra(DbPage *pP
22330 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
22340 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
22350 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61  r;.  return (pPa
22360 67 65 72 3f 50 47 48 44 52 5f 54 4f 5f 45 58 54  ger?PGHDR_TO_EXT
22370 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 3a  RA(pPg, pPager):
22380 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  0);.}../*.** Get
22390 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67  /set the locking
223a0 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70  -mode for this p
223b0 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20  ager. Parameter 
223c0 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
223d0 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f  e.** of PAGER_LO
223e0 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c  CKINGMODE_QUERY,
223f0 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
22400 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a  DE_NORMAL or .**
22410 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
22420 44 45 5f 45 58 43 4c 55 53 49 56 45 2e 20 49 66  DE_EXCLUSIVE. If
22430 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 69   the parameter i
22440 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68  s not _QUERY, th
22450 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e  en.** the lockin
22460 67 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f  g-mode is set to
22470 20 74 68 65 20 76 61 6c 75 65 20 73 70 65 63 69   the value speci
22480 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fied..**.** The 
22490 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69  returned value i
224a0 73 20 65 69 74 68 65 72 20 50 41 47 45 52 5f 4c  s either PAGER_L
224b0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
224c0 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f  L or.** PAGER_LO
224d0 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
224e0 49 56 45 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  IVE, indicating 
224f0 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73  the current (pos
22500 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a  sibly updated).*
22510 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a  * locking-mode..
22520 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
22530 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50  gerLockingMode(P
22540 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
22550 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65  t eMode){.  asse
22560 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52  rt( eMode==PAGER
22570 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45  _LOCKINGMODE_QUE
22580 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  RY.            |
22590 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  | eMode==PAGER_L
225a0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
225b0 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  L.            ||
225c0 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
225d0 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
225e0 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IVE );.  assert(
225f0 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
22600 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20  DE_QUERY<0 );.  
22610 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
22620 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
22630 3e 3d 30 20 26 26 20 50 41 47 45 52 5f 4c 4f 43  >=0 && PAGER_LOC
22640 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
22650 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 65  VE>=0 );.  if( e
22660 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70 50 61 67  Mode>=0 && !pPag
22670 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
22680 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c      pPager->excl
22690 75 73 69 76 65 4d 6f 64 65 20 3d 20 65 4d 6f 64  usiveMode = eMod
226a0 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
226b0 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 65 78 63  (int)pPager->exc
226c0 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 23  lusiveMode;.}..#
226d0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
226e0 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
226f0 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
22700 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
22710 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
22720 6f 66 20 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b  of the file lock
22730 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
22740 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74  ager..** The ret
22750 75 72 6e 20 76 61 6c 75 65 20 69 73 20 6f 6e 65  urn value is one
22760 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41   of NO_LOCK, SHA
22770 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56  RED_LOCK, RESERV
22780 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44  ED_LOCK,.** PEND
22790 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43  ING_LOCK, or EXC
227a0 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a  LUSIVE_LOCK..*/.
227b0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
227c0 4c 6f 63 6b 73 74 61 74 65 28 50 61 67 65 72 20  Lockstate(Pager 
227d0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
227e0 72 6e 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  rn sqlite3OsLock
227f0 53 74 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64  State(pPager->fd
22800 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
22810 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
22820 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c  ./*.** Print a l
22830 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65  isting of all re
22840 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 61  ferenced pages a
22850 6e 64 20 74 68 65 69 72 20 72 65 66 20 63 6f 75  nd their ref cou
22860 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
22870 74 65 33 50 61 67 65 72 52 65 66 64 75 6d 70 28  te3PagerRefdump(
22880 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
22890 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
228a0 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
228b0 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
228c0 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
228d0 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66     if( pPg->nRef
228e0 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  <=0 ) continue;.
228f0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
22900 50 72 69 6e 74 66 28 22 50 41 47 45 20 25 33 64  Printf("PAGE %3d
22910 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64   addr=%p nRef=%d
22920 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67  \n", .       pPg
22930 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f  ->pgno, PGHDR_TO
22940 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d  _DATA(pPg), pPg-
22950 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65  >nRef);.  }.}.#e
22960 6e 64 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  ndif..#endif /* 
22970 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
22980 49 4f 20 2a 2f 0a                                IO */.